本节将绘制一个三角形
先看最终代码:
MyGlWindow.cpp:
1 #include <glglew.h> 2 #include "MyGlWindow.h" 3 4 void MyGlWindow::initializeGL() 5 { 6 glewInit(); 7 GLfloat verts[]= 8 { 9 +0.0f, +1.0f, 10 -1.0f, -1.0f, 11 +1.0f, -1.0f, 12 }; 13 GLuint myBufferID; 14 glGenBuffers(1, &myBufferID); 15 glBindBuffer(GL_ARRAY_BUFFER, myBufferID); 16 glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 17 glEnableVertexAttribArray(0); 18 glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0); 19 } 20 21 void MyGlWindow::paintGL() 22 { 23 glViewport(0,0,width(),height()); 24 glDrawArrays(GL_TRIANGLES, 0, 3); 25 }
启用通道
每个顶点都有多种attributes,例如位置,颜色等。
为了让把数据从内存发送到显卡中,我们需要告诉OpenGL去开启某个attribute。
17 行使用glEnableVertexAttribArray()函数来启用位置属性,参数0表示默认的数据通道,位置。
数据描述
我们接着需要对数据进行描述,告诉OpenGL这串数据代表几个顶点,每个顶点是几个数据组成。18行使用glVertexAttribPointer()函数达到这个目的。
第一个参数和前一行的函数参数表示同样的意思,位置0,位置通道。
第二个参数表示每个元素由几个数据组成,因为我们使用了2个数据来表示x和y,所以这里是2。
第三个参数表示数据类型是GL_FLOAT
第四个参数表示是否对数据进行Normalize,这里不需要
第五个参数表示数据的Stride,即两组数据间的跨度,有时不只有表示位置的数据,还有表示颜色等其他信息的数据,那么两组同类型数据之间就有一些跨度。
第六个参数表示起始的偏移,和第五个参数结合使用。
绘制
24 行使用glDrawArrays对数组进行绘制。
第一个参数表示绘制的图元类型,这里是三角形。
第二个参数表示第一个顶点的起始位置。
第三个参数表示绘制几个顶点。
窗口自适应
OpenGL窗口没有根据Qt窗口大小动态调整,所以添加第23 行来进行调整。
glViewPort()函数用来指定用窗口的哪个区域进行OpenGL绘制,四个参数分别表示左上角x,左上角y,绘制宽度,绘制高度。
这里的width()和height()是Qt的函数。