OpenGL学习笔记(三)
第二课和第三课内容为三角形和矩形的颜色渲染内容,通过实例告诉我们如何给实现的样例进行上色。
我们已经知道任何在OpenGL中,任何形状都将最终被分解成矩形和三角形两种形状,所以在这两课中我们将对三角形和矩形的构建和渲染进行学习。
三角形和矩形构造
构建三角形或者矩形的方法在DrawGLScene方法中实现。
绘制图像之前我们需要先将屏幕缓存清理掉,即调用glClear和glLoadIdentity。这个时候屏幕上的定位点将被重置于窗口的正中间。
整个屏幕按照空间直角坐标系的形式进行坐标划分,分为X轴,Y轴和Z轴,其中X轴正方向为右方,Y轴正方向为上方,Z轴正方向为屏幕外侧,原点为你的窗口中央。
开始绘制图形的之前,我们首先需要使用glTranslatef对绘制的点进行偏移,将其移到适当的位置之后开始进行图像绘制(记住绘制点初始值位于屏幕正中央。)
绘制图形之前,我们需要调用glBegin(GL_TRIANGLES)来决定绘制图形。GL_TRIANGLES表示绘制一个三角形,GL_QUADS表示绘制一个矩形。如果需要绘制更多点组成的图形的话,可以使用GL_POLYGON。
下面以三角形的绘制为例,通过调用glVertex3f方法设置三个顶点的坐标我们就可以画出一个简单的三角形。如果需要绘制多个三角形,可以在glBegin之后添加3*n行glVertex3f方法,就能绘制出n个三角形。
绘制结束之后,我们将调用glEnd();表示本次绘制结束。
下面将展示第二课的代码及其实现效果。
1int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
2{
3 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
4 glLoadIdentity(); // Reset The Current Modelview Matrix
5 glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
6 glBegin(GL_TRIANGLES); // Drawing Using Triangles
7 glVertex3f( 0.0f, 1.0f, 0.0f); // Top
8 glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
9 glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
10 glEnd(); // Finished Drawing The Triangle
11 glTranslatef(3.0f,0.0f,0.0f); // Move Right 3 Units
12 glBegin(GL_QUADS); // Draw A Quad
13 glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
14 glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right
15 glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
16 glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
17 glEnd(); // Done Drawing The Quad
18 return TRUE; // Keep Going
19}
绘制出来的效果图如下所示。
图像着色
第三课内容为图像着色部分,这部分内容很简单,我们只需调用glColor3f便可以进行颜色着色。**值得注意的是,我们一旦调用glColor3f之后,在下一次调用glColor3f之前,着色的颜色不会改变。**比如下一段代码展示的这样。
1
2int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
3{
4 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
5 glLoadIdentity(); // 重置当前的模型观察矩阵
6 //当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
7 //中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
8
9 //glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。
10 //根据前面的次序,下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。
11 //注意在glTranslatef(x, y, z)中当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
12 glTranslatef(-1.5f, 0.0f, -6.0f); // 左移 1.5 单位,并移入屏幕 6.0
13 //glBegin(GL_TRIANGLES)的意思是开始绘制三角形,glEnd() 告诉OpenGL三角形已经创建好了。
14 //本节的简单示例中,我们只画一个三角形。如果要画第二个三角形的话,可以在这三点之后,再加三行代码(3点)。
15 glBegin(GL_TRIANGLES); // Drawing Using Triangles
16 //接下来的一行代码设置三角形的第一个顶点(三角形的上顶点),并使用当前颜色(红色)来绘制。
17 glColor3f(1.0f, 0.0f, 0.0f); // 设置当前色为红色
18 glVertex3f(0.0f, 1.0f, 0.0f); // Top
19 glColor3f(0.0f, 1.0f, 0.0f); // 设置当前色为绿色
20 glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
21 glColor3f(0.0f, 0.0f, 1.0f); // 设置当前色为蓝色
22 glVertex3f(1.0f, -1.0f, 0.0f); // Bottom Right
23 glEnd(); // Finished Drawing The Triangle
24 //在屏幕的左半部分画完三角形后,我们要移到右半部分来画正方形。为此要再次使用glTranslate。
25 glTranslatef(3.0f, 0.0f, 0.0f); // Move Right 3 Units
26 //现在使用GL_QUADS绘制正方形。
27 glBegin(GL_QUADS); // Draw A Quad
28 glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
29 glVertex3f(1.0f, 1.0f, 0.0f); // Top Right
30 glVertex3f(1.0f, -1.0f, 0.0f); // Bottom Right
31 glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
32 glEnd(); // Done Drawing The Quad
33 return TRUE; // Everything Went OK
34}
输出的图像如下所示。
我们注意到在三角形的三个点分别设置成三个颜色之后,OpenGL自动给我们设置好了过渡色,同时我们在绘制三角形的时候,最后一个点设置为蓝色。而在绘制矩形的时候,我们并没有设置颜色,结果矩形仍然变成了蓝色,就说明glColor3f的着色具有持久性,同时这个即便是跨glBegin和glEnd也能够保持那种持久性。
接着,我们将探究OpenGL中过渡色是怎么操作的。(这个部分教程中没有详细讲述)
对DrawGLScene稍作修改,在矩形中前两个点着红色,后两个点着绿色,我们查看着色情况如何。
1
2 //现在使用GL_QUADS绘制正方形。
3 glBegin(GL_QUADS); // Draw A Quad
4 //glColor3f(1.0f, 0.0f, 0.0f); // 将当前色设置为蓝色
5 glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
6 glVertex3f(1.0f, 1.0f, 0.0f); // Top Right
7 //glColor3f(0.0f, 0.1f, 0.0f); // 将当前色设置为蓝色
8 glVertex3f(1.0f, -1.0f, 0.0f); // Bottom Right
9 glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
10 glEnd();
图像显示将从前两个点绘成的直线向另外两个点组成的直线进行过渡。
所以我们能够