@markheng
2015-10-03T11:16:09.000000Z
字数 5641
阅读 2202
计算机图形学
图形系统可以看作由当前系统参数为状态的状态机。
颜色信息有两种方法存在缓存中:
- 直接在像素位置存储颜色的编码
- 将所有颜色存到一张表内,在像素位置存储颜色所对应的表的索引
灰度 grey scale
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
第一个参数表示使用一个显示缓存
第二个参数表示使用默认模型,即像素位置直接存储颜色代码
可以用GLUT_INDEX
代替GLUT_RGB
从而设置显示模式为索引模式
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);
表示用向量设置当前颜色分量
color_index mode
该模式下通过一个指向颜色表的索引来设定当前颜色
glIndex*(colorIndex);
colorIndex是一个非负整数
类型由后缀码表示可以是ub
,s
,i
,d
,f
下面这个函数可以为index位置设置一个颜色值
glutSetColor (index, red, green, blue);
颜色调和函数color-blending function
图像混合函数image-compositing function
当前帧缓存中的颜色称为OpenGL的目标颜色
第二个对象的颜色称为OpenGL的源颜色
利用下面的函数激活和关闭调和特性:
glEnable(GL_BLEND);
glDisable(GL_BLEND);
颜色调和公式如下:
下面函数可以选择调和因子的值
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
,即源颜色代替目标颜色
OpenGL中可以在顶点数组中和坐标值混合来指定场景的颜色值。
先用下面代码激活OpenGL的颜色数组
glEnableClientState (GL_COLOR_ARRAY);
然后使用下面代码指定颜色分量的位置和格式
glColorPointer (nColorComponents, dataType, offset, colorArray);
nColorComponents
赋值为3或4,3表示colorArray数组中为RGB分量,4表示colorArray为RGBA分量
dataType
为OpenGL常量,例如GL_INT
,GL_FLOAT
offset
为偏移量,如果只是一个单一的颜色数组则此参数值为0
colorArray
为数据所在的数组
下列示例程序中使设定的立方体前向面所有顶点为蓝色,后向面所有顶点为红色
typedef GLint vertex3 [3], color3 [3];
vertex3 pt[8] = { {0, 0, 0}, {0, 1, 0}, {1, 0, 0}, {1, 1, 0},
{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}};
color3 hue[8] = { {1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1},
{1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1}};
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);
glVertexPointer (3, GL_INT, 0, pt);
glColorPointer (3, GL_INT, 0, hue);
也可以将颜色和顶点坐标一起装入一个交错数组
static GLint hueAndPt [ ] =
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,
1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1};
glVertexPointer (3, GL_INT, 6*sizeof(GLint), huaAndPt[3]);
glColorPointer (3, GL_INT, 6*sizeof(GLint), huaAndPt[0]);
如果将上述数组的类型设为float
,可以使用以下函数一次性指定所有顶点和颜色数组及其他信息的函数。
glInterleavedArrays (GL_C3F_V3F, 0, hueAndPt);
GL_C3F_V3F
表示颜色和顶点的三元素浮点描述
数组hueAndPt
按照颜色在坐标前的方式交错
glIndexPointer (type, stride, colorIndex);
colorIndex
列出颜色索引
type
,sride
和glColorPointer
函数中的含义相同
索引为单值,所以不需要size参数
glClearColor (red, green, blue, alpha);
此函数为屏幕选择要显示的颜色,再执行函数
glClear(GL_COLOR_BUFFER_BIT);
令屏幕显示设定好的颜色
索引模式下
glColorIndex (cindex);
设定为cindex处颜色的值
颜色调和不可能作用于颜色表指定的值
点的属性包括点的颜色和大小
颜色函数
glColor (color);
大小函数
glPointeSize (size);
size
正浮点数表示,该值舍入得到一个整数,除非使用反走样处理。显示该点的水平和垂直像素数由size
决定,点大小为1.0时显示一个像素,大小为2.0时显示2x2的像素阵列
线的属性包括:颜色、线宽和线型
线可以生成如画笔和笔刷等其他效果
光栅实现中,类似于Bresenham算法,通过在每个取样位置处使用一个像素来生成标准线宽。其他线宽是标准线宽的整数倍,通过沿相邻平行线绘制额外的像素而显示
线型有实线、虚线、点线等
使用函数
glLineWidth(width);
设定线宽,width为实数,舍入得到最近的整数,如果舍入值为0,则使用标准线宽来显示。进行反走样处理时,为了减小锯齿感,会出现小数值的线宽
利用函数
glLineStipple(repeatFactor, pattern);
来设置当前线型
参数pattern
用来引入描述如何显示线段的一个16位整数。值为1的一位对应一个“开”像素,0位对应一个“关”像素。该pattern从低位开始应用于线路径。默认值为0xffff为一位都为1,显示实线。
整数参数repeatFactor
说明pattern中每一位重复应用多少次才轮到下一位。
默认的值是1
pattern应用在折线上不是由每一段线段的始端重新开始,而是从折线的第一个端点开始到最后一个端点结束。
我们使用32 × 32 的掩模。眼膜中值为1表示为对应像素设为当前颜色,值为0表示对应的帧缓存位置的值不变。
填充图案使用GLubyte以无符号字节进行描述,如同在bitmap函数中一样。
GLubyte fillPattern[] = {
0xff, 0x00, 0xff, 0x00, ...
};
再使用下面的函数将其用做当前的填充图案:
glPolygonStipple (fillPattern);
使用填充图案之前必须激活填充子程序。
glEnable (GL_POLYGON_STIPPLE);
使用如下语句关掉图案填充
glDisable (GL_POLYGON_STIPPLE);
上面描述的填充图案从屏幕的左下角开始一直平铺作用到右上角
glShadeModel (GL_SMOOTH);
glBegin (GL_TRIANGLES);
glColor3f (0.0, 0.0, 1.0);
glVertex2i (50, 50);
glColor3f (1.0, 0.0, 0.0);
glVertex2i (150, 50);
glColor3f (0.0, 1.0, 0.0);
glVertex2i (75, 150);
glEnd();
如果将三角形三个顶点的颜色设为一个单色,则用此单色填充三角形。
如果将glShadeModel
参数设为GL_FLAT
,则使用最后一个颜色进行填充。
我们可以仅显示多边形的边,来生成线框图或者多边形的空心显示。还可以通过显示一组顶点来显示多边形。这些选项通过如下函数选定
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
glFrontFace (vertexOrder);
vertexOrder
为 GL_CW
或GL_CCW
GL_CW
表示接下来描述的顺时针的面为前向面
GL_CCW
表示逆时针的面为前向面,为默认值
下述函数激活反走样子程序
glEnable (primitiveType);
primitiveType
被赋以符号常量 GL_POINT_SMOOTH
,GL_LINE_SMOOTH
,GL_POLYGON_SMOOTH
调用glEnable(GL_BLEND)
来激活颜色调和子程序
然后利用
glGetBooleanv ();
glGetFloatv();
glGetIntegerv();
glGetDoublev();
glPushAttrib (attrGroup );
glPopArrtrib ();
glPushClientAttrib( attrGroup);