3.1节介绍了封闭多义线,即多边形的绘制。本节介绍多边形围成的面的绘制。
多边形面的类型
OpenGL可以绘制的面包括三角形面、四边形面、以及由三角形组成的条带和扇区、由四边形组成的条带和扇区,以及任意简单多边形。如下所示:
code.vb.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.vb.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.vb.net
Gl.glBegin(Gl.GL_TRIANGLE_FAN)
Gl.glVertex2f(0.0F, 0.0F) ' 圆心
For i As Integer = 0 To 36
Dim angle As Single = CSng(i * 10.0 * Math.PI / 180.0)
Gl.glVertex2f(CSng(Math.Cos(angle)) * 0.5F, CSng(Math.Sin(angle)) * 0.5F)
Next
Gl.glEnd()
多边形面的模型
多边形面可以有顶点模型、线框模型和曲面模型等三种模型,如下所示。
code.vb.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.vb.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.vb.net
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
Gl.glPushMatrix()
'Gl.glColor3d(1.0#, 0.0#, 0.0#)
Gl.glLineWidth(2)
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()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Dispose()
End Sub
运行代码,生成图3-2所示的渐变色填充的三角形面。
\[\]
图3-2 生成渐变色填充的三角形面