原文: Adding Colour
上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色,生成各种颜色.
利用上一节的代码,我们会添加代码到DrawGLScene函数中.我还是会重写整个函数.
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The Current Modelview Matrix glTranslatef(-1.5f,0.0f,-6.0f); // Left 1.5 Then Into Screen Six Units glBegin(GL_TRIANGLES); // Begin Drawing Triangles
上一节中,下面代码是在左边画三角形.下面这行代码是第一次用到glColor3f(r,g,b)这个函数.三个参数分别是红,绿,蓝的强度值.范围是0.0f到1.0f.原理和当初我们清空屏幕背景色一样.
我们设置成红色(全部红色,没绿色,没蓝色).后面那行就是第一个顶点(三角形的顶部),会用上当前的红色.在我们改变颜色之前,绘制的所有物体都是红色的.
glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red glVertex3f( 0.0f, 1.0f, 0.0f); // Move Up One Unit From Center (Top Point)
用红色画完了第一个点.在设置第二点之前我们把颜色设置为绿色.这样第二点就会用绿色绘制.
glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green glVertex3f(-1.0f,-1.0f, 0.0f); // Left And Down One Unit (Bottom Left)
最后一个点用蓝色.到glEnd()函数调用完后,多边形就会被填满.但因为你在各个顶点有不同的颜色,不是由始至终同一种颜色,所以颜色会从三个角扩散开来,最后汇聚在中心,颜色会混合在一起.这就是平滑染色.
glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue glVertex3f( 1.0f,-1.0f, 0.0f); // Right And Down One Unit (Bottom Right) glEnd(); // Done Drawing A Triangle glTranslatef(3.0f,0.0f,0.0f); // From Right Point Move 3 Units Right
现在我们会画一个实心蓝色的正方形.注意设定了一种颜色后,画什么都是那种颜色.即使是在所有对象都是纹理绘制的场景下,glColor3f仍然可以用于纹理颜色上.
所以如果只用单色画方形,就直接设置即可(下面例子是用蓝色).下面的例子中,蓝色会作用于所有顶点,因为我们没在绘制每个顶点之前都重新更换颜色.所以最后输出是一个蓝色的实心方形.该方形是顺时针方向绘制的,所以我们从背面开始看.
glColor3f(0.5f,0.5f,1.0f); // Set The Color To Blue One Time Only glBegin(GL_QUADS); // Start Drawing Quads glVertex3f(-1.0f, 1.0f, 0.0f); // Left And Up 1 Unit (Top Left) glVertex3f( 1.0f, 1.0f, 0.0f); // Right And Up 1 Unit (Top Right) glVertex3f( 1.0f,-1.0f, 0.0f); // Right And Down One Unit (Bottom Right) glVertex3f(-1.0f,-1.0f, 0.0f); // Left And Down One Unit (Bottom Left) glEnd(); // Done Drawing A Quad return TRUE; // Keep Going }
最后更改更改代码来切换窗体和全屏模式,所以标题放在窗体顶部是合适.
if (keys[VK_F1]) // Is F1 Being Pressed? { keys[VK_F1]=FALSE; // If So Make Key FALSE KillGLWindow(); // Kill Our Current Window fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode // Recreate Our OpenGL Window ( Modified ) if (!CreateGLWindow("NeHe's Color Tutorial",640,480,16,fullscreen)) { return 0; // Quit If Window Was Not Created } }
本节讲解了增加平滑颜色到OpenGL多边形中.你可以尝试换成红绿蓝的颜色值.