新建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相关推荐

  1. VS2015下OpenGL库的配置

    写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...

  2. Ubuntu下源码编译VirtualBox六 —— 源码编译(5)

    接前一篇文章<Ubuntu下源码编译VirtualBox五 -- 源码编译(4)>,链接如下: Ubuntu下源码编译VirtualBox五 -- 源码编译(4)_蓝天居士的博客-CSDN ...

  3. c++/qt/opencv实现魔方复原【娱乐】

    文章目录 前言 视频演示 一.项目工程目录 二.重要代码解析 1.Cube方块类 2.GLWidget界面构建 3.魔方还原 总结 前言 本文主要是对魔方还原进行测试,并且可通过键盘玩转魔方,然后自动 ...

  4. OpenGL超级宝典第7版环境配置

    1.下载源码 地址:http://www.openglsuperbible.com/ 2.运行Cmake,编译glfw库 打开项目后,编译工程(Debug和Release下都编译). 把E:\open ...

  5. 深入了解OpenGL——颜色混合

    大家好.这一讲,我们讲介绍OpenGL的颜色混合模式. 其实颜色混合用到的场合很多,比如多张图片的合成,动画游戏中的一些画面特效等都可以通过颜色混合进行实现.最常用的混合方式就是实现物体与背景的半透明 ...

  6. opengl开发环境搭建

    声明:文章核心内容摘自opengl中文网 https://learnopengl-cn.github.io/,也会补充一部分网站上没有的内容. 目录 一 安装cmake 二 安装GLFW 三 下载gl ...

  7. VS2017环境下配置OpenGL的简单方法(glut,glew,freeglut,gltools)

    写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...

  8. VS2015下opengl的freeglut,glew以及gltools库的配置

    由于上网搜索的答案各不相同,我只是为了配置glew就花费了将近一天的时间,深深感到了不同版本的Visual studio在配置opengl库中方法各异.在这里分享一个也是上网搜索得到的Visual S ...

  9. 【OpenGL】太阳、地球、月亮实例(一)

    准备把自己这几天的学习opengl的经验写下来,自己是这方面的小白,希望大神可以对有问题以及可以优化的地方提出来.也欢迎指出不足和吐槽.希望帮到小白. 自己参考得比较多的网站是这个: http://w ...

最新文章

  1. --single-transaction 参数对应MyISAM引擎和InnoDB引擎
  2. docker的常用命令汇总
  3. pytorch计算模型参数量
  4. Spring学习笔记15--注解Bean
  5. Encoder-Decoder (based on RNNS / LSTM)用于序列学习方案
  6. 滚动的组件_微信小程序开发实战(11):滚动组件(picker)
  7. 不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案
  8. Linux服务器安全配置三要点
  9. 2020-02-27
  10. Vue脚手架创建项目报错 ERROR command failed: npm install --loglevel error --legacy-peer-deps
  11. recover 没有捕获异常_Golang学习笔记之错误处理error、panic (抛出错误),recover(捕获错误...
  12. 小糊涂家装预算软件 v8.0 怎么用
  13. 捣鼓PlantUML(一、环境)
  14. 耳机插头3.5与2.5三段与四段i版与n版等详解
  15. 独立性与互不相容的区别
  16. OAuth2.0第三方授权原理与实战
  17. XP下如何共享文件,及开启相应的服务
  18. python按条件统计excel分区数据
  19. 如何高效地做竞品分析,并找到工作灵感?
  20. 3Dmax与Maya哪个更实用

热门文章

  1. OpenSips使用说明
  2. Git可视化极简易教程 —— Git GUI使用方法
  3. [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面
  4. pad点餐系统 内存管理的一点总结
  5. NLP 自然语言分析理解
  6. javaWeb企业分布式、互联网、云开发平台-Jeesz
  7. 坐火车卧铺,到底是上、中、下哪个好?其实简单对比一下就知道了
  8. ES6中使用let, const声明的变量, 在window对象下是获取不到的
  9. Vue学习笔记之13-webpack的配置 傻子看了都会配置的超详细教程
  10. java宠物实训报告,基于Java的宠物用品商城的设计与实现-开题报告