OpenGL ES for Android 绘制三角形

时间:2022-07-24
本文章向大家介绍OpenGL ES for Android 绘制三角形,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一个

有态度

的程序员

在Android中绘制三角形的顶点shader如下:

attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}

vPosition是顶点,由应用程序传入。

片段shader代码如下:

precision mediump float;
void main()
{
  gl_FragColor = vec4(1,0,0,1);
}

创建program:

private fun createProgram() {
            var vertexCode =
                AssetsUtils.readAssetsTxt(
                    context = context,
                    filePath = "glsl/triangle_vertex.glsl"
                )
            var fragmentCode =
                AssetsUtils.readAssetsTxt(
                    context = context,
                    filePath = "glsl/triangle_fragment.glsl"
                )
            mProgramHandle = GLTools.createAndLinkProgram(vertexCode, fragmentCode)
        }

triangle_vertex.glsl和triangle_vertex.glsl分别表示顶点shader和片段shader的文件,存放于assets/glsl目录下,readAssetsTxt为读取assets目录下文件的公用方法。

获取参数句柄:

vPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "vPosition")

初始化线的顶点数据,代码如下:

var vertexBuffer = GLTools.array2Buffer(
            floatArrayOf(
                0.0f, 0.5f, 0.0f, // top
                -0.5f, -0.5f, 0.0f, // bottom left
                0.5f, -0.5f, 0.0f  // bottom right
            )
        )

绘制:

override fun onDrawFrame(p0: GL10?) {
            GLES20.glUseProgram(mProgramHandle)
            vertexBuffer.position(0)
            GLES20.glEnableVertexAttribArray(vPositionLoc)
            GLES20.glVertexAttribPointer(vPositionLoc, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer)
            
            GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3)
        }

GL_TRIANGLES表示绘制三角形。

三角形的绘制有3种方式:

  • GL_TRIANGLES:3个顶点绘制一个三角形,即使三角形的顶点有重复的,也必须在顶点数组中声明。如果有6个顶点,那么1,2,3组成一个三角形,4,5,6组成一个三角形。
  • GL_TRIANGLE_STRIP:前一个三角形的后两个顶点,和接下来的一个顶点组成另外一个三角形,如果有6个顶点,组成三角形的顶点有(1,2,3)、(2,3,4)、(3,4,5)、(4,5,6)共4个三角形,所以有N个顶点,则绘制出的三角形有N-2个。
  • GL_TRIANGLE_FAN :以第一个点为中心点,其它顶点作为边缘点绘制出组成扇型的相邻三角形,如果有6个顶点,组成三角形的顶点有(1,2,3)、(1,3,4)、(1,4,5)、(1,5,6)共4个三角形