GL LINE STRIP 顶点相连成为一系列线段 GL LINE LOOP 顶点相连成为一系列线段,连接 最后一点与第一点 GL TRIANGLE STRIP相连的三角形带 GL TRIANGLE FAN相连的三角形扇形 GL QUAD STRIP 相连的四边形带 例如下列程序语句定义如左图所示的图形。 glBegin(GL POLYGON) glVertex2f(0.0,0.0) glVertex2f(0.0, 3.0) glVertex2f(3.0, 3.0) 图51-3绘多边形或 GL POLYGON GL POINTS glVertex2f(4.0, 1.5) glVertex2f(3.0,0.0) lEndo 点、线和多边形在屏幕上绘制时,是有各自的缺省显示方式的。例如点绘成单个象素,线绘成一个象素宽 的实线,多边形绘成实的填充多边形。可以通过 OpenGL库提供的相应函数改变这些显示方式 点属性 void glPointSize(Glfloat size 以象素为单位设置点绘制的宽度 size点的宽度,必须大于0。缺省值为1.0。 注意,这里的点宽度可以不是整数。如果程序中没有设置反走样处理,那么非整数的宽度被截断为整数 例如宽度为10的点,在屏幕上显示的就是1×1象素的正方形。如果设置了反走样处理,点宽度不作取整运 算,此时表示点的象素群边界上的象素用较低亮度绘出,使边缘显得较平滑 ·线属性 void glLineWidth(Glfloat width) 以象素为单位设置线绘制的宽度。绘制线时的反走样处理与点的处理一样。 void glLineStipple(Glint factor, Glushort pattern) 指定点画模式(线型) factor指定线型模式中每位的乘数。 factor的值在[1255之间,缺省值为1 pattern用16位整数指定位模式。位为1时,指定要绘:位为0时,指定不绘。缺省时,全部为l。 位模式从低位开始。 例如:模式0×3f07,二进制表示为:0011111100000111,即是从低位起绘3个象素,不绘5个象素, 绘6个象素和不绘2个象素来连成一条线。设 factor为2,则绘或不绘的象素相应都乘上2。 利用如下命令定义上述线型: glLineStipple (2, 0x3f07) glEnable(GL LINE STIPPLE 在定义线型后,必须用 glEnableo命令激活线型。下图表示用不同的模式和重复因子绘线。 当不激活线型时: pattern factor 去活线型时调用 diSable(GL_ LINE STIPPLE)。 计算机图形学第五章第142页共36页
计算机图形学 第五章 第 142 页 共 36 页 GL_LINE_STRIP 顶点相连成为一系列线段 GL_LINE_LOOP 顶点相连成为一系列线段,连接 最后一点与第一点 GL_TRIANGLE_STRIP 相连的三角形带 GL_TRIANGLE_FAN 相连的三角形扇形 GL_QUAD_STRIP 相连的四边形带 例如下列程序语句定义如左图所示的图形。 glBegin(GL_POLYGON); glVertex2f(0.0,0.0); glVertex2f(0.0,3.0); glVertex2f(3.0,3.0); 图 5-1-3 绘多边形或一 组点 glVertex2f(4.0,1.5); glVertex2f(3.0,0.0); glEnd(); 3. 设置几何要素的属性 点、线和多边形在屏幕上绘制时,是有各自的缺省显示方式的。例如点绘成单个象素,线绘成一个象素宽 的实线,多边形绘成实的填充多边形。可以通过 OpenGL 库提供的相应函数改变这些显示方式。 • 点属性 void glPointSize(Glfloat size); 以象素为单位设置点绘制的宽度。 size 点的宽度,必须大于 0。缺省值为 1.0。 注意,这里的点宽度可以不是整数。如果程序中没有设置反走样处理,那么非整数的宽度被截断为整数。 例如宽度为 1.0 的点,在屏幕上显示的就是 象素的正方形。如果设置了反走样处理,点宽度不作取整运 算,此时表示点的象素群边界上的象素用较低亮度绘出,使边缘显得较平滑。 • 线属性 void glLineWidth(Glfloat width); 以象素为单位设置线绘制的宽度。绘制线时的反走样处理与点的处理一样。 void glLineStipple(Glint factor,Glushort pattern); 指定点画模式(线型)。 factor 指定线型模式中每位的乘数。factor 的值在[1,255]之间,缺省值为 1。 pattern 用 16 位整数指定位模式。位为 1 时,指定要绘;位为 0 时,指定不绘。缺省时,全部为 1。 位模式从低位开始。 例如:模式 0x3f07,二进制表示为:0011 1111 0000 0111,即是从低位起绘 3 个象素,不绘 5 个象素, 绘 6 个象素和不绘 2 个象素来连成一条线。设 factor 为 2,则绘或不绘的象素相应都乘上 2。 利用如下命令定义上述线型: glLineStipple(2,0x3f07); glEnable(GL_LINE_STIPPLE); 在定义线型后,必须用 glEnable()命令激活线型。下图表示用不同的模式和重复因子绘线。 当不激活线型时: pattern factor 0xffff 1 去活线型时调用 glDisable(GL_LINE_STIPPLE)
PATTERN FACTOR OXOOFF OXOOFF OXOCOF OXOCOF OXAAAA OXAAAA 213123 OXAAAA 二 OXAAAA 图5-1-4各种参数下的线型 多边形属性 通常多边形用实模式填充,但也可以利用下面命令 glPolygonStippleo指定某种点画模式(图案)来填 充。多边形也存在反走样,而且较点和线更复杂。 void glPolygonStipple(const Glubyte *mask) 该函数指定多边形点画模式。 mask指定32X32点画模式(位图)的指针,当值为1时绘:当值为0时不绘。 指定多边形点画模式需要利用 glEnablet激活,也利用 glDisableO去活。 glEnable(GL POLYGON STIPPLE glDisable(GL POLYGON STIPPLE 下面的程序运行结果为三个矩形区域,其中第一个矩形只使用了实模式,第二和第三个矩形使用了点画模 程序5.1.2多边形的填充 include <Gu/gl.h> #include <Gu/glu.h> #include <Gu/glaux. h> void display(void) GLubyte fly={∥第二个矩形点画模式的mask值 0x00.0X00.0X00.0x00.0X00.0X00.0X00.0x00 0X03,0x80,0x01,0xC0,0x06,0xC0,0x03,0x60 0×04,0x60,0x06,0x20,0x04,0x30,0x0C,0x20, 0x04,0x18,0x18,0x20,0x04,0x0C,0x30,0x2〔 0x04,0x06,0×60,0x20,0x44,0x03,0XC0,0x22 0×44,0x01,0x80,0x22,0x44,0x01,0x80,0X22 0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22 0×44,0x01,0x80,0x22,0x44,0x01,0X80,0x22, 0x66,0x01,0x80,0x66,0x33,0x01,0x80,0CC, 0x19,0x81,0x81,0x98,0xOC,0xC1,0Xx83,030, 0x07,0xe1,0x87,0xe0,0x03,0x3f,0xftc,0xc0 00a080ga0 0x18,0Xcc,0×33,0x18,0x10,0xc4,0x23,0x08 0x10,0x63,0x6,0x08,0x10,0x30,0x0c,0x08 0x10,0x18,0X18,0x08,0x10,0x00,0x00,0x08 } GLubyte halftone]={第三个矩形点画模式的mask值 OXAA. OXAA. OXAA. OXAA 0x 550X55 0X550x55 0xAA,OxAA,0xAA,0xAA,0x55,0x55,0×55,0x55, OXAA. OXAA. OXAA. OXAA. 0X55 0X55 0X55 0X55 OXAA. OXAA. OXAA. OXAA. 0x55. 0X55. 0x55 0X55 OXAA, OXAA, OXAA, OXAA, 0X55, 0X55, 0X55, 0x55 OXAA, OXAA, OXAA, OXAA, 0X55, 0x55, 0X55, 0X55 OXAA, OXAA, OXAA, OxAA, 0x55, 0X55, 0X55, 0x55 OXAA, OXAA, OXAA, OXAA, 0X 55, 0X55, 0X55, 0x55 0xAA,0xAA,OXAA,0xAA,0x55,0×55,055,0×55, 计算机图形学第五章第143页共36页
计算机图形学 第五章 第 143 页 共 36 页 图 5-1-4 各种参数下的线型 • 多边形属性 通常多边形用实模式填充,但也可以利用下面命令 glPolygonStipple()指定某种点画模式(图案)来填 充。多边形也存在反走样,而且较点和线更复杂。 void glPolygonStipple(const Glubyte* mask); 该函数指定多边形点画模式。 mask 指定 点画模式(位图)的指针,当值为 1 时绘;当值为 0 时不绘。 指定多边形点画模式需要利用 glEnable()激活,也利用 glDisable()去活。 glEnable(GL_POLYGON_STIPPLE); glDisable(GL_POLYGON_STIPPLE); 下面的程序运行结果为三个矩形区域,其中第一个矩形只使用了实模式,第二和第三个矩形使用了点画模 式。 程序 5.1.2 多边形的填充 #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void display(void) { GLubyte fly[] = { //第二个矩形点画模式的 mask 值 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20, 0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, 0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30, 0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, 0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, 0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30, 0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, 0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, 0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08 }; GLubyte halftone[] = { //第三个矩形点画模式的 mask 值 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55
0xAA,OxAA,0xAA,0xAA,0x55,0x55,0×55,0x55, OXAA, OXAA, OXAA, OXAA, 0X55, 0X55, 0X55, 0X55 OXAA, OxAA, OxAA, 0XAA, 0x55, 0X55, 0x 55, 0X55 OXAA, OXAA, OXAA, OXAA, 0X 55, 0X55, 0X55, 0x55 OXAA,0xAA,0xAA,0xAA,0x55,0×55,0×55,0x55 0xAA,0xAA,0xAA,OxAA,0x55,0X55,0×55,0x55, OXAA, OXAA, OxAA, OXAA, 0x55, 0x55, 0x 55, 0X55 glClear(GL COLOR BUFFER BIT) glColor3f(1.0,1.0,1.0) glRectf(25.0,25.0,125.0.1250); glEnable(GL POLYGON STIPPLE); glPolygon Stipple(fly) glRectf(125.0,25.0,225.0,1250) pOlygon Stipple(halftone) Rect(225.0,25.0,3250,12 glDisable(GL POLYGON STIPPLE) glFlush (: void myinit (void gIClearColor(0.0,0.0,0.0,0.0) glShadeModel (GL FLAT } int main(int argc, char"*argv) auxInitDisplay Mode(AUX SINGLE AUX RGBA); auxInitPosition(0, 0, 350, 150) auxInitWindow(argv[oD; myinit o auxMainLoop(display) 图5-1-5程序51.2的运行结果 上图中第二个矩形的苍蝇图形比较复杂,下面具体给出它的设置说明: 计算机图形学第五章第144页共36页
计算机图形学 第五章 第 144 页 共 36 页 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55 }; glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glRectf (25.0, 25.0, 125.0, 125.0); glEnable (GL_POLYGON_STIPPLE); glPolygonStipple (fly); glRectf (125.0, 25.0, 225.0, 125.0); glPolygonStipple (halftone); glRectf (225.0, 25.0, 325.0, 125.0); glDisable (GL_POLYGON_STIPPLE); glFlush (); } void myinit (void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } int main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 350, 150); auxInitWindow (argv[0]); myinit (); auxMainLoop(display); } 图 5-1-5 程序 5.1.2 的运行结果 上图中第二个矩形的苍蝇图形比较复杂,下面具体给出它的设置说明:
18643168421128解32168421126431684211264316842 128643216842 缺省时,毎个字节的最高位在先。位的次序可调用 glPixelStore O加以改变。 图5-1-6构成多边形点画模式 计算机图形学第五章第145页共36页
计算机图形学 第五章 第 145 页 共 36 页 图 5-1-6 构成多边形点画模式
4.控制多边形绘制 多边形的绘制通常是在多边形闭合边界内填充全部象素,但也可以只绘多边形边框,或只绘多边形顶点。 由于多边形面存在正面和背面,所以需要控制反转多边形面和剔除不绘的面。此外,有时多边形还需控制边 界线的绘制。 ·选择绘制多边形的方式 利用下面函数可以选择绘多边形的方式 oid glPolygonMode(GLenum face, GLenum mode) face控制多边形的正面和背面的绘图方式 GL FRONT AND BACK正面和反面都画 L FRONT只画正面 GL_BACK只画反面 mode控制绘点、线框或填充多边形。 GL POINT用有一定间隔的点填充 GL_LINE只画多边形的边框 FIL填充多边形 缺省值: glPolygonMode( GL FRONT AND BACK. GL FILL 即多边形的正、背面都用填充绘制。 例如,下面两个函数的调用,多边形正面是填充的和背面是线框的。 glPolygonMode(GL_ FRONT, GL_FILL) glPolygonMode(GL BACK, GL LINE) 反转多边形面 在 OpenGL中,每个多边形被认为是由两个面组成的:正面和反面。缺省时,在屏幕上以逆时针方向出现 顶点的多边形称为正面,反之为背面。用户也可以利用函数 gl FrontFace自行设置多边形的正面方向 void glFront Face(Glenum mode) 该函数定义多边形的正面方向 mode GL Cw(顺时针方向为正面) GL_Cw(逆时针方向为正面,缺省值) ·裁减多边形面 由一致方向的多边形构成完全闭合的曲面,其背面多边形总是被正面多边形所遮挡。因此,通过 OpenGl 确定为背面时剔除这些多边形,可以极大地提高几何体的绘制速度。同样,如果处在几何对象内部,只是背 面多边形是可见时,则剔除正面多边形。利用函数 glCullFace0,选择剔除(cul1)正面或背面多边形,在这 之前需利用 glEnbleo激活剔除处理 void glCullFace(GLenum mode) 指定剔除正面或背面多边形 mode L front剔除正面 GL FRONT AND BACK剔除全部 利用下面函数激活或去活多边形剔除 glEnable(GL CULL FACE) glDisable(GL CULL FACE) 5.法向量 法向量是垂直于面的方向上点的向量。在平展的面上,各个点有同一个方向:在弯曲的面上,各个点具有 不同的法向量 几何对象的法向量定义了它在空间中的方向。在进行光照处理时,法向量是一项重要的参数,因为法向量 决定了该对象可以接收多少光照。 ·指定法向量 利用下面函数 gINorma0设置当前法向量。 void glNormal3 (bsidt(TYPE nx, TYPE ny, TYPE nz) void gINormal3 bsdf/v(const TYPE V); nx, ny, nz指定法向量的xy和z坐标。法向量的缺省值为(0,0,1) V指定当前法向量的xy和z三元组(即矢量形式)的指针 用 gNormal'O指定的法向量不一定为单位长度。如果利用命令 glEnable( GL NORMALIZ日激活自动规 格化法向量,则经过变换后,就会自动规格化 gINorma0所指定的法向量。 计算机图形学第五章第146页共36页
计算机图形学 第五章 第 146 页 共 36 页 4. 控制多边形绘制 多边形的绘制通常是在多边形闭合边界内填充全部象素,但也可以只绘多边形边框,或只绘多边形顶点。 由于多边形面存在正面和背面,所以需要控制反转多边形面和剔除不绘的面。此外,有时多边形还需控制边 界线的绘制。 • 选择绘制多边形的方式 利用下面函数可以选择绘多边形的方式。 void glPolygonMode(GLenum face,GLenum mode); face 控制多边形的正面和背面的绘图方式。 GL_FRONT_AND_BACK 正面和反面都画 GL_FRONT 只画正面 GL_BACK 只画反面 mode 控制绘点、线框或填充多边形。 GL_POINT 用有一定间隔的点填充 GL_LINE 只画多边形的边框 GL_FILL 填充多边形 缺省值:glPolygonMode(GL_FRONT_AND_BACK,GL_FILL) 即多边形的正、背面都用填充绘制。 例如,下面两个函数的调用,多边形正面是填充的和背面是线框的。 glPolygonMode(GL_FRONT,GL_FILL); glPolygonMode(GL_BACK,GL_LINE); • 反转多边形面 在 OpenGL 中,每个多边形被认为是由两个面组成的:正面和反面。缺省时,在屏幕上以逆时针方向出现 顶点的多边形称为正面,反之为背面。用户也可以利用函数 glFrontFace()自行设置多边形的正面方向。 void glFrontFace(Glenum mode); 该函数定义多边形的正面方向。 mode GL_CW(顺时针方向为正面) GL_CCW(逆时针方向为正面,缺省值) • 裁减多边形面 由一致方向的多边形构成完全闭合的曲面,其背面多边形总是被正面多边形所遮挡。因此,通过 OpenGL 确定为背面时剔除这些多边形,可以极大地提高几何体的绘制速度。同样,如果处在几何对象内部,只是背 面多边形是可见时,则剔除正面多边形。利用函数 glCullFace(),选择剔除(cull)正面或背面多边形,在这 之前需利用 glEnble()激活剔除处理。 void glCullFace(GLenum mode); 指定剔除正面或背面多边形。 mode GL_FRONT 剔除正面 GL_BACK 剔除背面(缺省值) GL_FRONT_AND_BACK 剔除全部 利用下面函数激活或去活多边形剔除: glEnable(GL_CULL_FACE); glDisable(GL_CULL_FACE); 5. 法向量 法向量是垂直于面的方向上点的向量。在平展的面上,各个点有同一个方向;在弯曲的面上,各个点具有 不同的法向量。 几何对象的法向量定义了它在空间中的方向。在进行光照处理时,法向量是一项重要的参数,因为法向量 决定了该对象可以接收多少光照。 • 指定法向量 利用下面函数 glNormal*()设置当前法向量。 void glNormal3{bsidf}(TYPE nx,TYPE ny,TYPE nz); void glNormal3{bsidf}v(const TYPE* v); nx,ny,nz 指定法向量的 x,y 和 z 坐标。法向量的缺省值为(0,0,1)。 v 指定当前法向量的 x,y 和 z 三元组(即矢量形式)的指针。 用 glNormal*()指定的法向量不一定为单位长度。如果利用命令 glEnable(GL_NORMALIZE)激活自动规 格化法向量,则经过变换后,就会自动规格化 glNormal*()所指定的法向量