2画个三角形
绘制三角形时,要用到顶点缓存(VBO)的知识。个人感觉,这部分已经是GL比较中级的知识了。所以这里不做详细解释,也不拿VBO和顶点数组(VA)和显示列表作对比。我觉得,像GL这种实践性很强的技术,还是先动手把效果实现了再说。《OpenGL超级宝典》之所以提供GLTools,就是想先把复杂的原理屏蔽掉,让初学者能快速实现效果,随着程序写的越多,有些原理自然而然就理解了。否则,一开始就灌输那么多原理的东西,但连个最基本的三角形都画不出来,我想大多数人都会很快失去兴趣,尤其是像DirectX和OpenGL这种偏底层的技术。
所以,这里我只简单说一下VBO的作用。VBO全名Vertex Buffer Object——顶点缓存对象。它的作用就是存储顶点的一系列属性,比如顶点的位置,颜色,法线,纹理坐标等等。GL在绘制的过程中,就是根据VBO的数据把图形画出来。
2.1顶点,快到碗里来~
2.1.1创建VBO
既然,VBO是存储顶点的属性,那首先得有碗吧。
所以,第一步就是创建VBO
voidglGenBuffers(GLsizein,GLuint*buffers);
n:要产生的VBO的数量
buffers:存储VBO的句柄。
PS:GLsizei=intGLuint= unsignedint
有人会问,干嘛这么麻烦,直接用int不就好了。OpenGL是跨平台的API,所以要兼顾各个平台,所以自己重新定义了类型。这个知道就行,建议养成用GL专有类型的好习惯。
2.1.2绑定VBO
voidglBindBuffer(GLenumtarget,GLuintbuffer);
绑定一个缓冲区对象。
target:可能取值是:GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, or GL_PIXEL_UNPACK_BUFFER.
我们现在主要使用GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER。
GL_ARRAY_BUFFER用于保存之前说的,顶点的各种属性
GL_ELEMENT_ARRAY_BUFFER用于保存顶点索引,这个在以后用顶点索引模型绘制时会用到。
当进行绑定之后,以前的绑定就失效了。
在绑定的同时,也将该缓存设置成当前缓存。GL对缓存的一切操作,都是对当前缓存有效。
PS:这么做的原因,是因为OpenGL采用状态机的模式。glBindBuffer就是讲GL的缓存模式切换到当前缓存。可能,习惯面向对象的人不习惯这种模式。GL是一种C语言API,所以GL中并没有真正的对象改变。GL中的对象,实际上就是一个int类型的标识符,对于熟悉Windows编程的朋友来说,也就是所谓的句柄。所以,GL要对使用或者改变某对象,采用的就是绑定该对象句柄的方式。而不是,C++的真正类,可以直接调用对象的成员方法。
2.1.3为VBO填充数据
选择好要操作的VBO之后,就要为VBO装数据,这里的数据,可以是顶点位置,顶点颜色等等
voidglBufferData(GLenum target,GLsizeiptrsize,constGLvoid* data,GLenum usage);
target:和之前glBindBuffer中的target含义是一样的。