OpenGLTest
新建Win32控制台应用程序
拷贝一下
#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#pragma comment(lib,"gltools.lib")/
// An assortment of needed classes
GLShaderManager shaderManager;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLFrame cameraFrame;
GLFrustum viewFrustum;
GLBatch cubeBatch;
GLBatch floorBatch;
GLBatch topBlock;
GLBatch frontBlock;
GLBatch leftBlock;GLGeometryTransform transformPipeline;
M3DMatrix44f shadowMatrix;// Keep track of effects step
int nStep = 0;// Lighting data
GLfloat lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat lightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat lightSpecular[] = { 0.9f, 0.9f, 0.9f };
GLfloat vLightPos[] = { -8.0f, 20.0f, 100.0f, 1.0f };GLuint textures[4];///
// Make a cube out of a batch of triangles. Texture coordinates and normals
// are also provided.
void MakeCube(GLBatch& cubeBatch){cubeBatch.Begin(GL_TRIANGLES, 36, 1);/// Top of cubecubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);// Bottom of cubecubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(0.0f, -1.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);///// Left side of cubecubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f);// Right side of cubecubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(1.0f, 0.0f, 0.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);// Front and Back// FrontcubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f);cubeBatch.Normal3f(0.0f, 0.0f, 1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f);// BackcubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f);cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f);cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f);cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f);cubeBatch.Normal3f(0.0f, 0.0f, -1.0f);cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f);cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f);cubeBatch.End();}/
// Make the floor, just the verts and texture coordinates, no normals
void MakeFloor(GLBatch& floorBatch){GLfloat x = 5.0f;GLfloat y = -1.0f;floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1);floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);floorBatch.Vertex3f(-x, y, x);floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);floorBatch.Vertex3f(x, y, x);floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);floorBatch.Vertex3f(x, y, -x);floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);floorBatch.Vertex3f(-x, y, -x);floorBatch.End();}///
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC(){GLbyte *pBytes;GLint nWidth, nHeight, nComponents;GLenum format;shaderManager.InitializeStockShaders();// Black backgroundglClearColor(0.0f, 0.0f, 0.0f, 1.0f );glEnable(GL_DEPTH_TEST);glLineWidth(2.5f);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);cameraFrame.MoveForward(-15.0f);cameraFrame.MoveUp(6.0f);cameraFrame.RotateLocalX(float(m3dDegToRad(20.0f)));MakeCube(cubeBatch);MakeFloor(floorBatch);// Make toptopBlock.Begin(GL_TRIANGLE_FAN, 4, 1);topBlock.Normal3f(0.0f, 1.0f, 0.0f);topBlock.MultiTexCoord2f(0, 0.0f, 0.0f);topBlock.Vertex3f(-1.0f, 1.0f, 1.0f);topBlock.Normal3f(0.0f, 1.0f, 0.0f);topBlock.MultiTexCoord2f(0, 1.0f, 0.0f);topBlock.Vertex3f(1.0f, 1.0f, 1.0f);topBlock.Normal3f(0.0f, 1.0f, 0.0f);topBlock.MultiTexCoord2f(0, 1.0f, 1.0f);topBlock.Vertex3f(1.0f, 1.0f, -1.0f);topBlock.Normal3f(0.0f, 1.0f, 0.0f);topBlock.MultiTexCoord2f(0, 0.0f, 1.0f);topBlock.Vertex3f(-1.0f, 1.0f, -1.0f);topBlock.End();// Make FrontfrontBlock.Begin(GL_TRIANGLE_FAN, 4, 1);frontBlock.Normal3f(0.0f, 0.0f, 1.0f);frontBlock.MultiTexCoord2f(0, 0.0f, 0.0f);frontBlock.Vertex3f(-1.0f, -1.0f, 1.0f);frontBlock.Normal3f(0.0f, 0.0f, 1.0f);frontBlock.MultiTexCoord2f(0, 1.0f, 0.0f);frontBlock.Vertex3f(1.0f, -1.0f, 1.0f);frontBlock.Normal3f(0.0f, 0.0f, 1.0f);frontBlock.MultiTexCoord2f(0, 1.0f, 1.0f);frontBlock.Vertex3f(1.0f, 1.0f, 1.0f);frontBlock.Normal3f(0.0f, 0.0f, 1.0f);frontBlock.MultiTexCoord2f(0, 0.0f, 1.0f);frontBlock.Vertex3f(-1.0f, 1.0f, 1.0f);frontBlock.End();// Make leftleftBlock.Begin(GL_TRIANGLE_FAN, 4, 1);leftBlock.Normal3f(-1.0f, 0.0f, 0.0f);leftBlock.MultiTexCoord2f(0, 0.0f, 0.0f);leftBlock.Vertex3f(-1.0f, -1.0f, -1.0f);leftBlock.Normal3f(-1.0f, 0.0f, 0.0f);leftBlock.MultiTexCoord2f(0, 1.0f, 0.0f);leftBlock.Vertex3f(-1.0f, -1.0f, 1.0f);leftBlock.Normal3f(-1.0f, 0.0f, 0.0f);leftBlock.MultiTexCoord2f(0, 1.0f, 1.0f);leftBlock.Vertex3f(-1.0f, 1.0f, 1.0f);leftBlock.Normal3f(-1.0f, 0.0f, 0.0f);leftBlock.MultiTexCoord2f(0, 0.0f, 1.0f);leftBlock.Vertex3f(-1.0f, 1.0f, -1.0f);leftBlock.End();// Create shadow projection matrixGLfloat floorPlane[] = { 0.0f, 1.0f, 0.0f, 1.0f};m3dMakePlanarShadowMatrix(shadowMatrix, floorPlane, vLightPos);// Load up four textures glGenTextures(4, textures);// Wood floorpBytes = gltReadTGABits("floor.tga", &nWidth, &nHeight, &nComponents, &format);glBindTexture(GL_TEXTURE_2D, textures[0]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0,format, GL_UNSIGNED_BYTE, pBytes);free(pBytes);// One of the block facespBytes = gltReadTGABits("Block4.tga", &nWidth, &nHeight, &nComponents, &format);glBindTexture(GL_TEXTURE_2D, textures[1]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0,format, GL_UNSIGNED_BYTE, pBytes);free(pBytes);// Another block facepBytes = gltReadTGABits("block5.tga", &nWidth, &nHeight, &nComponents, &format);glBindTexture(GL_TEXTURE_2D, textures[2]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0,format, GL_UNSIGNED_BYTE, pBytes);free(pBytes);// Yet another block facepBytes = gltReadTGABits("block6.tga", &nWidth, &nHeight, &nComponents, &format);glBindTexture(GL_TEXTURE_2D, textures[3]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0,format, GL_UNSIGNED_BYTE, pBytes);free(pBytes);}///
// Render the block
void RenderBlock(void){GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f};GLfloat vWhite[] = { 1.0f, 1.0f, 1.0f, 1.0f };switch(nStep){// Wire framecase 0:glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vRed);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glDisable(GL_CULL_FACE);// Draw the cubecubeBatch.Draw();break;// Wire frame, but not the back side... we also want the block to be in the stencil buffercase 1:shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vRed);// Draw solid block in stencil buffer// Back face culling prevents the back sides from showing through// The stencil pattern is used to mask when we draw the floor under it// to keep it from showing through.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glEnable(GL_STENCIL_TEST);glStencilFunc(GL_NEVER, 0, 0);glStencilOp(GL_INCR, GL_INCR, GL_INCR);cubeBatch.Draw();glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);glDisable(GL_STENCIL_TEST);glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// Draw the front side cubecubeBatch.Draw();break;// Solidcase 2:shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vRed);// Draw the cubecubeBatch.Draw();break;// Litcase 3:shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, modelViewMatrix.GetMatrix(),projectionMatrix.GetMatrix(), vLightPos, vRed);// Draw the cubecubeBatch.Draw();break;// Textured & Litcase 4:case 5:default:glBindTexture(GL_TEXTURE_2D, textures[2]);shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, modelViewMatrix.GetMatrix(),projectionMatrix.GetMatrix(), vLightPos, vWhite, 0);glBindTexture(GL_TEXTURE_2D, textures[1]);topBlock.Draw();glBindTexture(GL_TEXTURE_2D, textures[2]);frontBlock.Draw();glBindTexture(GL_TEXTURE_2D, textures[3]);leftBlock.Draw();break;}// Put everything backglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glEnable(GL_CULL_FACE);glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_STENCIL_TEST);}///
// Render the floor
void RenderFloor(void){GLfloat vBrown [] = { 0.55f, 0.292f, 0.09f, 1.0f};GLfloat vFloor[] = { 1.0f, 1.0f, 1.0f, 0.6f };switch(nStep){// Wire framecase 0:glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glDisable(GL_CULL_FACE);break;// Wire frame, but not the back side.. and only where stencil == 0case 1:glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);glEnable(GL_STENCIL_TEST);glStencilFunc(GL_EQUAL, 0, 0xff);shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);break;// Solidcase 2:case 3: shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);break;// Texturedcase 4:case 5:default:glBindTexture(GL_TEXTURE_2D, textures[0]);shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, transformPipeline.GetModelViewProjectionMatrix(), vFloor, 0);break;}// Draw the floorfloorBatch.Draw();// Put everything backglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glEnable(GL_CULL_FACE);glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_STENCIL_TEST);}///
// Called to draw scene
void RenderScene(void){// 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);// Reflection step... draw cube upside down, the floor// blended on top of itif(nStep == 5) {glDisable(GL_CULL_FACE);modelViewMatrix.PushMatrix();modelViewMatrix.Scale(1.0f, -1.0f, 1.0f);modelViewMatrix.Translate(0.0f, 2.0f, 0.0f);modelViewMatrix.Rotate(35.0f, 0.0f, 1.0f, 0.0f);RenderBlock();modelViewMatrix.PopMatrix();glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);RenderFloor();glDisable(GL_BLEND); }modelViewMatrix.PushMatrix();// Draw normallymodelViewMatrix.Rotate(35.0f, 0.0f, 1.0f, 0.0f);RenderBlock();modelViewMatrix.PopMatrix();// If not the reflection pass, draw floor lastif(nStep != 5)RenderFloor();modelViewMatrix.PopMatrix();// Flush drawing commandsglutSwapBuffers();}///
// A normal ASCII key has been pressed.
// In this case, advance the scene when the space bar is pressed
void KeyPressFunc(unsigned char key, int x, int y){if(key == 32){nStep++;if(nStep > 5)nStep = 0;}// Refresh the WindowglutPostRedisplay();}///
// 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());modelViewMatrix.LoadIdentity();}///
// Main entry point for GLUT based programs
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("3D Effects Demo");GLenum err = glewInit();if (GLEW_OK != err){/* Problem: glewInit failed, something is seriously wrong. */fprintf(stderr, "Error: %s\n", glewGetErrorString(err));return 1;}glutReshapeFunc(ChangeSize);glutKeyboardFunc(KeyPressFunc);glutDisplayFunc(RenderScene);SetupRC();glutMainLoop();glDeleteTextures(4,textures);return 0;}
OpenGLTest相关推荐
- VS2015下OpenGL库的配置
写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...
- Ubuntu下源码编译VirtualBox六 —— 源码编译(5)
接前一篇文章<Ubuntu下源码编译VirtualBox五 -- 源码编译(4)>,链接如下: Ubuntu下源码编译VirtualBox五 -- 源码编译(4)_蓝天居士的博客-CSDN ...
- c++/qt/opencv实现魔方复原【娱乐】
文章目录 前言 视频演示 一.项目工程目录 二.重要代码解析 1.Cube方块类 2.GLWidget界面构建 3.魔方还原 总结 前言 本文主要是对魔方还原进行测试,并且可通过键盘玩转魔方,然后自动 ...
- OpenGL超级宝典第7版环境配置
1.下载源码 地址:http://www.openglsuperbible.com/ 2.运行Cmake,编译glfw库 打开项目后,编译工程(Debug和Release下都编译). 把E:\open ...
- 深入了解OpenGL——颜色混合
大家好.这一讲,我们讲介绍OpenGL的颜色混合模式. 其实颜色混合用到的场合很多,比如多张图片的合成,动画游戏中的一些画面特效等都可以通过颜色混合进行实现.最常用的混合方式就是实现物体与背景的半透明 ...
- opengl开发环境搭建
声明:文章核心内容摘自opengl中文网 https://learnopengl-cn.github.io/,也会补充一部分网站上没有的内容. 目录 一 安装cmake 二 安装GLFW 三 下载gl ...
- VS2017环境下配置OpenGL的简单方法(glut,glew,freeglut,gltools)
写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...
- VS2015下opengl的freeglut,glew以及gltools库的配置
由于上网搜索的答案各不相同,我只是为了配置glew就花费了将近一天的时间,深深感到了不同版本的Visual studio在配置opengl库中方法各异.在这里分享一个也是上网搜索得到的Visual S ...
- 【OpenGL】太阳、地球、月亮实例(一)
准备把自己这几天的学习opengl的经验写下来,自己是这方面的小白,希望大神可以对有问题以及可以优化的地方提出来.也欢迎指出不足和吐槽.希望帮到小白. 自己参考得比较多的网站是这个: http://w ...
最新文章
- --single-transaction 参数对应MyISAM引擎和InnoDB引擎
- docker的常用命令汇总
- pytorch计算模型参数量
- Spring学习笔记15--注解Bean
- Encoder-Decoder (based on RNNS / LSTM)用于序列学习方案
- 滚动的组件_微信小程序开发实战(11):滚动组件(picker)
- 不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案
- Linux服务器安全配置三要点
- 2020-02-27
- Vue脚手架创建项目报错 ERROR command failed: npm install --loglevel error --legacy-peer-deps
- recover 没有捕获异常_Golang学习笔记之错误处理error、panic (抛出错误),recover(捕获错误...
- 小糊涂家装预算软件 v8.0 怎么用
- 捣鼓PlantUML(一、环境)
- 耳机插头3.5与2.5三段与四段i版与n版等详解
- 独立性与互不相容的区别
- OAuth2.0第三方授权原理与实战
- XP下如何共享文件,及开启相应的服务
- python按条件统计excel分区数据
- 如何高效地做竞品分析,并找到工作灵感?
- 3Dmax与Maya哪个更实用
热门文章
- OpenSips使用说明
- Git可视化极简易教程 —— Git GUI使用方法
- [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面
- pad点餐系统 内存管理的一点总结
- NLP 自然语言分析理解
- javaWeb企业分布式、互联网、云开发平台-Jeesz
- 坐火车卧铺,到底是上、中、下哪个好?其实简单对比一下就知道了
- ES6中使用let, const声明的变量, 在window对象下是获取不到的
- Vue学习笔记之13-webpack的配置 傻子看了都会配置的超详细教程
- java宠物实训报告,基于Java的宠物用品商城的设计与实现-开题报告