3.1节介绍了封闭多义线,即多边形的绘制。本节介绍多边形围成的面的绘制。
多边形面的类型
OpenGL可以绘制的面包括三角形面、四边形面、以及由三角形组成的条带和扇区、由四边形组成的条带和扇区,以及任意简单多边形。如下所示:
code.vc#.net
Gl.glBegin(Gl.GL_TRIANGLES); // 三角形(每3个顶点)
Gl.glBegin(Gl.GL_TRIANGLE_STRIP); // 三角形条带
Gl.glBegin(Gl.GL_TRIANGLE_FAN); // 从第一个顶点开始的三角形扇
Gl.glBegin(Gl.GL_QUADS); // 四边形(每4个顶点)
Gl.glBegin(Gl.GL_QUAD_STRIP); // 四边形条带
Gl.glBegin(Gl.GL_POLYGON); // 任意简单多边形
三角形面
下面的代码绘制红色三角形面。
code.vc#.net
Gl.glColor3f(1.0F, 0.0F, 0.0F); // 红色
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex2f(0.0F, 0.5F); // 顶部
Gl.glVertex2f(-0.5F, -0.5F); // 左下
Gl.glVertex2f(0.5F, -0.5F); // 右下
Gl.glEnd();
三角形扇
下面的代码用连续多个三角形组成扇形面。圆形面就可以由一组三角形面组成。
code.vc#.net
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
Gl.glVertex2f(0.0F, 0.0F); // 圆心
for(int i = 0; i <= 36; i++)
{
float angle = (float)(i * 10.0 * Math.PI / 180.0);
Gl.glVertex2f(
(float)Math.Cos(angle) * 0.5F,
(float)Math.Sin(angle) * 0.5F
);
}
Gl.glEnd();
多边形面的模型
多边形面可以有顶点模型、线框模型和曲面模型等三种模型,如下所示。
code.vc#.net
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL); // 曲面(默认)
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE); // 线框
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_POINT); // 顶点
面剔除
面有正面和反面,可以用Gl.glCullFace()函数剔除背面或正面。
code.vc#.net
Gl.glEnable(Gl.GL_CULL_FACE);
Gl.glCullFace(Gl.GL_BACK); // 剔除背面(默认)
Gl.glCullFace(Gl.GL_FRONT); // 剔除正面
Gl.glFrontFace(Gl.GL_CCW); // 逆时针为正面(默认)
Gl.glFrontFace(Gl.GL_CW); // 顺时针为正面
绘多边形示例
本例绘制渐变色填充的三角形面,代码如下所示:
code.vc#.net
private void button1_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glPushMatrix();
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glColor3d(1.0, 0.0, 0.0);
Gl.glVertex3d(0, 8, 0);
Gl.glColor3d(0.0, 1.0, 0.0);
Gl.glVertex3d(-8, -8, 0);
Gl.glColor3d(0.0, 0.0, 1.0);
Gl.glVertex3d(8, -8, 0);
Gl.glEnd();
Gl.glPopMatrix();
Gl.glFinish();
simpleOpenGlControl1.SwapBuffers();
}
private void button2_Click(object sender, EventArgs e)
{
this.Dispose();
}
运行代码,生成图3-2所示的渐变色填充的三角形面。
\[\]
图3-2 生成渐变色填充的三角形面