上一节我们已经讲到了颜色属性,颜色属性是属性的一种,这一节我们从属性对象角度来看看OpenGL如何处理属性信息。
一、点的属性
一般情况下,我们可以设定点的两个属性:颜色和大小。我们看看下面这个示例,一切不言自明。
#include <GL/glut.h>
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1, 1, 1, 1);
glViewport(0, 0, 400, 100);
glViewport(0, 0, 100, 100);
glPointSize(10.0f); glColor3f(1, 0, 0);//点的属性
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glEnd();
glViewport(100, 0, 100, 100);
glPointSize(20.0f); glColor3f(0, 1, 0);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glEnd();
glViewport(200, 0, 100, 100);
glPointSize(30.0f); glColor3f(0, 0, 1);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glEnd();
glViewport(300, 0, 100, 100);
glPointSize(40.0f); glColor3f(1, 1, 0);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glEnd();
glFlush();
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400, 100);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello OpenGL");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
代码虽长,但我们只关心其中的两行代码。
glPointSize(10.0f); //点的尺寸
glColor3f(1, 0, 0);//点的颜色
这两行代码分别代表点的两个属性:尺寸、颜色。颜色属性我们前面已经讲解地非常透彻了,我们重点看看尺寸或者说大小属性。OpenGL中点的大小是像素大小的整倍数,因此如示例所示,一个大的点显示成了一个像素方块。OpenGL用glPointSize(size)函数设置点的尺寸,其中size用正浮点数指定,显示该点的水平和垂直像素数即为size的大小。
二、线的属性
直线段可以使用三个基本属性来显示:颜色、线宽和线型。
#include <GL/glut.h>
#include <math.h>
double Pi = 3.1415926;
void display(void)
{
GLfloat r = 1.2f;
GLfloat verA[2] = { 0, r };
GLfloat verB[2] = { -r*sin(0.4*Pi), r*cos(0.4*Pi) };
GLfloat verC[2] = { -r*sin(Pi / 5), -r*cos(Pi / 5) };
GLfloat verD[2] = { r*sin(Pi / 5), -r*cos(Pi / 5) };
GLfloat verE[2] = { r*sin(0.4*Pi), r*cos(0.4*Pi) };
glEnable(GL_LINE_STIPPLE);//启用线型
glLineStipple(1, 0x0101);//设置线型为虚线
glLineWidth(6.0f);//线宽
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
glVertex2fv(verA);
glColor3f(1.0f, 0, 0);
glVertex2fv(verC);
glColor3f(0, 1.0f, 0);
glVertex2fv(verE);
glColor3f(0, 0, 1.0f);
glVertex2fv(verB);
glColor3f(1.0, 1.0, 1.0);
glVertex2fv(verD);
glEnd();
glFinish();
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400, 400);
glutInitWindowPosition(500, 300);
glutCreateWindow("Hello OpenGL");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
相信大家一眼就能找到核心代码在哪。,我们来给大家一一剖析。
颜色属性我们不再赘述,线宽属性类似点尺寸属性,也是比较简单的。对我们而言最有趣的无疑是线型属性。
在使用当前线型显示线段之前,必须先激活OpenGL的线型特性:
glEnable(GL_LINE_STIPPLE);
OpenGL使用glLineStipple函数设置线型,其有两个参数,第二个参数引入描述如何显示线段的一个16位整数,值为1的位对应一个“开”像素,值为0的位对应一个“关”像素。该模式从低位开始应用于线路经。在我们的例子里,参数为0x0101,对应的二进制数为0000000100000001,即三倍宽度点模式,用点表示虚线,且点与点之间间隔较宽。需要注意的是,因为我们设置了线宽为6,虚线看起来是由划线连起来的,但这里很明显划线方向垂直于虚线的方向,这表明该宽度表示的是虚线宽,而不是间隔宽。第一个参数表示的是每一位重复应用的次数,我们试着把该参数改为4,看看结果。
结果也是显而易见的,在虚线方向上点和间隔都变宽了,这就是每一位都重复应用4次的结果。
下面我们再给大家看几个示例让大家加深一下理解。
第二个参数改为0x1c47:
第二个参数改为0x00ff:
这段代码我们讲完了吗,显然大家心头是尚有疑问的。
为什么图中的颜色这么缤纷多彩呢?我们明明只设置了四次颜色。我们来学习一个新函数:
glShadeModel(GL_SMOOTH);
该函数指定线段按两端点颜色的线性插值方式进行显示,即实现颜色渐变的这么一个效果。事实上,我们在代码中并没有使用这个函数,因为颜色渐变是OpenGL中的一个默认效果。我们可以改变函数参数为GL_FLAT取消颜色渐变效果,取而代之的是总是用线段终点的颜色表示整条线段。