从本节开始,将叙述如何设置图形的外观属性如大小和颜色、线型、线宽等。
1、点的大小
glPointSize函数用于设置单个点的大小,函数原型为:
void glPointSize(GLfloat size);
参数size的值必须大于0.0f,默认值为1.0f,单位为“像素”。
注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。
下面的代码在屏幕上标出了两个点,每个点的半径都是5像素。void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.0f); glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.5f); glEnd(); glFlush(); }
OpenGL支持两种颜色模式:,一种是RGBA模式,一种是索引模式。由于索引模式在PC机上已经用不到,所以不讲。
2、设置前景色。
设置像素的RGBA值的函数名字是glColor* 。
函数原型为:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue); void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
(还记得吗?函数名里的3f 表示有三个浮点参数~请看第二课中关于glVertex*函数的叙述。)
这里的A是alpha通道的缩写。alphat通道的作用是设置不透明度,默认值是1。实际上,下面两句代码的功能是等效的
glColor3f(1.0,0.0,0.0); glColor4f(1.0,0.0,0.0,1.0);
例如:
glColor3f(1.0f, 0.0f, 0.0f); //红色。 glColor3f(0.0f, 1.0f, 1.0f); //浅蓝色。 glColor3f(0.5f, 0.5f, 0.5f); //灰色。
下面代码绘制了一个浅蓝色的矩形。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 1.0f);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。
3、设置背景色
opengl提供了一个函数glClearColor来设置屏幕的背景色。这个函数需要和另外一个函数glClear结合起来使用。例子代码如下:
void display(void) { glClearColor(1.0f, 0.0f, 0.0f, 0.0f); //设置背景色为红色 glClear(GL_COLOR_BUFFER_BIT); //清空屏幕,也就是用背景色将整个窗体的绘图区重新画一遍 glFlush(); }运行效果就是画出了一个绘图区为红色的窗体,如下图所示
4、线段的颜色。
从前面可知,glColor函数设置了下一次绘图操作时所使用的画笔颜色,如下面的例子代码。标出了两个点,原点A(0,0)的颜色为红色,而点B(0.5,0.5)的颜色为绿色。
void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.0f); glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); //当前颜色为红色 glVertex2f(0.0f, 0.0f); glColor3f(0.0,1.0,0.0); //当前颜色为绿色 glVertex2f(0.5f, 0.5f); glEnd(); glFlush(); }
将上面代码中的绘图模式从GL_POINTS改为GL_LINES,可以得到一条线段AB。细心的读者于是要问:线段AB上的每个点的颜色应该是什么?都是红色?都是绿色?
一半红色?一半绿色?关于这个问题,我么先看下运行结果。
可以看到,线段AB上各点的颜色是"渐变"的,也就是逐渐从红色变为绿色。
opengl中提供了一个函数glShadeModel来决定如果处理这种不同颜色的情况。
这个函数的参数值只有两个:如下所示
glShadeModel(GL_SMOOTH); // 平滑方式,这也是opengl的默认处理方式,实现颜色渐变的效果 glShadeModel(GL_FLAT); // 单色方式,线段的颜色以某一个顶点的颜色为准,由具体实现决定。为了避免不确定性,应尽量在多边形中使用同一种颜色