1、绘图工具箱
- 重新定义一个矩形区域,把它作为新的渲染画布
- 定义一个用于绘制物体的坐标系统
- void glBegin(GLenum mode);标志着一个顶点数据列表的开始,它描述了一个几何图元。mode参数指定了图元的类型,它可以是表3-1列出的任何一个值。
- void glEnd(void);标志着一个顶点数据列表的结束。
- void glEnable(GLenum capability);
- void glDisable(GLenum capability);
glEnable()用于启用功能,glDisable()用于关闭。有60多个枚举值可用作glEnalbe()或glDisable()的参数,其中包括GL_BLEND、GL_DEPTH_TEST等。
- GLboolean glIsEnabled(GLenum capability);
该函数根据被查询的功能是否被启动,返回GL_TRUE或GL_FALSE。
上述状态只有两种,开和关。大多数OpenGL函数为更复杂的状态变量设置值。例如,函数glColor3f()设置三个值,它们是状态GL_CURRENT_COLOR的组成部分。
可以使用的查询函数共有5个,可以查询许多状态的当前值如表3-3:
void glGetPointerv(GLenum pname, GLvoid **params);
表3-3
这些函数分别获得布尔值、整型、浮点型、双精度型和指针型变量的值。pname参数是一个符号常量,表示需要返回的状态变量。params是一个数组指针,指向包含返回数据的位置
4、显示点、直线和多边形
默认情况下,点在屏幕上被绘制为1个像素;直线被绘制为宽度为1个像素的实线,多边形被绘制成实心(solid)填充的形式。
<1>点的细节
void glPointSize(GLfloat size);
该函数设置被渲染点的宽度(单位为像素),size必须大于0.0,默认值为1.0。
对于各种大小的点,根据是否启用了抗锯齿功能,将在屏幕上绘制一些列像素。反走样是一种使点和直线更平滑的技术。如果不使用(默认设置),用小数表示的宽度将舍入为整数,然后绘制一个与屏幕平行的方形像素区域。因此,如果宽度为1.0,则方形区域为1*1像素;如果宽度为2.0,则方形区域为2*2像素,依次类推。
如果启动了抗锯齿或多重采样,将绘制一个圆形像素区域,并将边界上的像素画的暗些,使边缘显得较为光滑。在这种模式下,对非整数宽度进行舍入。glGetFloatv(),查看支持点的最大和最小尺寸。参数为GL_ALIASED_POINT_RANGE(未进行抗锯齿处理)或GL_SMOOTH_POINT_SIZE_RANGE(进行了抗锯齿处理)
例如:glPointSize(2.37);并且返回的粒度值为0.1,那么这个点的大小将四舍五入为2.4
<2>直线的细节
在OpenGL中,可以指定线宽和各种点画方式:点线(dottedline)、短划线(dashed)以及交替使用点和短划线而成的段线(dash line)等。
- void glLineWidth(GLfloat width);该函数以像素为单位设置线宽;参数width的值必须大于0.0,默认为1.0。
如果抗锯齿和多重采样被启用,渲染直线时将受影响。抗锯齿没有被启动时,如果宽度为1、2、3,将绘制宽度分别为1个、2个和3个像素的直线;抗锯齿被启动时,可支持非整数线宽,同时边缘像素通常暗些。同点尺寸一样,OpenGL实现可能将非抗锯齿直线的最大宽度限制为最大的抗锯齿线宽。
- void glLineStipple(GLint factor,GLushort pattern); //pattern 参数是一个由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素地进行处理。如果模型中对应的位是1,就绘制这个像素,否则就不绘制。factor表示重复因子,它与0和1的连续子序列相乘。例如:
glLineStipple(1,0x3F07);//0x3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先是连续绘制3个像素,然后连续5个像素留空,然后再连续绘制6个像素。最后2个像素留空。如果factor是2,那么这个模式被扩展为:绘制6个像素,留空10个像素、绘制12个像素,最后留空4个像素。
点画线可以和宽直线一起使用,以产生宽点画线。
- glEnable(GL_LINE_STIPPLE);
3.多边行的细节
一般情况下,多边形是按填充模式绘制的,边界之内的像素均被绘制。但是,也可以把它们画成轮廓形式,甚至只绘制它们的顶点。填充多边形可以是实心填充,也可以用某种模式进行点画填充。相邻的填充多边形如果共享一条边或一个顶点,组成这条边或这个顶点的像素只绘制一次,它们只包含在其中一个多边形中。这样,部分透明的多边形的边不会绘制两次,它们的边缘看上去不会更暗。为了对填充多边形进行抗锯齿处理,强烈推荐使用多重采样。
-
点、轮廓或实心形式的多边形
多边形具有正面和背面两个面。取决于哪一面朝向观察者,多边形可能会被渲染成不同的样子。这样,就可以获得实心物体正反两面截然不同的剖视图。在默认情况下,多边形的正面和背面是按照相同的方式绘制的。为了更改这个行为,或者只绘制它的轮廓或顶点,可使用glPloygonMode(GLenum face, GLenum mode)函数。
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, GL_FILL);glPolygonMode(GL_BACK, GL_LINE);
- 反转和剔除多边形表面
按照约定,如果多边形的顶点以逆时针顺序出现在屏幕上,它便称为正面。可以根据方向一致的多边形构建任何合理实心表面。按照数学的术语,这种表面称为可定向簇。为了创建可定向的表面,可以使用全部是逆时针方向的多边形,也可以使用全部是顺时针方向的多边形,这正是可定向的数学定义。顶点的方向(顺时针或逆时针)又称为环绕。
在一个完全闭合的表面(由方向一致的不透明多边形所组成)上,所有的背面多边形都是不可见的,因为它们总是被多边形的正面所遮挡。如果观察者位于这个表面的外侧,可以启用剔除功能,丢弃哪些被OpenGL认为是背面的多边形。类似的,如果观察者位于物体的内侧,只有背面的多边形才是可见的。告诉OpenGL丢弃哪些不可见的正面或背面多边形,可以使用glCullFace()函数。当然,在此之前必须调用glEnable()函数启动剔除功能。 - 点画多边形
在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用之中用32*32位的窗口对齐的点画模式。glPolygonStipple()函数用于指定多边形的点画模式;启用多边形点画功能;glEnalbe(GL_POLYGON_STIPPLE);用同一个参数调用glDisalbe()函数可以禁用多边形点画功能。 - 标记多边形的边界边
在默认情况下,所有的顶点都标记为边界边的起点,但是可以使用glEdgeFlag*()函数手工控制边界标志(edge flag)的设置。这个函数在glBegin()和glEnd()之间调用,它将影响在之后所制定的所有顶点,直到再次调用glEdgeFlag()函数。它只用作用于那些为多边形、三角形和四边形所指定的顶点,对那些为三角形带或四边行带所指定的顶点无效。
void glEdgeFlag(GLboolean flag); void glEdgeFlagv(const GLboolean *flag);