未完待续!!
// 用该程序来介绍基本一个程序的基本框架
#include // OpenGL toolkit
#include // Shader Manager Class
//在不同系统上的头文件
#ifdef __APPLE__
#include // OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include // Windows FreeGlut equivalent
#endif
GLBatch triangleBatch;
GLShaderManager shaderManager;
//////////////////////////////////////////////////////
// 改变窗口大小
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}
///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
// 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 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();
// Perform the buffer swap to display back buffer
glutSwapBuffers();
}
///////////////////////////////////////////////////////////////////////////////
// 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("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
主函数:
1.
gltSetWorkingDirectory(argv[0]);
设置当前工作目录,在windows下是不必要的,
2.
glutInit(&argc, argv);
传输命令行参数并初始化glut库。
3.
gluInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL);
告诉glut库,在窗户窗口时使用的显示模式。
4.
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
告诉glut窗口的大小,并创建以“Triangle”为标题的窗口。
5.
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glut内部运行一个本地消息循环,拦截适当的消息,然后调用我们为不同时间注册的回调函数。
6.
GLenum err = glewInit();
if(GLew_OK != err){
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
在主消息循环之前,初始化glew库,并且检查确定驱动程序的初始化过程中没有出现问题。
7.
SetupRC();
在这里进行OpenGL初始化比较方便,在任何OpenGL函数起作用之前必须创建一个渲染环境,而glut在第一次创建窗口时就创建了一个渲染环境了。
8.
glutMainLoop();
return 0;
主消息循环,glutMainLoop函数被调用后,在主窗口被关闭之前都不回还回。这个函数负责处理所有操作系统特定的消息、动作按键等,直到我们关闭程序。