标签:opengl
原文地址:
//////////////////////////////////////////////////////////////////////////////// // Filename: openglclass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _OPENGLCLASS_H_ #define _OPENGLCLASS_H_
///////////// // LINKING // ///////////// #pragma comment(lib, "opengl32.lib")
////////////// // INCLUDES // ////////////// #include <windows.h> #include <gl\gl.h> #include <math.h>
///////////// // DEFINES // ///////////// #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GL_ARRAY_BUFFER 0x8892 #define GL_STATIC_DRAW 0x88E4 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_TEXTURE0 0x84C0 #define GL_BGRA 0x80E1 #define GL_ELEMENT_ARRAY_BUFFER 0x8893
//////////////
// TYPEDEFS //
//////////////
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats,
                                                        int *piFormats, UINT *nNumFormats);
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
typedef void (APIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (APIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);
typedef void (APIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, ptrdiff_t size, const GLvoid *data, GLenum usage);
typedef void (APIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);
typedef GLuint (APIENTRY * PFNGLCREATEPROGRAMPROC) (void);
typedef GLuint (APIENTRY * PFNGLCREATESHADERPROC) (GLenum type);
typedef void (APIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);
typedef void (APIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);
typedef void (APIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
typedef void (APIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (APIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
typedef void (APIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
typedef GLint (APIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const char *name);
typedef void (APIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, char *infoLog);
typedef void (APIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, char *infoLog);
typedef void (APIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);
typedef void (APIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const char* *string, const GLint *length);
typedef void (APIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);
typedef void (APIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,
                                                        const GLvoid *pointer);
typedef void (APIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const char *name);
typedef GLint (APIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const char *name);
typedef void (APIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (APIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
typedef void (APIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);
typedef void (APIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
typedef void (APIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
typedef void (APIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);////////////////////////////////////////////////////////////////////////////////
// Class name: OpenGLClass
////////////////////////////////////////////////////////////////////////////////
class OpenGLClass
{
public:
 OpenGLClass();
 OpenGLClass(const OpenGLClass&);
 ~OpenGLClass();
 bool InitializeExtensions(HWND);
 bool InitializeOpenGL(HWND, int, int, float, float, bool);
 void Shutdown(HWND);
 void BeginScene(float, float, float, float);
 void EndScene();
 void GetWorldMatrix(float*);
 void GetProjectionMatrix(float*);
 void GetVideoCardInfo(char*);
 void BuildIdentityMatrix(float*);
 void BuildPerspectiveFovLHMatrix(float*, float, float, float, float);
 void MatrixRotationY(float*, float);
 void MatrixTranslation(float*, float, float, float);
 void MatrixMultiply(float*, float*, float*);
private:
 bool LoadExtensionList();
private:
 HDC m_deviceContext;
 HGLRC m_renderingContext;PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; float m_worldMatrix[16]; float m_projectionMatrix[16]; char m_videoCardDescription[128];
public: PFNGLATTACHSHADERPROC glAttachShader; PFNGLBINDBUFFERPROC glBindBuffer; PFNGLBINDVERTEXARRAYPROC glBindVertexArray; PFNGLBUFFERDATAPROC glBufferData; PFNGLCOMPILESHADERPROC glCompileShader; PFNGLCREATEPROGRAMPROC glCreateProgram; PFNGLCREATESHADERPROC glCreateShader; PFNGLDELETEBUFFERSPROC glDeleteBuffers; PFNGLDELETEPROGRAMPROC glDeleteProgram; PFNGLDELETESHADERPROC glDeleteShader; PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; PFNGLDETACHSHADERPROC glDetachShader; PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; PFNGLGENBUFFERSPROC glGenBuffers; PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; PFNGLGETPROGRAMIVPROC glGetProgramiv; PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; PFNGLGETSHADERIVPROC glGetShaderiv; PFNGLLINKPROGRAMPROC glLinkProgram; PFNGLSHADERSOURCEPROC glShaderSource; PFNGLUSEPROGRAMPROC glUseProgram; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; PFNGLACTIVETEXTUREPROC glActiveTexture; PFNGLUNIFORM1IPROC glUniform1i; PFNGLGENERATEMIPMAPPROC glGenerateMipmap; PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; PFNGLUNIFORM3FVPROC glUniform3fv; PFNGLUNIFORM4FVPROC glUniform4fv; }; #endif
//////////////////////////////////////////////////////////////////////////////// // Filename: openglclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "openglclass.h"
OpenGLClass::OpenGLClass()
{
 m_deviceContext = 0;
 m_renderingContext = 0;
}
OpenGLClass::OpenGLClass(const OpenGLClass& other)
{
}
OpenGLClass::~OpenGLClass()
{
}bool OpenGLClass::InitializeExtensions(HWND hwnd)
{
 HDC deviceContext;
 PIXELFORMATDESCRIPTOR pixelFormat;
 int error;
 HGLRC renderContext;
 bool result;
 // Get the device context for this window.
// 获得窗口设备上下文。
 deviceContext = GetDC(hwnd);
 if(!deviceContext)
 {
  return false;
 }
 // Set a temporary default pixel format.
// 设置默认的临时像素格式。
 error = SetPixelFormat(deviceContext, 1, &pixelFormat);
 if(error != 1)
 {
  return false;
 }
 // Create a temporary rendering context.
// 创建临时渲染上下文。
 renderContext = wglCreateContext(deviceContext);
 if(!renderContext)
 {
  return false;
 }
 // Set the temporary rendering context as the current rendering context for this window.
// 为窗口设置临时渲染上下文。
 error = wglMakeCurrent(deviceContext, renderContext);
 if(error != 1)
 {
  return false;
 }
 // Initialize the OpenGL extensions needed for this application.  Note that a temporary rendering context was needed to do so.
// 初始化程序需要的OpenGL扩展。
 result = LoadExtensionList();
 if(!result)
 {
  return false;
 }
 // Release the temporary rendering context now that the extensions have been loaded.
// 释放临时渲染上下文,现在扩展已经被加载。
 wglMakeCurrent(NULL, NULL);
 wglDeleteContext(renderContext);
 renderContext = NULL;
 // Release the device context for this window.
// 释放窗口设备上下文。
 ReleaseDC(hwnd, deviceContext);
 deviceContext = 0;
 return true;
}bool OpenGLClass::InitializeOpenGL(HWND hwnd, int screenWidth, int screenHeight, float screenDepth, float screenNear, bool vsync)
{
 int attributeListInt[19];
 int pixelFormat[1];
 unsigned int formatCount;
 int result;
 PIXELFORMATDESCRIPTOR pixelFormatDescriptor;
 int attributeList[5];
 float fieldOfView, screenAspect;
 char *vendorString, *rendererString;
 // Get the device context for this window.
 m_deviceContext = GetDC(hwnd);
 if(!m_deviceContext)
 {
  return false;
 }
 
 // Support for OpenGL rendering.
 attributeListInt[0] = WGL_SUPPORT_OPENGL_ARB;
 attributeListInt[1] = TRUE;
 // Support for rendering to a window.
 attributeListInt[2] = WGL_DRAW_TO_WINDOW_ARB;
 attributeListInt[3] = TRUE;
 // Support for hardware acceleration.
 attributeListInt[4] = WGL_ACCELERATION_ARB;
 attributeListInt[5] = WGL_FULL_ACCELERATION_ARB;
 // Support for 24bit color.
 attributeListInt[6] = WGL_COLOR_BITS_ARB;
 attributeListInt[7] = 24;
 // Support for 24 bit depth buffer.
 attributeListInt[8] = WGL_DEPTH_BITS_ARB;
 attributeListInt[9] = 24;
 // Support for double buffer.
 attributeListInt[10] = WGL_DOUBLE_BUFFER_ARB;
 attributeListInt[11] = TRUE;
 // Support for swapping front and back buffer.
 attributeListInt[12] = WGL_SWAP_METHOD_ARB;
 attributeListInt[13] = WGL_SWAP_EXCHANGE_ARB;
 // Support for the RGBA pixel type.
 attributeListInt[14] = WGL_PIXEL_TYPE_ARB;
 attributeListInt[15] = WGL_TYPE_RGBA_ARB;
 // Support for a 8 bit stencil buffer.
 attributeListInt[16] = WGL_STENCIL_BITS_ARB;
 attributeListInt[17] = 8;
 // Null terminate the attribute list.
 attributeListInt[18] = 0;
 // Query for a pixel format that fits the attributes we want.
 result = wglChoosePixelFormatARB(m_deviceContext, attributeListInt, NULL, 1, pixelFormat, &formatCount);
 if(result != 1)
 {
  return false;
 }
 // If the video card/display can handle our desired pixel format then we set it as the current one.
 result = SetPixelFormat(m_deviceContext, pixelFormat[0], &pixelFormatDescriptor);
 if(result != 1)
 {
  return false;
 }
 // Set the 4.0 version of OpenGL in the attribute list.
 attributeList[0] = WGL_CONTEXT_MAJOR_VERSION_ARB;
 attributeList[1] = 4;
 attributeList[2] = WGL_CONTEXT_MINOR_VERSION_ARB;
 attributeList[3] = 0;
 // Null terminate the attribute list.
 attributeList[4] = 0;
 // Create a OpenGL 4.0 rendering context.
 m_renderingContext = wglCreateContextAttribsARB(m_deviceContext, 0, attributeList);
 if(m_renderingContext == NULL)
 {
  return false;
 }
 // Set the rendering context to active.
 result = wglMakeCurrent(m_deviceContext, m_renderingContext);
 if(result != 1)
 {
  return false;
 }
 
 // Set the depth buffer to be entirely cleared to 1.0 values.
 glClearDepth(1.0f);
 // Enable depth testing.
 glEnable(GL_DEPTH_TEST);
 
 // Set the polygon winding to front facing for the left handed system.
 glFrontFace(GL_CW);
 // Enable back face culling.
 glEnable(GL_CULL_FACE);
 glCullFace(GL_BACK);
 // Initialize the world/model matrix to the identity matrix.
 BuildIdentityMatrix(m_worldMatrix);
 // Set the field of view and screen aspect ratio.
 fieldOfView = 3.14159265358979323846f / 4.0f;
 screenAspect = (float)screenWidth / (float)screenHeight;
 // Build the perspective projection matrix.
 BuildPerspectiveFovLHMatrix(m_projectionMatrix, fieldOfView, screenAspect, screenNear, screenDepth);
 // Get the name of the video card.
 vendorString = (char*)glGetString(GL_VENDOR);
 rendererString = (char*)glGetString(GL_RENDERER);
 // Store the video card name in a class member variable so it can be retrieved later.
 strcpy_s(m_videoCardDescription, vendorString);
 strcat_s(m_videoCardDescription, " - ");
 strcat_s(m_videoCardDescription, rendererString);
 // Turn on or off the vertical sync depending on the input bool value.
 if(vsync)
 {
  result = wglSwapIntervalEXT(1);
 }
 else
 {
  result = wglSwapIntervalEXT(0);
 }
 // Check if vsync was set correctly.
 if(result != 1)
 {
  return false;
 }
 return true;
}void OpenGLClass::Shutdown(HWND hwnd)
{
 // Release the rendering context.
 if(m_renderingContext)
 {
  wglMakeCurrent(NULL, NULL);
  wglDeleteContext(m_renderingContext);
  m_renderingContext = 0;
 }
 // Release the device context.
 if(m_deviceContext)
 {
  ReleaseDC(hwnd, m_deviceContext);
  m_deviceContext = 0;
 }
 return;
}void OpenGLClass::BeginScene(float red, float green, float blue, float alpha)
{
 // Set the color to clear the screen to.
 glClearColor(red, green, blue, alpha);
 // Clear the screen and depth buffer.
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 return;
}
void OpenGLClass::EndScene()
{
 // Present the back buffer to the screen since rendering is complete.
 SwapBuffers(m_deviceContext);
 return;
}bool OpenGLClass::LoadExtensionList()
{
 // Load the OpenGL extensions that this application will be using.
 wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
 if(!wglChoosePixelFormatARB)
 {
  return false;
 }
 wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
 if(!wglCreateContextAttribsARB)
 {
  return false;
 }
 wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
 if(!wglSwapIntervalEXT)
 {
  return false;
 }
 glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
 if(!glAttachShader)
 {
  return false;
 }
 glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
 if(!glBindBuffer)
 {
  return false;
 }
 glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray");
 if(!glBindVertexArray)
 {
  return false;
 }
 glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
 if(!glBufferData)
 {
  return false;
 }
 glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
 if(!glCompileShader)
 {
  return false;
 }
 glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
 if(!glCreateProgram)
 {
  return false;
 }
 glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
 if(!glCreateShader)
 {
  return false;
 }
 glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
 if(!glDeleteBuffers)
 {
  return false;
 }
 glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
 if(!glDeleteProgram)
 {
  return false;
 }
 glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
 if(!glDeleteShader)
 {
  return false;
 }
 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glDeleteVertexArrays");
 if(!glDeleteVertexArrays)
 {
  return false;
 }
 glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
 if(!glDetachShader)
 {
  return false;
 }
 glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
 if(!glEnableVertexAttribArray)
 {
  return false;
 }
 glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
 if(!glGenBuffers)
 {
  return false;
 }
 glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays");
 if(!glGenVertexArrays)
 {
  return false;
 }
 glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation");
 if(!glGetAttribLocation)
 {
  return false;
 }
 glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");
 if(!glGetProgramInfoLog)
 {
  return false;
 }
 glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
 if(!glGetProgramiv)
 {
  return false;
 }
 glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
 if(!glGetShaderInfoLog)
 {
  return false;
 }
 glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
 if(!glGetShaderiv)
 {
  return false;
 }
 glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
 if(!glLinkProgram)
 {
  return false;
 }
 glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
 if(!glShaderSource)
 {
  return false;
 }
 glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
 if(!glUseProgram)
 {
  return false;
 }
 glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
 if(!glVertexAttribPointer)
 {
  return false;
 }
 glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)wglGetProcAddress("glBindAttribLocation");
 if(!glBindAttribLocation)
 {
  return false;
 }
 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
 if(!glGetUniformLocation)
 {
  return false;
 }
 glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv");
 if(!glUniformMatrix4fv)
 {
  return false;
 }
 glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture");
 if(!glActiveTexture)
 {
  return false;
 }
 glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
 if(!glUniform1i)
 {
  return false;
 }
 glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap");
 if(!glGenerateMipmap)
 {
  return false;
 }
 glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray");
 if(!glDisableVertexAttribArray)
 {
  return false;
 }
 glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv");
 if(!glUniform3fv)
 {
  return false;
 }
 glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv");
 if(!glUniform4fv)
 {
  return false;
 }
 return true;
}void OpenGLClass::GetWorldMatrix(float* matrix)
{
 matrix[0]  = m_worldMatrix[0];
 matrix[1]  = m_worldMatrix[1];
 matrix[2]  = m_worldMatrix[2];
 matrix[3]  = m_worldMatrix[3];
 matrix[4]  = m_worldMatrix[4];
 matrix[5]  = m_worldMatrix[5];
 matrix[6]  = m_worldMatrix[6];
 matrix[7]  = m_worldMatrix[7];
 matrix[8]  = m_worldMatrix[8];
 matrix[9]  = m_worldMatrix[9];
 matrix[10] = m_worldMatrix[10];
 matrix[11] = m_worldMatrix[11];
 matrix[12] = m_worldMatrix[12];
 matrix[13] = m_worldMatrix[13];
 matrix[14] = m_worldMatrix[14];
 matrix[15] = m_worldMatrix[15];
 return;
}
void OpenGLClass::GetProjectionMatrix(float* matrix)
{
 matrix[0]  = m_projectionMatrix[0];
 matrix[1]  = m_projectionMatrix[1];
 matrix[2]  = m_projectionMatrix[2];
 matrix[3]  = m_projectionMatrix[3];
 matrix[4]  = m_projectionMatrix[4];
 matrix[5]  = m_projectionMatrix[5];
 matrix[6]  = m_projectionMatrix[6];
 matrix[7]  = m_projectionMatrix[7];
 matrix[8]  = m_projectionMatrix[8];
 matrix[9]  = m_projectionMatrix[9];
 matrix[10] = m_projectionMatrix[10];
 matrix[11] = m_projectionMatrix[11];
 matrix[12] = m_projectionMatrix[12];
 matrix[13] = m_projectionMatrix[13];
 matrix[14] = m_projectionMatrix[14];
 matrix[15] = m_projectionMatrix[15];
 return;
}void OpenGLClass::GetVideoCardInfo(char* cardName)
{
 strcpy_s(cardName, 128, m_videoCardDescription);
 return;
}void OpenGLClass::BuildIdentityMatrix(float* matrix)
{
 matrix[0]  = 1.0f;
 matrix[1]  = 0.0f;
 matrix[2]  = 0.0f;
 matrix[3]  = 0.0f;
 matrix[4]  = 0.0f;
 matrix[5]  = 1.0f;
 matrix[6]  = 0.0f;
 matrix[7]  = 0.0f;
 matrix[8]  = 0.0f;
 matrix[9]  = 0.0f;
 matrix[10] = 1.0f;
 matrix[11] = 0.0f;
 matrix[12] = 0.0f;
 matrix[13] = 0.0f;
 matrix[14] = 0.0f;
 matrix[15] = 1.0f;
 return;
}void OpenGLClass::BuildPerspectiveFovLHMatrix(float* matrix, float fieldOfView, float screenAspect, float screenNear, float screenDepth)
{
 matrix[0]  = 1.0f / (screenAspect * tan(fieldOfView * 0.5f));
 matrix[1]  = 0.0f;
 matrix[2]  = 0.0f;
 matrix[3]  = 0.0f;
 matrix[4]  = 0.0f;
 matrix[5]  = 1.0f / tan(fieldOfView * 0.5f);
 matrix[6]  = 0.0f;
 matrix[7]  = 0.0f;
 matrix[8]  = 0.0f;
 matrix[9]  = 0.0f;
 matrix[10] = screenDepth / (screenDepth - screenNear);
 matrix[11] = 1.0f;
 matrix[12] = 0.0f;
 matrix[13] = 0.0f;
 matrix[14] = (-screenNear * screenDepth) / (screenDepth - screenNear);
 matrix[15] = 0.0f;
 return;
}void OpenGLClass::MatrixRotationY(float* matrix, float angle)
{
 matrix[0]  = cosf(angle);
 matrix[1]  = 0.0f;
 matrix[2]  = -sinf(angle);
 matrix[3]  = 0.0f;
 matrix[4]  = 0.0f;
 matrix[5]  = 1.0f;
 matrix[6]  = 0.0f;
 matrix[7]  = 0.0f;
 matrix[8]  = sinf(angle);
 matrix[9]  = 0.0f;
 matrix[10] = cosf(angle);
 matrix[11] = 0.0f;
 matrix[12] = 0.0f;
 matrix[13] = 0.0f;
 matrix[14] = 0.0f;
 matrix[15] = 1.0f;
 return;
}void OpenGLClass::MatrixTranslation(float* matrix, float x, float y, float z)
{
 matrix[0]  = 1.0f;
 matrix[1]  = 0.0f;
 matrix[2]  = 0.0f;
 matrix[3]  = 0.0f;
 matrix[4]  = 0.0f;
 matrix[5]  = 1.0f;
 matrix[6]  = 0.0f;
 matrix[7]  = 0.0f;
 matrix[8]  = 0.0f;
 matrix[9]  = 0.0f;
 matrix[10] = 1.0f;
 matrix[11] = 0.0f;
 matrix[12] = x;
 matrix[13] = y;
 matrix[14] = z;
 matrix[15] = 1.0f;
 return;
}void OpenGLClass::MatrixMultiply(float* result, float* matrix1, float* matrix2)
{
 result[0]  = (matrix1[0] * matrix2[0]) + (matrix1[1] * matrix2[4]) + (matrix1[2] * matrix2[8]) + (matrix1[3] * matrix2[12]);
 result[1]  = (matrix1[0] * matrix2[1]) + (matrix1[1] * matrix2[5]) + (matrix1[2] * matrix2[9]) + (matrix1[3] * matrix2[13]);
 result[2]  = (matrix1[0] * matrix2[2]) + (matrix1[1] * matrix2[6]) + (matrix1[2] * matrix2[10]) + (matrix1[3] * matrix2[14]);
 result[3]  = (matrix1[0] * matrix2[3]) + (matrix1[1] * matrix2[7]) + (matrix1[2] * matrix2[11]) + (matrix1[3] * matrix2[15]);
 result[4]  = (matrix1[4] * matrix2[0]) + (matrix1[5] * matrix2[4]) + (matrix1[6] * matrix2[8]) + (matrix1[7] * matrix2[12]);
 result[5]  = (matrix1[4] * matrix2[1]) + (matrix1[5] * matrix2[5]) + (matrix1[6] * matrix2[9]) + (matrix1[7] * matrix2[13]);
 result[6]  = (matrix1[4] * matrix2[2]) + (matrix1[5] * matrix2[6]) + (matrix1[6] * matrix2[10]) + (matrix1[7] * matrix2[14]);
 result[7]  = (matrix1[4] * matrix2[3]) + (matrix1[5] * matrix2[7]) + (matrix1[6] * matrix2[11]) + (matrix1[7] * matrix2[15]);
 result[8]  = (matrix1[8] * matrix2[0]) + (matrix1[9] * matrix2[4]) + (matrix1[10] * matrix2[8]) + (matrix1[11] * matrix2[12]);
 result[9]  = (matrix1[8] * matrix2[1]) + (matrix1[9] * matrix2[5]) + (matrix1[10] * matrix2[9]) + (matrix1[11] * matrix2[13]);
 result[10] = (matrix1[8] * matrix2[2]) + (matrix1[9] * matrix2[6]) + (matrix1[10] * matrix2[10]) + (matrix1[11] * matrix2[14]);
 result[11] = (matrix1[8] * matrix2[3]) + (matrix1[9] * matrix2[7]) + (matrix1[10] * matrix2[11]) + (matrix1[11] * matrix2[15]);
 result[12] = (matrix1[12] * matrix2[0]) + (matrix1[13] * matrix2[4]) + (matrix1[14] * matrix2[8]) + (matrix1[15] * matrix2[12]);
 result[13] = (matrix1[12] * matrix2[1]) + (matrix1[13] * matrix2[5]) + (matrix1[14] * matrix2[9]) + (matrix1[15] * matrix2[13]);
 result[14] = (matrix1[12] * matrix2[2]) + (matrix1[13] * matrix2[6]) + (matrix1[14] * matrix2[10]) + (matrix1[15] * matrix2[14]);
 result[15] = (matrix1[12] * matrix2[3]) + (matrix1[13] * matrix2[7]) + (matrix1[14] * matrix2[11]) + (matrix1[15] * matrix2[15]);
 return;
}////////////////////////////////////////////////////////////////////////////////
// Filename: systemclass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _SYSTEMCLASS_H_
#define _SYSTEMCLASS_H_
///////////////////////////////
// PRE-PROCESSING DIRECTIVES //
///////////////////////////////
#define WIN32_LEAN_AND_MEAN
//////////////
// INCLUDES //
//////////////
#include <windows.h>
///////////////////////
// MY CLASS INCLUDES //
///////////////////////
#include "openglclass.h"
#include "inputclass.h"
#include "graphicsclass.h"
////////////////////////////////////////////////////////////////////////////////
// Class name: SystemClass
////////////////////////////////////////////////////////////////////////////////
class SystemClass
{
public:
 SystemClass();
 SystemClass(const SystemClass&);
 ~SystemClass();
 bool Initialize();
 void Shutdown();
 void Run();
 LRESULT CALLBACK MessageHandler(HWND, UINT, WPARAM, LPARAM);
private:
 bool Frame();
 bool InitializeWindows(OpenGLClass*, int&, int&);
 void ShutdownWindows();
private:
 LPCWSTR m_applicationName;
 HINSTANCE m_hinstance;
 HWND m_hwnd;
 OpenGLClass* m_OpenGL;
 InputClass* m_Input;
 GraphicsClass* m_Graphics;
};
/////////////////////////
// FUNCTION PROTOTYPES //
/////////////////////////
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/////////////
// GLOBALS //
/////////////
static SystemClass* ApplicationHandle = 0;
#endif
////////////////////////////////////////////////////////////////////////////////
// Filename: systemclass.cpp
////////////////////////////////////////////////////////////////////////////////
#include "systemclass.h"
SystemClass::SystemClass()
{
 m_OpenGL = 0;
 m_Input = 0;
 m_Graphics = 0;
}
SystemClass::SystemClass(const SystemClass& other)
{
}
SystemClass::~SystemClass()
{
}
bool SystemClass::Initialize()
{
 int screenWidth, screenHeight;
 bool result;
 // Initialize the width and height of the screen to zero.
 screenWidth = 0;
 screenHeight = 0;
 // Create the OpenGL object.
 m_OpenGL = new OpenGLClass;
 if(!m_OpenGL)
 {
  return false;
 }
 // Create the window the application will be using and also initialize OpenGL.
 result = InitializeWindows(m_OpenGL, screenWidth, screenHeight);
 if(!result)
 {
  MessageBox(m_hwnd, L"Could not initialize the window.", L"Error", MB_OK);
  return false;
 }
 
 // Create the input object.  This object will be used to handle reading the input from the user.
 m_Input = new InputClass;
 if(!m_Input)
 {
  return false;
 }
 // Initialize the input object.
 m_Input->Initialize();
 // Create the graphics object.  This object will handle rendering all the graphics for this application.
 m_Graphics = new GraphicsClass;
 if(!m_Graphics)
 {
  return false;
 }
 // Initialize the graphics object.
 result = m_Graphics->Initialize(m_OpenGL, m_hwnd);
 if(!result)
 {
  return false;
 }
 return true;
}
void SystemClass::Shutdown()
{
 // Release the graphics object.
 if(m_Graphics)
 {
  m_Graphics->Shutdown();
  delete m_Graphics;
  m_Graphics = 0;
 }
 // Release the input object.
 if(m_Input)
 {
  delete m_Input;
  m_Input = 0;
 }// Release the OpenGL object.
 if(m_OpenGL)
 {
  m_OpenGL->Shutdown(m_hwnd);
  delete m_OpenGL;
  m_OpenGL = 0;
 }
 // Shutdown the window.
 ShutdownWindows();
 
 return;
}
void SystemClass::Run()
{
 MSG msg;
 bool done, result;
 // Initialize the message structure.
 ZeroMemory(&msg, sizeof(MSG));
 
 // Loop until there is a quit message from the window or the user.
 done = false;
 while(!done)
 {
  // Handle the windows messages.
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
  // If windows signals to end the application then exit out.
  if(msg.message == WM_QUIT)
  {
   done = true;
  }
  else
  {
   // Otherwise do the frame processing.
   result = Frame();
   if(!result)
   {
    done = true;
   }
  }
 }
 return;
}
bool SystemClass::Frame()
{
 bool result;
 // Check if the user pressed escape and wants to exit the application.
 if(m_Input->IsKeyDown(VK_ESCAPE))
 {
  return false;
 }
 // Do the frame processing for the graphics object.
 result = m_Graphics->Frame();
 if(!result)
 {
  return false;
 }
 return true;
}
LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
 switch(umsg)
 {
  // Check if a key has been pressed on the keyboard.
  case WM_KEYDOWN:
  {
   // If a key is pressed send it to the input object so it can record that state.
   m_Input->KeyDown((unsigned int)wparam);
   return 0;
  }
  // Check if a key has been released on the keyboard.
  case WM_KEYUP:
  {
   // If a key is released then send it to the input object so it can unset the state for that key.
   m_Input->KeyUp((unsigned int)wparam);
   return 0;
  }
  // Any other messages send to the default message handler as our application won't make use of them.
  default:
  {
   return DefWindowProc(hwnd, umsg, wparam, lparam);
  }
 }
}
bool SystemClass::InitializeWindows(OpenGLClass* OpenGL, int& screenWidth, int& screenHeight)
{
 WNDCLASSEX wc;
 DEVMODE dmScreenSettings;
 int posX, posY;
 bool result;
 // Get an external pointer to this object.
 ApplicationHandle = this;
 // Get the instance of this application.
 m_hinstance = GetModuleHandle(NULL);
 // Give the application a name.
 m_applicationName = L"Engine";
 // Setup the windows class with default settings.
 wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
 wc.lpfnWndProc   = WndProc;
 wc.cbClsExtra    = 0;
 wc.cbWndExtra    = 0;
 wc.hInstance     = m_hinstance;
 wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO);
 wc.hIconSm       = wc.hIcon;
 wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 wc.lpszMenuName  = NULL;
 wc.lpszClassName = m_applicationName;
 wc.cbSize        = sizeof(WNDCLASSEX);
 
 // Register the window class.
 RegisterClassEx(&wc);
 // Create a temporary window for the OpenGL extension setup.
 m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_applicationName, m_applicationName, WS_POPUP,
    0, 0, 640, 480, NULL, NULL, m_hinstance, NULL);
 if(m_hwnd == NULL)
 {
  return false;
 }
 // Don't show the window.
 ShowWindow(m_hwnd, SW_HIDE);
 // Initialize a temporary OpenGL window and load the OpenGL extensions.
 result = OpenGL->InitializeExtensions(m_hwnd);
 if(!result)
 {
  MessageBox(m_hwnd, L"Could not initialize the OpenGL extensions.", L"Error", MB_OK);
  return false;
 }
 // Release the temporary window now that the extensions have been initialized.
 DestroyWindow(m_hwnd);
 m_hwnd = NULL;
 // Determine the resolution of the clients desktop screen.
 screenWidth  = GetSystemMetrics(SM_CXSCREEN);
 screenHeight = GetSystemMetrics(SM_CYSCREEN);
 // Setup the screen settings depending on whether it is running in full screen or in windowed mode.
 if(FULL_SCREEN)
 {
  // If full screen set the screen to maximum size of the users desktop and 32bit.
  memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
  dmScreenSettings.dmSize       = sizeof(dmScreenSettings);
  dmScreenSettings.dmPelsWidth  = (unsigned long)screenWidth;
  dmScreenSettings.dmPelsHeight = (unsigned long)screenHeight;
  dmScreenSettings.dmBitsPerPel = 32;
  dmScreenSettings.dmFields     = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
  // Change the display settings to full screen.
  ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
  // Set the position of the window to the top left corner.
  posX = posY = 0;
 }
 else
 {
  // If windowed then set it to 800x600 resolution.
  screenWidth  = 800;
  screenHeight = 600;
  // Place the window in the middle of the screen.
  posX = (GetSystemMetrics(SM_CXSCREEN) - screenWidth)  / 2;
  posY = (GetSystemMetrics(SM_CYSCREEN) - screenHeight) / 2;
 }
 // Create the window with the screen settings and get the handle to it.
 m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_applicationName, m_applicationName, WS_POPUP,
    posX, posY, screenWidth, screenHeight, NULL, NULL, m_hinstance, NULL);
 if(m_hwnd == NULL)
 {
  return false;
 }// Initialize OpenGL now that the window has been created.
 result = m_OpenGL->InitializeOpenGL(m_hwnd, screenWidth, screenHeight, SCREEN_DEPTH, SCREEN_NEAR, VSYNC_ENABLED);
 if(!result)
 {
  MessageBox(m_hwnd, L"Could not initialize OpenGL, check if video card supports OpenGL 4.0.", L"Error", MB_OK);
  return false;
 }
 // Bring the window up on the screen and set it as main focus.
 ShowWindow(m_hwnd, SW_SHOW);
 SetForegroundWindow(m_hwnd);
 SetFocus(m_hwnd);
 // Hide the mouse cursor.
 ShowCursor(false);
 return true;
}
void SystemClass::ShutdownWindows()
{
 // Show the mouse cursor.
 ShowCursor(true);
 // Fix the display settings if leaving full screen mode.
 if(FULL_SCREEN)
 {
  ChangeDisplaySettings(NULL, 0);
 }
 // Remove the window.
 DestroyWindow(m_hwnd);
 m_hwnd = NULL;
 // Remove the application instance.
 UnregisterClass(m_applicationName, m_hinstance);
 m_hinstance = NULL;
 // Release the pointer to this class.
 ApplicationHandle = NULL;
 return;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
 switch(umessage)
 {
  // Check if the window is being closed.
  case WM_CLOSE:
  {
   PostQuitMessage(0);
   return 0;
  }
  // All other messages pass to the message handler in the system class.
  default:
  {
   return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam);
  }
 }
}////////////////////////////////////////////////////////////////////////////////
// Filename: graphicsclass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _GRAPHICSCLASS_H_
#define _GRAPHICSCLASS_H_
///////////////////////
// MY CLASS INCLUDES //
///////////////////////
#include "openglclass.h"
/////////////
// GLOBALS //
/////////////
const bool FULL_SCREEN = false;
const bool VSYNC_ENABLED = true;
const float SCREEN_DEPTH = 1000.0f;
const float SCREEN_NEAR = 0.1f;
////////////////////////////////////////////////////////////////////////////////
// Class name: GraphicsClass
////////////////////////////////////////////////////////////////////////////////
class GraphicsClass
{
public:
 GraphicsClass();
 GraphicsClass(const GraphicsClass&);
 ~GraphicsClass();
 bool Initialize(OpenGLClass*, HWND);
 void Shutdown();
 bool Frame();
private:
 bool Render();
private:
We now have an OpenGL class object.
 OpenGLClass* m_OpenGL;
};
#endif//////////////////////////////////////////////////////////////////////////////// // Filename: graphicsclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "graphicsclass.h"
GraphicsClass::GraphicsClass()
{
 m_OpenGL = 0;
}
GraphicsClass::GraphicsClass(const GraphicsClass& other)
{
}
GraphicsClass::~GraphicsClass()
{
}bool GraphicsClass::Initialize(OpenGLClass* OpenGL, HWND hwnd)
{
 // Store a pointer to the OpenGL class object.
 m_OpenGL = OpenGL;
 return true;
}void GraphicsClass::Shutdown()
{
 // Release the pointer to the OpenGL class object.
 m_OpenGL = 0;
 return;
}bool GraphicsClass::Frame()
{
 bool result;
 // Render the graphics scene.
 result = Render();
 if(!result)
 {
  return false;
 }
 return true;
}bool GraphicsClass::Render()
{
 // Clear the buffers to begin the scene.
 m_OpenGL->BeginScene(0.5f, 0.5f, 0.5f, 1.0f);
 // Present the rendered scene to the screen.
 m_OpenGL->EndScene();
 return true;
}标签:opengl
原文地址:http://blog.csdn.net/weyson/article/details/46821795