opengl学习笔记(五)——绘制复杂图形

从本节开始,将叙述如何设置图形的外观属性如大小和颜色、线型、线宽等。

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);      // 单色方式,线段的颜色以某一个顶点的颜色为准,由具体实现决定。为了避免不确定性,应尽量在多边形中使用同一种颜色










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