三角形是OpenGL 中最基本的图形,使用OpenGL绘制三角形只需要使用OpenGL提供的固定着色器就能完成,难度并不大,下面大概大概介绍实现细节,以及我理解的实现流程;
首先,要使用OpenGL 中的固定着色器,那么我们需要导入相关的头文件和工具库,见下图:
另外,我们要绘制图形,还需要定义一个着色器管理器和一个批次类容器,
其次,我们先来到main函数,程序的入口,下图中时主函数中所处理的所有工作
main函数中的代码,指定显示模式中的GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区;
以上是main函数的涉及到的代码以及解释,GLUT中的roop运行起来后,就开始监听消息,然后根据消息触发对应的函数,其中,main函数中的glutInitWindowSize调用之后,GLUT中的roop会收到一个初始化窗口的消息,进而调用之前注册的ChangeSize函数,setupRC()是我们对渲染环境的初始化,先用一张图解释一下GLUT中的roop运行流程:
从图5中我们可以看到,初始化窗口会通过GLUT roop触发我们的ChangeSize函数,setupRC()会设置我们的渲染环境,包括设置窗口颜色,初始化着色器,初始化要绘制的图形顶点、初始化批次类容器,指定批次类容器图形类型、顶点个数等;批次类数据处理结束,会将相应的数据提交给着色器,这时候会触发RanderScene函数调用,也就是roop收到需要渲染函数时会调用;其中,ChangeSize和RanderScene 并不少整个程序中只运行一次,而是用户通过改变窗口大小时,会多次调用。下面是setupRC、ChangeSize和RanderScene的具体实现。
最后,就是运行程序,得到我们绘制的三角形的效果图了,在整个渲染中,我设置的窗口大小为800x800,我们窗口的坐标系的原点O(0,0,0)在屏幕的正中心,屏幕的坐标范围从左到右也就是x轴方向为[-1,1],y方从最底端到最顶端的范围也是[-1,1];当然从我的顶点坐标中可以看出,z轴的坐标都是0,z轴的范围这里不讨论。所以看到三角形的高为整个窗口高的1/4,宽为窗口的1/2。
最后,我们用鼠标改变窗口大小,会看到触发上述的ChangeSize和RanderScene函数,提供我的deBug窗口的截图如下,同时,三角形在窗口的位置,以及和窗口的宽高比始终不变。