// GLTools库包含了一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL3.3中用来产生和渲染一些简单3D对象的函数, // 以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。 #include <GLTools.h> // GLShaderManager为GLTools的着色器管理器类。没有着色器,我们就不能再OpenGL(核心架构)中进行着色。着色器管理器类不仅允许我们创建并管理着色器, // 还提供一组“存储着色器”(Stock Shader),它们能够进行一些初步和基本的渲染操作。 #include <GLShaderManager.h> // 判断程序是在Mac上还是在Windows上建立,并选择对应的函数库。 #ifdef _APPLE_ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endif GLBatch trangleBatch; GLShaderManager shaderManager; void ChangeSize(int w, int h) { // 设置视口大小。 glViewport(0, 0, w, h); } void SetupRc() { // 用当前颜色清除窗口 glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // 初始化着色器 shaderManager.InitializeStockShaders(); // 在笛卡尔坐标系中指定三角形三个顶点的坐标。 GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, }; // 建立三角形的批次。 trangleBatch.Begin(GL_TRIANGLES, 3); trangleBatch.CopyVertexData3f(vVerts); trangleBatch.End(); } void RenderScene(void) { // 清除缓冲区(颜色缓冲区、深度缓冲区、模板缓冲区)。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // 指定三角形的颜色为红色。 GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 将颜色传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标系在屏幕上渲染几何图形。 shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); // 指示将几何图形提交到着色器。 trangleBatch.Draw(); // 启用双缓冲进行绘制。 glutSwapBuffers(); } int main(int argc, char* argv[]) { // 设置当前工作目录,在Windows中并不是必要的。 gltSetWorkingDirectory(argv[0]); // 初始化GLUT库。 glutInit(&argc, argv); // 在创建窗口时使用下列类型的显示模式:使用双缓冲窗口、RGBA颜色模式、启用深度测试以及模板测试。 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL); // 设置窗口大小。 glutInitWindowSize(800, 600); // 创建一个以“Triangle”为标题的窗口。 glutCreateWindow("Triangle"); // 窗口大小改变的回调函数。 glutReshapeFunc(ChangeSize); // 窗口重绘的回调函数。 glutDisplayFunc(RenderScene); // 重新调用GLEW库初始化OpenGL驱动程序中所有丢失的入口点,以确保OpenGL API对我们来说完全可用。 GLenum err = glewInit(); if (GLEW_OK != err) { fprintf(stderr, "GLEW Error: %s ", glewGetErrorString(err)); return -1; } // 创建并初始化渲染环境。 SetupRc(); // 启用主循环。 glutMainLoop(); return 0 ; }
程序运行结果: