Chapter 5 Attributes of Output Primitives (图元的属性) 点的属性 线的属性 填充区属性 字体属性(*) 反走样 2019/4/15 交通运输学院CAD/CAM研究所
属性 任何影响图元显示方法的参数称为属性参数. 颜色(color)和大小(size)等属性参数确定了图元的基本特性 维护属性和其他参数当前值表的图形系统称为状态系统或状态机 输出图元属性和当前帧缓存位置等其他参数称为状态系统或状态参数 【注】状态参数赋值后,会一直保留到下次改变。 2019/4/15 交通运输学院CAD/CAM研究所
Point attributes(点属性) In OpenGL, a point is represented by a set of floating-point numbers called a vertex. the size of a point is specified by void glPointSize( GLfloat size ) Default: size=1.0(in pixels); The actual collection of pixels on the screen that are drawn for various point widths depends on whether antialiasing(反走样) is enabled. Details: Refer to OpenGL Redbook 2712.html 2019/4/15 交通运输学院CAD/CAM研究所
Line Attributes(线属性) (Line type, Width and Color) 激活与关闭线型函数 glEnable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE); 每像素重复次数 2019/4/15 交通运输学院CAD/CAM研究所
0000,1100,0000,1111 0x0C0F Stippled Lines Wide Stippled Lines 每像素重复次数 2019/4/15 交通运输学院CAD/CAM研究所
Additional Line Attributes Line caps (p149) Pen and brush options (p150) 2019/4/15 交通运输学院CAD/CAM研究所
Curve Attributes Are similar to line attributes. See p152. 2019/4/15 交通运输学院CAD/CAM研究所
glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); void glexam (void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); glEnable(GL_LINE_STIPPLE); glLineWidth(5.0); glLineStipple(2, 0x0101); glBegin(GL_LINES); glVertex2i(20, 20); glVertex2i(30, 9); glEnd(); glLineStipple(2, 0x00FF); glVertex2i(20, 16); glVertex2i(30, 16); glDisable(GL_LINE_STIPPLE); glFlush ( ); } // GL 标准调用流程 void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0) glMatrixMode (GL_PROJECTION) gluOrtho2D (20, 30, 8, 20) } 2019/4/15 交通运输学院CAD/CAM研究所
Chapter 5 Attributes of Output Primitives (图元的属性) 点的属性 线的属性 填充区属性 字体属性(*) 反走样 2019/4/15 交通运输学院CAD/CAM研究所 9
Antialiasing反走样 Concept of Aliasing走样概念 Antialiasing Tech.反走样技术
Concept of Aliasing走样概念 在分辨率较低时,会出现明显锯齿形状,能否优化? Problem Concept of Aliasing走样概念 Def. The distortion of information due to low-frequency sampling (undersampling) is called aliasing. 图形数字化过程中,由于低频采样而造成的图形畸变->走样 走样最简单解决办法Simple method Display objects at higher resolution提高分辨率
将每个物理像素细分成 nXn个子像素,再用Bresenham算法选择子像素,每个物理像素上的子像素取值在1到n之间,即亮度等级。 反走样--直线段的过取样 1)子分像素法 通过直线穿过像素点面积 用不同亮度显示 亮度等级确定: 将每个物理像素细分成 nXn个子像素,再用Bresenham算法选择子像素,每个物理像素上的子像素取值在1到n之间,即亮度等级。
反走样--直线段的过取样 2)有限宽度法 将每个物理像素细分成 nXn个子像素,并将线段视为有限宽度的多边形,若子像素上的左下角在区域内,则把该子像素作为线段内,其子像素的个数为亮度值。取值在1到 nXn 之间,即为亮度等级
效果对比 10 20 22 21 12 11 2019/4/15 交通运输学院CAD/CAM研究所 14
W权值? 反走样--直线段的过取样 1 2 4 . Filtering Tech(过滤技术) 3 子像素的加权掩模 过取样的算法经常在实现时将 更大的权值赋给接近于像素中心的 子像素,希望这些子像素在该像素 的显示亮度中有更重要的作用。 1 2 4 W权值? . Filtering Tech(过滤技术)
4. Filtering Tech(过滤技术) 过滤技术是一种更精确的反走样方法。 类似于应用加权像素掩模,用一个连续的加权曲面(或过滤函数)覆盖像素,而不是一个离散的象素掩模。 用正方形、圆锥和高斯函数作为过滤函数 应用过滤函数的方法是将像素曲面集成来得到加权的平均亮度 为减少计算,常用查找表来求整数值。
可以用正方形、圆锥和高斯函数作为过滤函数。应用过滤函数的方法类似于应用加权掩模,但现在是将像素曲面集成来得到加权的平均亮度。为减少计算,常用查找表来求整数值。
OpenGL 反走样函数 glEnable (GL_LINE_SMOOTH); glEnable (GL_BLEND); 激活线反走样,点、多边形的参数为GL_POINT_SMOOTH,GL_POLYGON_SMOOTH glEnable (GL_BLEND); 激活颜色调和操作。 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 混合函数,指定颜色调和方法。 void glHint(GLenum target, GLenum hint); 设定反走样。参数GLenum hint的取值:GL_FASTEST, GL_NICEST,GL_DONT_CARE 例:glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE); 参见:Redbook Chapter 7Blending, Antialiasing, and Fog 例程:point_and_attr.txt point_and_attr.exe arrgb.txt arrgb.exe 2019/4/15 交通运输学院CAD/CAM研究所
arrgb.txt arrgb.exe // *** 设置反走样代码 开始 *** //glEnable (GL_LINE_SMOOTH);//激活线反走样,点、多边形的参数为GL_POINT_SMOOTH,GL_POLYGON_SMOOTH //glEnable (GL_BLEND);//激活颜色调和操作。 //glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//混合函数,指定颜色调和方法。 //glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE); // *** 设置反走样代码 结束 *** 2019/4/15 交通运输学院CAD/CAM研究所
作业更新 采用OpenGL的点/线/填充/字符函数,输出漂亮的图案。(要求把学号、姓名等信息嵌入图案中)。 2019/4/15 交通运输学院CAD/CAM研究所
Example for Filled Polygon Example: polygon.c POLYGON.EXE Comments: “The interior is filled according to the state of the relevant attributes. Note that a mathematical polygon has an inside and an outside that are separated by the edge. The edge itself has no width. Consequently, most graphics system allow you to fill the polygon with a color or pattern or to draw lines around the edges, but not to do both. In OpenGL, we can use the function glPolygonMode to select edges instead of fill the default. However, if we want to draw a polygon that is filled and to display its edges, then we have to draw it twice, once in each mode, or to draw a polygon and a line loop with the same vertices.” 2019/4/15 交通运输学院CAD/CAM研究所