导入头文件
#include "GLTools.h"
#inClude <GLUT/GLUT.h>"
/*
在Mac系统下,'#include'
在windows上和Linux,我们使用freeglut的静态库版本并且要添加一个宏
*/
GLEW
OpenGL 允许硬件提供商通过它的扩展机制进行创新。这种机制分为两种方式运作。首先,提供商能能够向OpenGL API中增加开发人员可用的新函数;其次,可以添加能够被已存在的OpenGL函数识别的标记(Token)或枚举(Enumerant)。
这种扩展机制能够获得指向核心的OpenGL函数指针。使用一个自动化所有新函数指针并包含所需类型定义、常量和枚举值的扩展加载库。GLEW就是维护最好的开源库。也就是说,GLEW能自动识别到你的平台所支持的全部OpenGL高级扩展函数,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。
GLTools
GLTools库包含了一整套OpenGL帮助和使用工具函数。gltools.h文件包含所有的函数的函数原型。GLTools基于glew封装,里面还包含了用于操作矩阵和向量的3D数学库,并要GLEW来渲染一些简单3D对象,以及对视觉平截头体、相机类和矩阵变换进行管理的函数充分支持。
GLUT(OpenGL utility Toolkit)
首先出现的是AUX,也就是OpenGL辅助函数库。它的目的是帮助人们学习和编写OpenGL程序,而不必为任何平台特定完井的细节而烦恼。就是AUX帮你解决与平台的对接。但是由于缺乏GUI特性,就限制了它在创建使用的应用程序方面的应用。后来GULT渐渐取代了AUX。
GLUT库相当于是OpenGL的实用工具箱,添加了一些GUI功能,至少使事例程序在X window下显示更为实用。它的改进包括使用弹出式菜单、增加对其他窗口的管理,甚至提供了对操作杆的支持。
具有非常优秀的学习和演示功能,并且隐藏了像窗口创建和OpenGL环境初始化等平台特定的细节。极大方便程序员把3D图形集成到完整的应用程序之前,通过GLUT函数整理整理3D图形代码。
在Windows中,GLUT的开发已经中断,现有一个叫做freeglut的函数库已经取代它的位置。
三角形绘制流程
代码片段
int main(int argc,char* argv[]) {
// 设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
// 初始化GLUT库
glutInit(&argc, argv);
/*初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCTL分别指双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口太小,标题窗口
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
SetupRC();
glutMainLoop();
return 0;
}
- 初始化glut库、设置显示模式、创建窗口、注册回到函数
- 初始化glew库,返回结果状态
- 渲染图形,开启消息主循环
void ChangeSize(int w,int h) {
glViewport(0,0, w, h);
}
- 创建窗口、改变窗口大小的时候调用。这边强调0,0代表窗口中视口的左下角坐标
// 为程序作一次性设置
void SetupRC() {
// 设置背景颜色
glClearColor(0.0f,0.0f , 1.0f, 1.0f);
// 初始化着色管理
shaderManager.InitializeStockShaders();
// 设置三角形,其中数组vVert包含所有3个顶点x,y,笛卡尔坐标对
GLfloat vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f,
};
// 批次处理 链接方式
triangleBatch.Begin(GL_TRIANGLES, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.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);
//提交着色器
triangleBatch.Draw();
// 将在后台缓冲区进行渲染,然后在结束时交换到前台
glutSwapBuffers();
}
首先清除缓冲区(颜色缓冲区、深度缓冲区、模板缓冲区)
其次设置顶点数据、颜色、投影矩阵、模型矩阵等,使用着色器进行渲染