最近每晚都超累...脖子酸,脑袋昏沉...表示看书成问题...最近不知怎么了,特别特别累.
抄了一段书上的代码,跑了一遍.贴出来吧.
// SphereWorld.cpp #include "stdafx.h" #include <GLTools.h> #include <GLMatrixStack.h> #include <GLFrame.h> #include <GLFrustum.h> #include <GLBatch.h> #include <GLGeometryTransform.h> #include <math.h> #include <GL/glut.h> GLShaderManager shaderManager ; GLMatrixStack modelViewMatrix ; GLMatrixStack projectionMatrix ; GLFrame cameraFrame ; GLFrame objectFrame ; GLFrustum viewFrustum ; GLBatch pyramidBatch ; GLuint textureID ; GLGeometryTransform transformPipeline ; M3DMatrix44f shadowMatrix ; void MakePyramid(GLBatch& pyramidBatch) { pyramidBatch.Begin(GL_TRIANGLES, 18, 1); // Bottom of pyramid 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, 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 Pyramid m3dFindNormal(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 corner pyramidBatch.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 cornder pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3fv(vBackLeft); // Back left corner pyramidBatch.End(); } bool LoadTGATexture(const char* szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode) { GLbyte * pBits ; int width, height, components ; GLenum format ; pBits = gltReadTGABits(szFileName, &width, &height, &components, &format) ; 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, components, width, height, 0, format, 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 ; } void SetUpRC() { glClearColor(0.7f, 0.7f, 0.7f, 1.0f) ; shaderManager.InitializeStockShaders() ; glEnable(GL_DEPTH_TEST) ; glGenTextures(1, &textureID) ; glBindTexture(GL_TEXTURE_2D, textureID) ; LoadTGATexture("stone.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE) ; MakePyramid(pyramidBatch) ; cameraFrame.MoveForward(-7.0f) ; } void ShutdownRC(void) { glDeleteTextures(1, &textureID) ; } void RenderScene(void) { static GLfloat lightPos[] = {1.0f,1.0f, 1.0f,} ; static GLfloat white[] = {1.0f, 1.0f, 1.0f, 1.0f,} ; glClear(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(), lightPos, white, 0) ; pyramidBatch.Draw() ; modelViewMatrix.PopMatrix() ; glutSwapBuffers() ; } void SpecialKeys(int key, int x, int y) { if (key == GLUT_KEY_UP) objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0, 0) ; if (key == GLUT_KEY_DOWN) objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0, 0) ; if (key == GLUT_KEY_LEFT) objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0, 1.0f, 0) ; if (key == GLUT_KEY_RIGHT) objectFrame.RotateWorld(m3dDegToRad(5.0f), 0, 1.0f, 0) ; glutPostRedisplay() ; } void ChangeSize(int w, int h) { glViewport(0, 0, w, h) ; viewFrustum.SetPerspective(35.0f, (float)w / h, 1.0f, 500.0f) ; projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix()) ; transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix) ; } int 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; }