最近每晚都超累...脖子酸,脑袋昏沉...表示看书成问题...最近不知怎么了,特别特别累.
抄了一段书上的代码,跑了一遍.贴出来吧.
// 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;
}
本文介绍了一个使用OpenGL进行金字塔渲染的示例程序。该程序通过GLSL着色器实现了带纹理的点光源光照效果,并允许用户通过键盘操作旋转金字塔。文章包含完整的源代码,适合初学者学习OpenGL基本渲染流程。
1419

被折叠的 条评论
为什么被折叠?



