前面两篇文章介绍了怎样用OpenGL绘制点和线段,这篇文章来看看怎样绘制三角形。
把下面的代码复制到OpenGL Console里:
import java.nio.ByteBuffer import java.nio.ByteOrder import javax.media.opengl.GL def vertexShaderCode = """ attribute vec4 a_Position; void main() { gl_Position = a_Position; gl_PointSize = 10.0; } """ def fragmentShaderCode = """ precision mediump float; void main() { gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0); } """ def shaderProgram = glob.compileAndLink(vertexShaderCode, fragmentShaderCode) def aPositionLocation = gl.glGetAttribLocation(shaderProgram.objectId, "a_Position") shaderProgram.use() def BYTES_PER_FLOAT = 4 def POSITION_ELEMENT_COUNT = 2 def POINT_COUNT = 3 def vertices = [ 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.5f, ] as float[] def vertexData = ByteBuffer .allocateDirect(vertices.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer() vertexData.put(vertices) vertexData.position(0) gl.glVertexAttribPointer(aPositionLocation, POSITION_ELEMENT_COUNT, gl.GL_FLOAT, false, 0, vertexData) gl.glEnableVertexAttribArray(aPositionLocation) gl.glClear(gl.GL_COLOR_BUFFER_BIT) gl.glDrawArrays(gl.GL_TRIANGLES, 0, POINT_COUNT)点击Run Script按钮看效果:
def vertices = [ 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.5f, ] as float[]三个点(只有x和y坐标),正好构成一个三角形。
gl.glDrawArrays(gl.GL_TRIANGLES, 0, POINT_COUNT)GL_TRIANGLES告诉 glDrawArrays()方法我们要绘制的是三角形,POINT_COUNT参数说明一共有3个点需要处理。
如果只是简单的画三角形的话,每个三角形需要三个点。但如果几个三角形连在一起的话,就可以形成Triangle Strip。比如像下面这样的4个三角形,画成普通三角形需要12个点(nx3),画成Triangle Strip只需要6个点(n+2)就够了。
修改上面的代码:
... def POINT_COUNT = 6 def vertices = [ 0.0f, 0.0f, 0.1f,-0.4f, 0.2f, 0.0f, 0.3f,-0.4f, 0.4f, 0.0f, 0.5f,-0.4f, ] as float[] ... gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, POINT_COUNT)效果:
几个三角形还可以组成像下面这样的扇形:
修改代码:
... def POINT_COUNT = 5 def vertices = [ 0.0f, 0.0f, -0.2f, 0.4f, -0.1f, 0.5f, 0.1f, 0.5f, 0.2f, 0.4f, ] as float[] ... gl.glDrawArrays(gl.GL_TRIANGLE_FAN, 0, POINT_COUNT)效果: