OpenGL学习(八) 纹理初步

来源:互联网 发布:atmega128p单片机 编辑:程序博客网 时间:2024/06/04 22:46
// Pyramid.cpp// OpenGL SuperBible, Chapter 5// Demonstrates Texture mapping a pyramid// Program by Richard S. Wright Jr.#include <GLTools.h>// OpenGL toolkit#include <GLMatrixStack.h>#include <GLFrame.h>#include <GLFrustum.h>#include <GLBatch.h>#include <GLGeometryTransform.h>#include <math.h>#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endif/////////////////////////////////////////////////////////////////////////////////// An assortment of needed classesGLShaderManagershaderManager;GLMatrixStackmodelViewMatrix;GLMatrixStackprojectionMatrix;GLFramecameraFrame;GLFrame             objectFrame;GLFrustumviewFrustum;GLBatch             pyramidBatch;GLuint              textureID;GLGeometryTransformtransformPipeline;M3DMatrix44fshadowMatrix;void MakePyramid(GLBatch& pyramidBatch)    {pyramidBatch.Begin(GL_TRIANGLES, 18, 1);    // Bottom of pyramidpyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f);    pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);pyramidBatch.Vertex3f(1.0f, -1.0f, -1.0f);    pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f);pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f);    pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 0.0f, 1.0f);pyramidBatch.Vertex3f(-1.0f, -1.0f, 1.0f);    pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f);    pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f);pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f);pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f);    M3DVector3f vApex = { 0.0f, 1.0f, 0.0f };M3DVector3f vFrontLeft = { -1.0f, -1.0f, 1.0f };M3DVector3f vFrontRight = { 1.0f, -1.0f, 1.0f };M3DVector3f vBackLeft = { -1.0f, -1.0f, -1.0f };M3DVector3f vBackRight = { 1.0f, -1.0f, -1.0f };M3DVector3f n;// Front of Pyramidm3dFindNormal(n, vApex, vFrontLeft, vFrontRight);pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);pyramidBatch.Vertex3fv(vApex);// Apex    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3fv(vFrontLeft);// Front left corner    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);pyramidBatch.Vertex3fv(vFrontRight);// Front right corner        m3dFindNormal(n, vApex, vBackLeft, vFrontLeft);pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);pyramidBatch.Vertex3fv(vApex);// Apex    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);pyramidBatch.Vertex3fv(vBackLeft);// Back left cornerpyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3fv(vFrontLeft);// Front left corner    m3dFindNormal(n, vApex, vFrontRight, vBackRight);pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);pyramidBatch.Vertex3fv(vApex);// Apex    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);pyramidBatch.Vertex3fv(vFrontRight);// Front right corner    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3fv(vBackRight);// Back right cornder        m3dFindNormal(n, vApex, vBackRight, vBackLeft);pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f);pyramidBatch.Vertex3fv(vApex);// Apex    pyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f);pyramidBatch.Vertex3fv(vBackRight);// Back right cornderpyramidBatch.Normal3fv(n);pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f);pyramidBatch.Vertex3fv(vBackLeft);// Back left cornerpyramidBatch.End();}// Load a TGA as a 2D Texture. Completely initialize the statebool LoadTGATexture(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode){GLbyte *pBits;int nWidth, nHeight, nComponents;GLenum eFormat;// Read the texture bitspBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);if(pBits == NULL) return false;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);    free(pBits);        if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||        minFilter == GL_LINEAR_MIPMAP_NEAREST ||       minFilter == GL_NEAREST_MIPMAP_LINEAR ||       minFilter == GL_NEAREST_MIPMAP_NEAREST)        glGenerateMipmap(GL_TEXTURE_2D);    return true;}///////////////////////////////////////////////////////////////////////////////// This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks.void SetupRC(){    // Black background    glClearColor(0.7f, 0.7f, 0.7f, 1.0f );shaderManager.InitializeStockShaders();glEnable(GL_DEPTH_TEST);        glGenTextures(1, &textureID);    glBindTexture(GL_TEXTURE_2D, textureID);    LoadTGATexture("D:/CODE/Visual Studio/jinzita/stone.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);        MakePyramid(pyramidBatch);cameraFrame.MoveForward(-7.0f);    }///////////////////////////////////////////////////////////////////////////////// Cleanup... such as deleting texture objectsvoid ShutdownRC(void)    {    glDeleteTextures(1, &textureID);    }///////////////////////////////////////////////////////////////////////////////// Called to draw scenevoid RenderScene(void){        static GLfloat vLightPos [] = { 1.0f, 1.0f, 0.0f };    static GLfloat vWhite [] = { 1.0f, 1.0f, 1.0f, 1.0f };    // Clear the window with current clearing colorglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);modelViewMatrix.PushMatrix();M3DMatrix44f mCamera;cameraFrame.GetCameraMatrix(mCamera);modelViewMatrix.MultMatrix(mCamera);        M3DMatrix44f mObjectFrame;        objectFrame.GetMatrix(mObjectFrame);        modelViewMatrix.MultMatrix(mObjectFrame);        glBindTexture(GL_TEXTURE_2D, textureID);        shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,                                      transformPipeline.GetModelViewMatrix(),                                     transformPipeline.GetProjectionMatrix(),                                      vLightPos, vWhite, 0);        pyramidBatch.Draw();modelViewMatrix.PopMatrix();// Flush drawing commandsglutSwapBuffers();    }// Respond to arrow keys by moving the camera frame of referencevoid SpecialKeys(int key, int x, int y)    {if(key == GLUT_KEY_UP)objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);    if(key == GLUT_KEY_DOWN)objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);if(key == GLUT_KEY_LEFT)objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);    if(key == GLUT_KEY_RIGHT)objectFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);    glutPostRedisplay();    }///////////////////////////////////////////////////////////////////////////////// Window has changed size, or has just been created. In either case, we need// to use the window dimensions to set the viewport and the projection matrix.void ChangeSize(int w, int h){glViewport(0, 0, w, h);viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);}///////////////////////////////////////////////////////////////////////////////// Main entry point for GLUT based programsint main(int argc, char* argv[]){gltSetWorkingDirectory(argv[0]);glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);glutInitWindowSize(800, 600);glutCreateWindow("Pyramid");    glutReshapeFunc(ChangeSize);    glutSpecialFunc(SpecialKeys);    glutDisplayFunc(RenderScene);        GLenum err = glewInit();if (GLEW_OK != err) {fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));return 1;}SetupRC();glutMainLoop();        ShutdownRC();    return 0;}
纹理加载一直使用的是绝对路径,使用相对路径一直失败,不明原因,还去那个诸君指教。
tga文件在书中代码包里。


0 0
原创粉丝点击