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
- OpenGL学习(八) 纹理初步
- OpenGL学习(九)纹理初步
- OpenGL::纹理的初步应用
- OpenGL学习笔记(一) 纹理基础知识
- 学习OpenGL(七)纹理贴图
- OpenGL学习笔记:纹理
- OpenGL纹理学习总结
- OpenGL入门学习(八)
- OpenGL入门学习(八)
- OPENGL视频学习(八)
- OpenGL学习总结(八)
- OpenGL学习笔记(八)
- openGL之纹理贴图---openGL学习笔记(十三)
- Android OpenGL ES(八)----纹理编程框架
- 纹理(openGL)
- OpenGL学习十六:纹理绑定
- OpenGL学习十七:纹理贴图
- OpenGL学习十九:纹理过滤
- 几种内部排序算法总结!(冒泡排序、快速排序、直接插入排序、拆半插入排序、简单选择排序)
- 遮罩层
- 堆排序算法总结!
- 在C#调用C++的DLL简析(二)—— 生成托管dll
- pthread_mutex_t封装
- OpenGL学习(八) 纹理初步
- 链表C++实现
- unity3d Camera.SetReplacementShader的用法.
- 一个简单的TCP客户端程序流程
- telnet操作memcached增删改查
- Struts2 学习记录(4)
- 在Linux与Winodws下编译boost
- 6.HTML5基本Canvas 绘图
- android.view.GestureDetector