原文地址:
//////////////////////////////////////////////////////////////////////////////// // Filename: textureclass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _TEXTURECLASS_H_ #define _TEXTURECLASS_H_ ////////////// // INCLUDES // ////////////// #include <stdio.h> /////////////////////// // MY CLASS INCLUDES // /////////////////////// #include "openglclass.h" //////////////////////////////////////////////////////////////////////////////// // Class name: TextureClass //////////////////////////////////////////////////////////////////////////////// class TextureClass { private:
struct TargaHeader { unsigned char data1[12]; unsigned short width; unsigned short height; unsigned char bpp; unsigned char data2; }; public: TextureClass(); TextureClass(const TextureClass&); ~TextureClass();
bool Initialize(OpenGLClass*, char*, unsigned int, bool); void Shutdown(); private:
bool LoadTarga(OpenGLClass*, char*, unsigned int, bool);
private:
bool loaded; unsigned int m_textureID; }; #endif
//////////////////////////////////////////////////////////////////////////////// // Filename: textureclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "textureclass.h"
TextureClass::TextureClass() { loaded = false; } TextureClass::TextureClass(const TextureClass& other) { } TextureClass::~TextureClass() { }
bool TextureClass::Initialize(OpenGLClass* OpenGL, char* filename, unsigned int textureUnit, bool wrap) { bool result; // Load the targa file. result = LoadTarga(OpenGL, filename, textureUnit, wrap); if(!result) { return false; } return true; }
void TextureClass::Shutdown() { // If the texture was loaded then make sure to release it on shutdown. if(loaded) { glDeleteTextures(1, &m_textureID); loaded = false; } return; }
bool TextureClass::LoadTarga(OpenGLClass* OpenGL, char* filename, unsigned int textureUnit, bool wrap) { int error, width, height, bpp, imageSize; FILE* filePtr; unsigned int count; TargaHeader targaFileHeader; unsigned char* targaImage;
// Open the targa file for reading in binary. error = fopen_s(&filePtr, filename, "rb"); if(error != 0) { return false; } // Read in the file header. count = fread(&targaFileHeader, sizeof(TargaHeader), 1, filePtr); if(count != 1) { return false; } // Get the important information from the header. width = (int)targaFileHeader.width; height = (int)targaFileHeader.height; bpp = (int)targaFileHeader.bpp; // Check that it is 32 bit and not 24 bit. if(bpp != 32) { return false; } // Calculate the size of the 32 bit image data. imageSize = width * height * 4; // Allocate memory for the targa image data. targaImage = new unsigned char[imageSize]; if(!targaImage) { return false; } // Read in the targa image data. count = fread(targaImage, 1, imageSize, filePtr); if(count != imageSize) { return false; } // Close the file. error = fclose(filePtr); if(error != 0) { return false; }
// Set the unique texture unit in which to store the data. // 设置唯一纹理单元来保存数据。 OpenGL->glActiveTexture(GL_TEXTURE0 + textureUnit); // Generate an ID for the texture. glGenTextures(1, &m_textureID); // Bind the texture as a 2D texture. glBindTexture(GL_TEXTURE_2D, m_textureID); // Load the image data into the texture unit. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, targaImage);
// Set the texture color to either wrap around or clamp to the edge. if(wrap) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } // Set the texture filtering. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Generate mipmaps for the texture. OpenGL->glGenerateMipmap(GL_TEXTURE_2D); // Release the targa image data. delete [] targaImage; targaImage = 0; // Set that the texture is loaded. loaded = true; return true; }
//////////////////////////////////////////////////////////////////////////////// // Filename: texture.vs //////////////////////////////////////////////////////////////////////////////// #version 400 ///////////////////// // INPUT VARIABLES // ///////////////////// in vec3 inputPosition; in vec2 inputTexCoord; ////////////////////// // OUTPUT VARIABLES // ////////////////////// out vec2 texCoord; /////////////////////// // UNIFORM VARIABLES // /////////////////////// uniform mat4 worldMatrix; uniform mat4 viewMatrix; uniform mat4 projectionMatrix; //////////////////////////////////////////////////////////////////////////////// // Vertex Shader //////////////////////////////////////////////////////////////////////////////// void main(void) { // Calculate the position of the vertex against the world, view, and projection matrices. gl_Position = worldMatrix * vec4(inputPosition, 1.0f); gl_Position = viewMatrix * gl_Position; gl_Position = projectionMatrix * gl_Position; // Store the texture coordinates for the pixel shader. texCoord = inputTexCoord; }
//////////////////////////////////////////////////////////////////////////////// // Filename: texture.ps //////////////////////////////////////////////////////////////////////////////// #version 400 ///////////////////// // INPUT VARIABLES // ///////////////////// in vec2 texCoord; ////////////////////// // OUTPUT VARIABLES // ////////////////////// out vec4 outputColor; /////////////////////// // UNIFORM VARIABLES // /////////////////////// uniform sampler2D shaderTexture; //////////////////////////////////////////////////////////////////////////////// // Pixel Shader //////////////////////////////////////////////////////////////////////////////// void main(void) { vec4 textureColor; // Sample the pixel color from the texture using the sampler at this texture coordinate location. textureColor = texture(shaderTexture, texCoord); outputColor = textureColor; }
//////////////////////////////////////////////////////////////////////////////// // Filename: textureshaderclass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _TEXTURESHADERCLASS_H_ #define _TEXTURESHADERCLASS_H_ ////////////// // INCLUDES // ////////////// #include <fstream> using namespace std; /////////////////////// // MY CLASS INCLUDES // /////////////////////// #include "openglclass.h" //////////////////////////////////////////////////////////////////////////////// // Class name: TextureShaderClass //////////////////////////////////////////////////////////////////////////////// class TextureShaderClass { public: TextureShaderClass(); TextureShaderClass(const TextureShaderClass&); ~TextureShaderClass(); bool Initialize(OpenGLClass*, HWND); void Shutdown(OpenGLClass*); void SetShader(OpenGLClass*); bool SetShaderParameters(OpenGLClass*, float*, float*, float*, int); private: bool InitializeShader(char*, char*, OpenGLClass*, HWND); char* LoadShaderSourceFile(char*); void OutputShaderErrorMessage(OpenGLClass*, HWND, unsigned int, char*); void OutputLinkerErrorMessage(OpenGLClass*, HWND, unsigned int); void ShutdownShader(OpenGLClass*); private: unsigned int m_vertexShader; unsigned int m_fragmentShader; unsigned int m_shaderProgram; }; #endif
//////////////////////////////////////////////////////////////////////////////// // Filename: textureshaderclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "textureshaderclass.h" TextureShaderClass::TextureShaderClass() { } TextureShaderClass::TextureShaderClass(const TextureShaderClass& other) { } TextureShaderClass::~TextureShaderClass() { } bool TextureShaderClass::Initialize(OpenGLClass* OpenGL, HWND hwnd) { bool result; The new texture.vs and texture.ps GLSL files are loaded for this shader. // Initialize the vertex and pixel shaders. result = InitializeShader("../Engine/texture.vs", "../Engine/texture.ps", OpenGL, hwnd); if(!result) { return false; } return true; } void TextureShaderClass::Shutdown(OpenGLClass* OpenGL) { // Shutdown the vertex and pixel shaders as well as the related objects. ShutdownShader(OpenGL); return; } void TextureShaderClass::SetShader(OpenGLClass* OpenGL) { // Install the shader program as part of the current rendering state. OpenGL->glUseProgram(m_shaderProgram); return; } bool TextureShaderClass::InitializeShader(char* vsFilename, char* fsFilename, OpenGLClass* OpenGL, HWND hwnd) { const char* vertexShaderBuffer; const char* fragmentShaderBuffer; int status; // Load the vertex shader source file into a text buffer. vertexShaderBuffer = LoadShaderSourceFile(vsFilename); if(!vertexShaderBuffer) { return false; } // Load the fragment shader source file into a text buffer. fragmentShaderBuffer = LoadShaderSourceFile(fsFilename); if(!fragmentShaderBuffer) { return false; } // Create a vertex and fragment shader object. m_vertexShader = OpenGL->glCreateShader(GL_VERTEX_SHADER); m_fragmentShader = OpenGL->glCreateShader(GL_FRAGMENT_SHADER); // Copy the shader source code strings into the vertex and fragment shader objects. OpenGL->glShaderSource(m_vertexShader, 1, &vertexShaderBuffer, NULL); OpenGL->glShaderSource(m_fragmentShader, 1, &fragmentShaderBuffer, NULL); // Release the vertex and fragment shader buffers. delete [] vertexShaderBuffer; vertexShaderBuffer = 0; delete [] fragmentShaderBuffer; fragmentShaderBuffer = 0; // Compile the shaders. OpenGL->glCompileShader(m_vertexShader); OpenGL->glCompileShader(m_fragmentShader); // Check to see if the vertex shader compiled successfully. OpenGL->glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, &status); if(status != 1) { // If it did not compile then write the syntax error message out to a text file for review. OutputShaderErrorMessage(OpenGL, hwnd, m_vertexShader, vsFilename); return false; } // Check to see if the fragment shader compiled successfully. OpenGL->glGetShaderiv(m_fragmentShader, GL_COMPILE_STATUS, &status); if(status != 1) { // If it did not compile then write the syntax error message out to a text file for review. OutputShaderErrorMessage(OpenGL, hwnd, m_fragmentShader, fsFilename); return false; } // Create a shader program object. m_shaderProgram = OpenGL->glCreateProgram(); // Attach the vertex and fragment shader to the program object. OpenGL->glAttachShader(m_shaderProgram, m_vertexShader); OpenGL->glAttachShader(m_shaderProgram, m_fragmentShader); The second shader input variable has been changed to match the input in the vertex shader for inputTexCoord. // Bind the shader input variables. OpenGL->glBindAttribLocation(m_shaderProgram, 0, "inputPosition"); OpenGL->glBindAttribLocation(m_shaderProgram, 1, "inputTexCoord"); // Link the shader program. OpenGL->glLinkProgram(m_shaderProgram); // Check the status of the link. OpenGL->glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, &status); if(status != 1) { // If it did not link then write the syntax error message out to a text file for review. OutputLinkerErrorMessage(OpenGL, hwnd, m_shaderProgram); return false; } return true; } char* TextureShaderClass::LoadShaderSourceFile(char* filename) { ifstream fin; int fileSize; char input; char* buffer; // Open the shader source file. fin.open(filename); // If it could not open the file then exit. if(fin.fail()) { return 0; } // Initialize the size of the file. fileSize = 0; // Read the first element of the file. fin.get(input); // Count the number of elements in the text file. while(!fin.eof()) { fileSize++; fin.get(input); } // Close the file for now. fin.close(); // Initialize the buffer to read the shader source file into. buffer = new char[fileSize+1]; if(!buffer) { return 0; } // Open the shader source file again. fin.open(filename); // Read the shader text file into the buffer as a block. fin.read(buffer, fileSize); // Close the file. fin.close(); // Null terminate the buffer. buffer[fileSize] = '\0'; return buffer; } void TextureShaderClass::OutputShaderErrorMessage(OpenGLClass* OpenGL, HWND hwnd, unsigned int shaderId, char* shaderFilename) { int logSize, i; char* infoLog; ofstream fout; wchar_t newString[128]; unsigned int error, convertedChars; // Get the size of the string containing the information log for the failed shader compilation message. OpenGL->glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &logSize); // Increment the size by one to handle also the null terminator. logSize++; // Create a char buffer to hold the info log. infoLog = new char[logSize]; if(!infoLog) { return; } // Now retrieve the info log. OpenGL->glGetShaderInfoLog(shaderId, logSize, NULL, infoLog); // Open a file to write the error message to. fout.open("shader-error.txt"); // Write out the error message. for(i=0; i<logSize; i++) { fout << infoLog[i]; } // Close the file. fout.close(); // Convert the shader filename to a wide character string. error = mbstowcs_s(&convertedChars, newString, 128, shaderFilename, 128); if(error != 0) { return; } // Pop a message up on the screen to notify the user to check the text file for compile errors. MessageBox(hwnd, L"Error compiling shader. Check shader-error.txt for message.", newString, MB_OK); return; } void TextureShaderClass::OutputLinkerErrorMessage(OpenGLClass* OpenGL, HWND hwnd, unsigned int programId) { int logSize, i; char* infoLog; ofstream fout; // Get the size of the string containing the information log for the failed shader compilation message. OpenGL->glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &logSize); // Increment the size by one to handle also the null terminator. logSize++; // Create a char buffer to hold the info log. infoLog = new char[logSize]; if(!infoLog) { return; } // Now retrieve the info log. OpenGL->glGetProgramInfoLog(programId, logSize, NULL, infoLog); // Open a file to write the error message to. fout.open("linker-error.txt"); // Write out the error message. for(i=0; i<logSize; i++) { fout << infoLog[i]; } // Close the file. fout.close(); // Pop a message up on the screen to notify the user to check the text file for linker errors. MessageBox(hwnd, L"Error compiling linker. Check linker-error.txt for message.", L"Linker Error", MB_OK); return; } void TextureShaderClass::ShutdownShader(OpenGLClass* OpenGL) { // Detach the vertex and fragment shaders from the program. OpenGL->glDetachShader(m_shaderProgram, m_vertexShader); OpenGL->glDetachShader(m_shaderProgram, m_fragmentShader); // Delete the vertex and fragment shaders. OpenGL->glDeleteShader(m_vertexShader); OpenGL->glDeleteShader(m_fragmentShader); // Delete the shader program. OpenGL->glDeleteProgram(m_shaderProgram); return; }
bool TextureShaderClass::SetShaderParameters(OpenGLClass* OpenGL, float* worldMatrix, float* viewMatrix, float* projectionMatrix, int textureUnit) { unsigned int location; // Set the world matrix in the vertex shader. location = OpenGL->glGetUniformLocation(m_shaderProgram, "worldMatrix"); if(location == -1) { return false; } OpenGL->glUniformMatrix4fv(location, 1, false, worldMatrix); // Set the view matrix in the vertex shader. location = OpenGL->glGetUniformLocation(m_shaderProgram, "viewMatrix"); if(location == -1) { return false; } OpenGL->glUniformMatrix4fv(location, 1, false, viewMatrix); // Set the projection matrix in the vertex shader. location = OpenGL->glGetUniformLocation(m_shaderProgram, "projectionMatrix"); if(location == -1) { return false; } OpenGL->glUniformMatrix4fv(location, 1, false, projectionMatrix);
// Set the texture in the pixel shader to use the data from the first texture unit. location = OpenGL->glGetUniformLocation(m_shaderProgram, "shaderTexture"); if(location == -1) { return false; } OpenGL->glUniform1i(location, textureUnit); return true; }
//////////////////////////////////////////////////////////////////////////////// // Filename: modelclass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _MODELCLASS_H_ #define _MODELCLASS_H_ The TextureClass header is now included in the ModelClass header. /////////////////////// // MY CLASS INCLUDES // /////////////////////// #include "textureclass.h" //////////////////////////////////////////////////////////////////////////////// // Class name: ModelClass //////////////////////////////////////////////////////////////////////////////// class ModelClass { private: The VertexType has replaced the color component with texture coordinates. struct VertexType { float x, y, z; float tu, tv; }; public: ModelClass(); ModelClass(const ModelClass&); ~ModelClass(); The Initialize function now takes new inputs related to the texture. bool Initialize(OpenGLClass*, char*, unsigned int, bool); void Shutdown(OpenGLClass*); void Render(OpenGLClass*); private: bool InitializeBuffers(OpenGLClass*); void ShutdownBuffers(OpenGLClass*); void RenderBuffers(OpenGLClass*); ModelClass also now has both a private LoadTexture and ReleaseTexture for loading and releasing the texture that will be used to render this model. ModelClass增加了两个私有方法LoadTexture和ReleaseTexture,用来加载和释放模型用的纹理资源。 bool LoadTexture(OpenGLClass*, char*, unsigned int, bool); void ReleaseTexture(); private: int m_vertexCount, m_indexCount; unsigned int m_vertexArrayId, m_vertexBufferId, m_indexBufferId;
TextureClass* m_Texture; }; #endif
//////////////////////////////////////////////////////////////////////////////// // Filename: modelclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "modelclass.h"
ModelClass::ModelClass() { m_Texture = 0; } ModelClass::ModelClass(const ModelClass& other) { } ModelClass::~ModelClass() { }
bool ModelClass::Initialize(OpenGLClass* OpenGL, char* textureFilename, unsigned int textureUnit, bool wrap) { bool result; // Initialize the vertex and index buffer that hold the geometry for the triangle. result = InitializeBuffers(OpenGL); if(!result) { return false; }
// Load the texture for this model. result = LoadTexture(OpenGL, textureFilename, textureUnit, wrap); if(!result) { return false; } return true; }
void ModelClass::Shutdown(OpenGLClass* OpenGL) { // Release the texture used for this model. ReleaseTexture(); // Release the vertex and index buffers. ShutdownBuffers(OpenGL); return; } void ModelClass::Render(OpenGLClass* OpenGL) { // Put the vertex and index buffers on the graphics pipeline to prepare them for drawing. RenderBuffers(OpenGL); return; } bool ModelClass::InitializeBuffers(OpenGLClass* OpenGL) { VertexType* vertices; unsigned int* indices; // Set the number of vertices in the vertex array. m_vertexCount = 3; // Set the number of indices in the index array. m_indexCount = 3; // Create the vertex array. vertices = new VertexType[m_vertexCount]; if(!vertices) { return false; } // Create the index array. indices = new unsigned int[m_indexCount]; if(!indices) { return false; }
// Load the vertex array with data. // Bottom left. vertices[0].x = -1.0f; // Position. vertices[0].y = -1.0f; vertices[0].z = 0.0f; vertices[0].tu = 0.0f; // Texture coordinates. vertices[0].tv = 0.0f; // Top middle. vertices[1].x = 0.0f; // Position. vertices[1].y = 1.0f; vertices[1].z = 0.0f; vertices[1].tu = 0.5f; // Texture coordinates. vertices[1].tv = 1.0f; // Bottom right. vertices[2].x = 1.0f; // Position. vertices[2].y = -1.0f; vertices[2].z = 0.0f; vertices[2].tu = 1.0f; // Texture coordinates. vertices[2].tv = 0.0f; // Load the index array with data. indices[0] = 0; // Bottom left. indices[1] = 1; // Top middle. indices[2] = 2; // Bottom right. // Allocate an OpenGL vertex array object. OpenGL->glGenVertexArrays(1, &m_vertexArrayId); // Bind the vertex array object to store all the buffers and vertex attributes we create here. OpenGL->glBindVertexArray(m_vertexArrayId); // Generate an ID for the vertex buffer. OpenGL->glGenBuffers(1, &m_vertexBufferId); // Bind the vertex buffer and load the vertex (position and texture) data into the vertex buffer. OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId); OpenGL->glBufferData(GL_ARRAY_BUFFER, m_vertexCount * sizeof(VertexType), vertices, GL_STATIC_DRAW);
// Enable the two vertex array attributes. OpenGL->glEnableVertexAttribArray(0); // Vertex position. OpenGL->glEnableVertexAttribArray(1); // Texture coordinates. // Specify the location and format of the position portion of the vertex buffer. OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId); OpenGL->glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(VertexType), 0);
// Specify the location and format of the texture coordinate portion of the vertex buffer. OpenGL->glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId); OpenGL->glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(VertexType), (unsigned char*)NULL + (3 * sizeof(float))); // Generate an ID for the index buffer. OpenGL->glGenBuffers(1, &m_indexBufferId); // Bind the index buffer and load the index data into it. OpenGL->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferId); OpenGL->glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indexCount* sizeof(unsigned int), indices, GL_STATIC_DRAW); // Now that the buffers have been loaded we can release the array data. delete [] vertices; vertices = 0; delete [] indices; indices = 0; return true; } void ModelClass::ShutdownBuffers(OpenGLClass* OpenGL) { // Disable the two vertex array attributes. OpenGL->glDisableVertexAttribArray(0); OpenGL->glDisableVertexAttribArray(1); // Release the vertex buffer. OpenGL->glBindBuffer(GL_ARRAY_BUFFER, 0); OpenGL->glDeleteBuffers(1, &m_vertexBufferId); // Release the index buffer. OpenGL->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); OpenGL->glDeleteBuffers(1, &m_indexBufferId); // Release the vertex array object. OpenGL->glBindVertexArray(0); OpenGL->glDeleteVertexArrays(1, &m_vertexArrayId); return; } void ModelClass::RenderBuffers(OpenGLClass* OpenGL) { // Bind the vertex array object that stored all the information about the vertex and index buffers. OpenGL->glBindVertexArray(m_vertexArrayId); // Render the vertex buffer using the index buffer. glDrawElements(GL_TRIANGLES, m_indexCount, GL_UNSIGNED_INT, 0); return; }
bool ModelClass::LoadTexture(OpenGLClass* OpenGL, char* textureFilename, unsigned int textureUnit, bool wrap) { bool result; // Create the texture object. m_Texture = new TextureClass; if(!m_Texture) { return false; } // Initialize the texture object. result = m_Texture->Initialize(OpenGL, textureFilename, textureUnit, wrap); if(!result) { return false; } return true; }
void ModelClass::ReleaseTexture() { // Release the texture object. if(m_Texture) { m_Texture->Shutdown(); delete m_Texture; m_Texture = 0; } return; }Graphicsclass.h
//////////////////////////////////////////////////////////////////////////////// // Filename: graphicsclass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _GRAPHICSCLASS_H_ #define _GRAPHICSCLASS_H_ /////////////////////// // MY CLASS INCLUDES // /////////////////////// #include "openglclass.h" #include "cameraclass.h" #include "modelclass.h"
#include "textureshaderclass.h" ///////////// // GLOBALS // ///////////// const bool FULL_SCREEN = true; 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: OpenGLClass* m_OpenGL; CameraClass* m_Camera; ModelClass* m_Model; A new TextureShaderClass private object has been added. TextureShaderClass* m_TextureShader; }; #endifGraphicsclass.cpp
//////////////////////////////////////////////////////////////////////////////// // Filename: graphicsclass.cpp //////////////////////////////////////////////////////////////////////////////// #include "graphicsclass.h"
GraphicsClass::GraphicsClass() { m_OpenGL = 0; m_Camera = 0; m_Model = 0; m_TextureShader = 0; } GraphicsClass::GraphicsClass(const GraphicsClass& other) { } GraphicsClass::~GraphicsClass() { } bool GraphicsClass::Initialize(OpenGLClass* OpenGL, HWND hwnd) { bool result; // Store a pointer to the OpenGL class object. m_OpenGL = OpenGL; // Create the camera object. m_Camera = new CameraClass; if(!m_Camera) { return false; } // Set the initial position of the camera. m_Camera->SetPosition(0.0f, 0.0f, -10.0f); // Create the model object. m_Model = new ModelClass; if(!m_Model) { return false; }
// Initialize the model object. result = m_Model->Initialize(m_OpenGL, "../Engine/data/test.tga", 0, true); if(!result) { MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK); return false; }
// Create the texture shader object. m_TextureShader = new TextureShaderClass; if(!m_TextureShader) { return false; } // Initialize the texture shader object. result = m_TextureShader->Initialize(m_OpenGL, hwnd); if(!result) { MessageBox(hwnd, L"Could not initialize the texture shader object.", L"Error", MB_OK); return false; } return true; } void GraphicsClass::Shutdown() { The TextureShaderClass object is also released in the Shutdown function. // Release the texture shader object. if(m_TextureShader) { m_TextureShader->Shutdown(m_OpenGL); delete m_TextureShader; m_TextureShader = 0; } // Release the model object. if(m_Model) { m_Model->Shutdown(m_OpenGL); delete m_Model; m_Model = 0; } // Release the camera object. if(m_Camera) { delete m_Camera; m_Camera = 0; } // 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() { float worldMatrix[16]; float viewMatrix[16]; float projectionMatrix[16]; // Clear the buffers to begin the scene. m_OpenGL->BeginScene(0.0f, 0.0f, 0.0f, 1.0f); // Generate the view matrix based on the camera's position. m_Camera->Render(); // Get the world, view, and projection matrices from the opengl and camera objects. m_OpenGL->GetWorldMatrix(worldMatrix); m_Camera->GetViewMatrix(viewMatrix); m_OpenGL->GetProjectionMatrix(projectionMatrix);
// Set the texture shader as the current shader program and set the matrices that it will use for rendering. m_TextureShader->SetShader(m_OpenGL); m_TextureShader->SetShaderParameters(m_OpenGL, worldMatrix, viewMatrix, projectionMatrix, 0); // Render the model using the texture shader. m_Model->Render(m_OpenGL); // Present the rendered scene to the screen. m_OpenGL->EndScene(); return true; }