移植多边形和四边形时,请记住以下几点:
- 没有直接等效的 凹 (TRUE) 。 可以改用 GLU 中的细化例程,如 细化多边形中所述。
- 多边形模式的设置方式不同。
- 这些多边形绘制函数在 OpenGL 中没有直接等效项:例程的 poly 系列; 常规的 polf 系列; pmv、 pdr 和 pclos; rpmv 和 rpdr; splf;和 spclos。
如果 IRIS GL 代码使用这些函数,则必须使用 glBegin ( GL_POLYGON ) 重写代码。
下表列出了 IRIS GL 多边形绘制函数及其等效的 OpenGL 函数。
IRIS GL 函数 | OpenGL 函数 | 含义 |
---|---|---|
bgnpolygonendpolygon | glBegin ( GL_POLYGON ) glEnd | 顶点定义简单凸多边形的边界。 |
glBegin ( GL_QUADS ) glEnd |
将四倍顶点解释为四边形。 | |
bgnqstripendqstrip |
glBegin ( GL_QUAD_STRIP ) glEnd |
将顶点解释为四边形的链接带。 |
glEdgeFlag | ||
polymode | glPolygonMode | 设置多边形绘制模式。 |
rectrectf |
glRect | 绘制矩形。 |
sboxsboxf |
绘制屏幕对齐的矩形。 |
??
移植多边形模式
OpenGL 函数 glPolygonMode 允许指定多边形 (该模式应用到的背面或正面) 的哪一侧。 其语法为:
void glPolygonMode( GLenum face, GLenum mode );
其中,人脸是以下项之一:
GLenum 值 | 含义 |
---|---|
GL_FRONT | 适用于正面多边形的模式 |
GL_BACK | 适用于后向多边形的模式 |
GL_FRONT_AND_BACK | 适用于正面和背面多边形的模式 |
GL_FRONT_AND_BACK模式等效于 IRIS GL polymode 函数。 下表列出了 IRIS GL 多边形模式及其等效的 OpenGL 模式。
IRIS GL 模式 | OpenGL 模式 | 含义 |
---|---|---|
PYM_POINT | GL_POINT | 将顶点绘制为点。 |
PYM_LINE | GL_LINE | 将边界边缘绘制为线段。 |
PYM_FILL | GL_FILL | 绘制填充的多边形内部。 |
PYM_HOLLOW | 仅填充边界处的内部像素。 |
移植多边形笔尖
移植 IRIS GL 多边形时,请记住以下几点:
- OpenGL 不对多边形使用表;仅保留一个 stipple 模式。 可以使用显示列表来存储不同的安装模式。
- OpenGL 多边形位图大小始终为 32x32 位模式。
- Stipple 编码受 glPixelStore 的影响。
有关移植多边形 stipple 的详细信息,请参阅 移植像素操作。
下表列出了 IRIS GL 多边形功能及其等效的 OpenGL 函数。
IRIS GL 函数 | OpenGL 函数 | 含义 |
---|---|---|
defpattern | glPolygonStipple | 设置 Stipple 模式。 |
setpattern | OpenGL 仅保留一个多边形样式。 | |
getpattern | glGetPolygonStipple | 返回用于返回索引) (位图。 |
在 OpenGL 中,通过将GL_POLYGON_STIPPLE作为 glEnable 和 glDisable 的参数传递来启用和禁用多边形安装。
以下 OpenGL 代码示例演示多边形安装:
void display(void)
{
GLubyte fly[] = {
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[] = {
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, 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);
/* draw all polygons in white*/
glColor3f (1.0, 1.0, 1.0);
/* draw one solid, unstippled rectangle,*/
/* then two stippled rectangles*/
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 ();
}
移植细化多边形
在 IRIS GL 中,使用 凹形 (TRUE) ,然后使用 bgnpolygon 绘制凹形多边形。 OpenGL GLU 包括可用于绘制凹形多边形的函数。
使用 OpenGL 绘制凹形多边形
- 创建细化对象。
- 定义将用于处理细化器生成的三角形的回调。
- 指定要分割的凹形多边形。
下表列出了用于绘制细化多边形的 OpenGL 函数。
OpenGL GLU 函数 | 含义 |
---|---|
gluNewTess | 创建新的分割对象。 |
gluDeleteTess | 删除分割对象。 |
gluTessCallback | |
gluBeginPolygon | 开始多边形规范。 |
gluTessVertex | 指定轮廓中的多边形顶点。 |
gluNextContour | 指示下一系列顶点描述新的轮廓。 |
gluEndPolygon | 结束多边形规范。 |