NeHe OpenGL教程 第三课 添加颜色

上一节课,我教你如何在屏幕上显示三角形和正方形。在这一课中我将教你如何向三角形和正方形运用两种不同的着色方式。使用单调着色会给正方形涂上固定的颜色。使用平滑着色会把三角形每个顶点指定的颜色混合在一起,产生一种漂亮的混合颜色。

使用上一课中的代码,我们将在DrawGLScene ()方法中添加新的代码。我将在下面重写整个过程,因此,如果你想修改上节课的代码,你只需用下面的代码替换上节课的DrawGLScene() 函数中的代码就可以了,或者把下面代码中上节课没有的部分添加上就可以了。

int DrawGLScene(GLvoid)  //我们绘制图形的地方

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色和深度缓存

glLoadIdentity(); //重置模型视图矩阵

glTranslatef(-1.5f,0.0f,-6.0f); //向左移动1.5个单位,向屏幕里移动6.0个单位

glBegin(GL_TRIANGLES);     //使用GL_TRIANGLES参数绘制三角形

如果你还记得上节课的内容,下面这部分代码是在屏幕的左半边绘制三角形。下面的这行代码我们第一次使用,我们使用glColor3f(r,g,b)函数。括号里的三个参数分别是红色,绿色和蓝色的强度值。取值范围为0.0f到1.0f。它们和我们用来清除屏幕背景的颜色值的效果是一样的。
我们设置颜色为红色(全红,无绿色,无蓝色)。这行代码的这下方是第一个顶点(三角形的上顶点),会使用红颜色来绘制。从现在开始我们绘制的任何对象都将使用红色,直到我们改变颜色。

glColor3f(1.0f,0.0f,0.0f);  //设置颜色为红色

glVertex3f( 0.0f, 1.0f, 0.0f);// 从中点向上移动一个单位 (上顶点)

我们已经把第一个顶点绘制在了屏幕上,并设置它的颜色为红色。在我们绘制第二个顶点之前,我们把颜色值改为绿色。这样三角形的左下顶点会被绘制成绿色。

glColor3f(0.0f,1.0f,0.0f); //设置颜色为绿色

glVertex3f(-1.0f,-1.0f, 0.0f); //左下顶点

然后我们绘制第三个也是最后一个顶点。在我们绘制之前,把颜色值改为蓝色。它是三角形的右下顶点。glEnd()函数执行之后,多边形将被填充。因为每个顶点的颜色不同,和只有一种固定颜色相比,颜色将会从每一个顶点扩散开来,然后杂中心汇合,所有的颜色混合在一起。这就是平滑着色。

glColor3f(0.0f,0.0f,1.0f);         //设置颜色为蓝色

glVertex3f( 1.0f,-1.0f, 0.0f);    // 右下顶点

glEnd();  //绘制三角形完成

glTranslatef(3.0f,0.0f,0.0f); //向右移动三个单位
然后,我们绘制一个蓝色的正方形。当颜色设置之后,所有绘制的对象都将使用这种颜色,记住这点很重要。在这种情况下,你所绘制的每一个对象都会以一种方式来使用着色。即使场景中的每一个物体都是纹理映射,glColor3f函数也可以用来调节纹理的色调,等等。以后再详细说明。
为了只使用一种颜色来绘制我们的正方形,我们要做的就是使用一种我们喜欢的颜色来仅设置一次颜色,然后绘制正方形。
我们将使用蓝色来绘制正方形的每个顶点,因为我们没让OpenGL在每个顶点改变颜色。最后的结果,一个实心的蓝色正方形。再强调一次,我们使用顺时针来绘制正方形,意味着,正方形的背面朝向我们。

glColor3f(0.5f,0.5f,1.0f);    //把颜色设置为蓝色

glBegin(GL_QUADS);   //开始绘制正方形

glVertex3f(-1.0f, 1.0f, 0.0f); //左上顶点

glVertex3f( 1.0f, 1.0f, 0.0f);  //右上顶点

glVertex3f( 1.0f,-1.0f, 0.0f);  //右下顶点

glVertex3f(-1.0f,-1.0f, 0.0f);  //左下顶点

glEnd();    //正方形绘制完成

return TRUE;  //返回

}

最后,修改一下切换窗口\全屏模式部分的代码,以便于窗口有一个合适的标题。

if(keys[VK_F1])  //如果F1被按下

{

    keys[VK_F1]=FALSE;  //设置为FALSE

    KillGLWindow();  //销毁当前的窗口

    fullscreen=!fullscreen;  //切换全屏/窗口模式

    // Recreate Our OpenGL Window ( 修改的部分)

    if(!CreateGLWindow("NeHe's Color Tutorial",640,480,16,fullscreen))

    {

        return0;  //如果窗口创建失败,程序退出

    }

}

你可能感兴趣的:(buffer,图形)