[关闭]
@markheng 2015-10-03T03:16:09.000000Z 字数 5641 阅读 2044

第五章 图元的属性

计算机图形学


图形系统可以看作由当前系统参数为状态的状态机。

5.1 OpenGL变量属性

5.2 颜色和灰度

5.2.1 RGB颜色分量

颜色信息有两种方法存在缓存中:
- 直接在像素位置存储颜色的编码
- 将所有颜色存到一张表内,在像素位置存储颜色所对应的表的索引

5.2.2 颜色表

5.2.3灰度

灰度 grey scale

5.2.4其他颜色参数

5.3OpenGL颜色函数

glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );

第一个参数表示使用一个显示缓存
第二个参数表示使用默认模型,即像素位置直接存储颜色代码
可以用GLUT_INDEX代替GLUT_RGB从而设置显示模式为索引模式

5.3.1 OpenGL的RGB和RGBA颜色模型

RGBA模型中的A指的是alpha分量,表示调和系数,取值0-1之间,为0表示完全调和,表现为全透明,为1则不调和,表现为全不透明。
颜色模型的指定即glutInitDisplayMode函数中的第二个参数设为GLUT_RGBA
在RGB或者RGBA颜色模型中,使用下面函数设置当前颜色分量

glColor*(colorComponents);

*的内容和glVertex函数中的相同。
*中的类型选择不同,后面取值范围也不同,如:

f
-1.0 ~ 1.0
uf
0.0 ~ 1.0
ub
0-255
ui
0-4294967295

下面的函数

glColor3fv(colorComponent);

表示用向量设置当前颜色分量

5.3.2 OpenGL颜色索引模式

color_index mode
该模式下通过一个指向颜色表的索引来设定当前颜色

glIndex*(colorIndex);

colorIndex是一个非负整数
类型由后缀码表示可以是ub,s,i,d,f

下面这个函数可以为index位置设置一个颜色值

glutSetColor (index, red, green, blue);

5.3.3 OpenGL中的颜色调和

颜色调和函数color-blending function
图像混合函数image-compositing function

当前帧缓存中的颜色称为OpenGL的目标颜色
第二个对象的颜色称为OpenGL的源颜色

利用下面的函数激活和关闭调和特性:

glEnable(GL_BLEND);
glDisable(GL_BLEND);

颜色调和公式如下:

(SrRS+DrRd,SgGs+DgGd,SbBs+DbBd,SaAs+DaAd)RGBA(Rs,Gs,Bs,As)(Rd,Gd,Bd,Ad)(Sr,Sg,Sb,Sa)(Dr,Dg,Db,Da)(1)(2)(3)(4)

下面函数可以选择调和因子的值

glBlendFactor(sFactor, dFactor);

sFactor,dFactor表示源和目标因子,都用OpenGL常量表示一组四元的调和因子

GL_ZERO
(0.0, 0.0, 0.0, 0.0)
GL_ONE
(0.0, 0.0, 0.0, 0.0)

GL_DST_ALPHA
GL_SRC_ALPHA
表示将四个调和因子设定为目标α值或源α
其他常量有:

GL_ONE_MINUS_DST_ALPHA
GL_ONE_MINUS_SRC_ALPHA
GL_DST_COLOR
GL_SRC_COLOR

sFactor默认值为GL_ONE,dFactor默认值为GL_ZERO,即源颜色代替目标颜色

5.3.4 OpenGL颜色数组

OpenGL中可以在顶点数组中和坐标值混合来指定场景的颜色值。
先用下面代码激活OpenGL的颜色数组

glEnableClientState (GL_COLOR_ARRAY);

然后使用下面代码指定颜色分量的位置和格式

glColorPointer (nColorComponents, dataType, offset, colorArray);

nColorComponents赋值为3或4,3表示colorArray数组中为RGB分量,4表示colorArray为RGBA分量
dataType为OpenGL常量,例如GL_INTGL_FLOAT
offset为偏移量,如果只是一个单一的颜色数组则此参数值为0
colorArray为数据所在的数组

下列示例程序中使设定的立方体前向面所有顶点为蓝色,后向面所有顶点为红色

  1. typedef GLint vertex3 [3], color3 [3];
  2. vertex3 pt[8] = { {0, 0, 0}, {0, 1, 0}, {1, 0, 0}, {1, 1, 0},
  3. {0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}};
  4. color3 hue[8] = { {1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1},
  5. {1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1}};
  6. glEnableClientState (GL_VERTEX_ARRAY);
  7. glEnableClientState (GL_COLOR_ARRAY);
  8. glVertexPointer (3, GL_INT, 0, pt);
  9. glColorPointer (3, GL_INT, 0, hue);

也可以将颜色和顶点坐标一起装入一个交错数组

  1. static GLint hueAndPt [ ] =
  2. {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
  3. 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
  4. 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,
  5. 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1};
  6. glVertexPointer (3, GL_INT, 6*sizeof(GLint), huaAndPt[3]);
  7. glColorPointer (3, GL_INT, 6*sizeof(GLint), huaAndPt[0]);

如果将上述数组的类型设为float,可以使用以下函数一次性指定所有顶点和颜色数组及其他信息的函数。

  1. glInterleavedArrays (GL_C3F_V3F, 0, hueAndPt);

GL_C3F_V3F表示颜色和顶点的三元素浮点描述
数组hueAndPt按照颜色在坐标前的方式交错

颜色索引数组

glIndexPointer (type, stride, colorIndex);

colorIndex列出颜色索引
type,srideglColorPointer函数中的含义相同
索引为单值,所以不需要size参数

5.3.5 其他OpenGL颜色函数

glClearColor (red, green, blue, alpha);

此函数为屏幕选择要显示的颜色,再执行函数

glClear(GL_COLOR_BUFFER_BIT);

令屏幕显示设定好的颜色

索引模式下

glColorIndex (cindex);

设定为cindex处颜色的值

颜色调和不可能作用于颜色表指定的值

5.4点的属性

点的属性包括点的颜色和大小

5.5OpenGL点属性函数

颜色函数

glColor (color);

大小函数

glPointeSize (size);

size正浮点数表示,该值舍入得到一个整数,除非使用反走样处理。显示该点的水平和垂直像素数由size决定,点大小为1.0时显示一个像素,大小为2.0时显示2x2的像素阵列

5.6 线的属性

线的属性包括:颜色、线宽和线型
线可以生成如画笔和笔刷等其他效果

5.6.1 线宽

光栅实现中,类似于Bresenham算法,通过在每个取样位置处使用一个像素来生成标准线宽。其他线宽是标准线宽的整数倍,通过沿相邻平行线绘制额外的像素而显示

5.6.2 线型

线型有实线、虚线、点线等

5.6.3 画笔或画刷的选择

5.7 OpenGL线属性函数

5.7.1 OpenGL线宽函数

使用函数

glLineWidth(width);

设定线宽,width为实数,舍入得到最近的整数,如果舍入值为0,则使用标准线宽来显示。进行反走样处理时,为了减小锯齿感,会出现小数值的线宽

5.7.2 OpenGL线型函数

利用函数

glLineStipple(repeatFactor, pattern);

来设置当前线型
参数pattern用来引入描述如何显示线段的一个16位整数。值为1的一位对应一个“开”像素,0位对应一个“关”像素。该pattern从低位开始应用于线路径。默认值为0xffff为一位都为1,显示实线。
整数参数repeatFactor说明pattern中每一位重复应用多少次才轮到下一位。
默认的值是1
pattern应用在折线上不是由每一段线段的始端重新开始,而是从折线的第一个端点开始到最后一个端点结束。

5.9填充区属性

平铺tiling
平铺团tiling pattern
软填充soft-fill
色彩填充tint-fill

5.10 OpenGL填充区属性函数

5.10.1 OpenGL填充图案函数

我们使用32 × 32 的掩模。眼膜中值为1表示为对应像素设为当前颜色,值为0表示对应的帧缓存位置的值不变。
填充图案使用GLubyte以无符号字节进行描述,如同在bitmap函数中一样。

GLubyte fillPattern[] = {
    0xff, 0x00, 0xff, 0x00, ...
};

再使用下面的函数将其用做当前的填充图案:

glPolygonStipple (fillPattern);

使用填充图案之前必须激活填充子程序。

glEnable (GL_POLYGON_STIPPLE);

使用如下语句关掉图案填充

glDisable (GL_POLYGON_STIPPLE);

上面描述的填充图案从屏幕的左下角开始一直平铺作用到右上角

5.10.2 OpenGL纹理和插值图案

  1. glShadeModel (GL_SMOOTH);
  2. glBegin (GL_TRIANGLES);
  3. glColor3f (0.0, 0.0, 1.0);
  4. glVertex2i (50, 50);
  5. glColor3f (1.0, 0.0, 0.0);
  6. glVertex2i (150, 50);
  7. glColor3f (0.0, 1.0, 0.0);
  8. glVertex2i (75, 150);
  9. glEnd();

如果将三角形三个顶点的颜色设为一个单色,则用此单色填充三角形。
如果将glShadeModel参数设为GL_FLAT,则使用最后一个颜色进行填充。

5.10.3 OpenGL线框图方法

我们可以仅显示多边形的边,来生成线框图或者多边形的空心显示。还可以通过显示一组顶点来显示多边形。这些选项通过如下函数选定

glPolygonMode (face, displayMode);

face指定在多边形的哪个面上仅显示边或顶点。可以赋以一下值:

GL_FRONT 前面
GL_BACK 后面
GL_FRONT_AND_BACK 前后面

参数displayMode接受以下值

GL_LINE 边
GL_POINT 顶点
GL_FILL 默认值

图案填充可能会在多边形边缘产生缝线,使用深度位移法可以消除缝线

使用函数

glEdgeFlag(flag);

设定一个标识变量,标记接下来描述的边的可见性。
赋为GL_FLASE则不可见,直到将GL_TRUE再赋予此变量。
默认为GL_TRUE

5.10.4 OpenGL前向面函数

glFrontFace (vertexOrder);

vertexOrderGL_CWGL_CCW
GL_CW表示接下来描述的顺时针的面为前向面
GL_CCW表示逆时针的面为前向面,为默认值

5.13 OpenGL反走样函数

走样 aliasing
反走样 antialiasing

下述函数激活反走样子程序

glEnable (primitiveType);

primitiveType 被赋以符号常量 GL_POINT_SMOOTH,GL_LINE_SMOOTH,GL_POLYGON_SMOOTH
调用glEnable(GL_BLEND)来激活颜色调和子程序

然后利用α值来进行反走样处理

5.14 OpenGL询问函数

glGetBooleanv ();
glGetFloatv();
glGetIntegerv();
glGetDoublev();

5.15 OpenGL属性组

glPushAttrib (attrGroup );
glPopArrtrib ();

glPushClientAttrib( attrGroup);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注