在配置好OpenGL环境后,编写一个简单的OpenGL程序,体会一个完整的程序框架。下面的demo仅仅在蓝色的背景上绘制一个红色的三角形。代码参考自《OpenGL超级宝典(第5版)》
//Triangle.cpp
//our first opengl program that will just draw a triangle on the screen.
#include <GLTools.h> //opengl toolkit
#include <GLShaderManager.h> //shader manager class
#ifdef __APPLE__
#include <glut/glut.h> //OS X version of GLUT
#else
#define FREEGLUT_STATIC //在windows和linux上,我们使用freeglut的静态库版本。
//添加FREEGLUT_STATIC处理宏;
#include <GL/glut.h> //windows FreeGlut equivalent
#endif
//GLBatch是GLTools库中包含一个简单的容器类,可看成是图元简单批次的容器。
GLBatch triangleBatch;
//声明一个着色器管理器的实例,必须有着色器才能渲染.
GLShaderManager shaderManager;
void ChangeSize(int w,int h)//在窗口大小改变时接收新的高度和宽度
{
glViewport(0,0,w,h);
}
void SetupRC() //OpenGL函数起作用前必须创建一个渲染环境RC(rendering context),而glut第一次创建窗口时完成了这项工作。
{
//blue background
glClearColor(0.0f,0.0f,1.0f,1.0f); //设置背景色,蓝色,但并不立即执行
shaderManager.InitializeStockShaders();
//load up a triangle
GLfloat vVerts[]={
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f
};
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
//called to draw scene
void RenderScene(void)
{
//clear the window with the current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vRed[]={1.0f,0.0f,0.0f,1.0f};
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
triangleBatch.Draw();
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
//用来设定当前的工作目录,在windows中不必要,因为工作目录默认就是与可执行程序相同目录
gltSetWorkingDirectory(argv[0]);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL);//设置显示模式
glutInitWindowSize(800,600);
glutCreateWindow("create a triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err=glewInit(); //glutMainLoop()之前完成两件事。第一件是初始化GLEW库。原因暂时不需要知道。
if(GLEW_OK !=err)
{
fprintf(stderr,"GLEW Error:%s\n",glewGetErrorString(err));
return 1;
}
SetupRC(); //
glutMainLoop();
return 0;
}
执行的效果图如下,可以用鼠标拖拽窗口: