OpenGL ES for Android 绘制线

在这里插入图片描述
在Android中绘制一条直线的顶点shader如下:

attribute vec4 vPosition;

void main() {
    gl_Position = vPosition;
}

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

片段shader代码如下:

precision mediump float;
uniform vec4 u_color;
void main()
{
    gl_FragColor = u_color;
}

u_color 是线的颜色,由应用程序传入。

创建program:

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

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

获取参数句柄:

vPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "vPosition")
uColorLoc = GLES20.glGetUniformLocation(mProgramHandle, "u_color")

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

val vertexBuffer = GLTools.array2Buffer(
            floatArrayOf(
                -0.5F, 0.5F, 0F,
                0.5F, 0.5F, 0F,
                0.5F, -0.5F, 0F,
                -0.5F, -0.5F, 0F
            )
        )

初始化线的颜色数据,代码如下:

val colorBuffer = GLTools.array2Buffer(
            floatArrayOf(
                //r,g,b,a
                1F, 0F, 0F, 1F
            )
        )

绘制:

override fun onDrawFrame(gl: GL10?) {
            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
            GLES20.glUseProgram(mProgramHandle)

            vertexBuffer.position(0)
            GLES20.glEnableVertexAttribArray(vPositionLoc)
            GLES20.glVertexAttribPointer(vPositionLoc, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer)

            GLES20.glUniform4fv(uColorLoc, 1, colorBuffer)

            GLES20.glDrawArrays(GLES20.GL_LINES, 0, 4)
        }

设置顶点数据和颜色数据,GLES20.GL_LINES表示绘制线。

线的绘制有3种方式:

  • GL_LINES:俩俩组成一条直线,比如上面的4个点分别编号为1,2,3,4,1和2组成一条直线,3和4组成一条直线,如果点点个数为奇数,那么最后一个点将会抛弃。
  • GL_LINE_STRIP:还是上面的4个点,1和2,2和3,3和4各组成一条直线。
  • GL_LINE_LOOP:和GL_LINE_STRIP相比多了一个最后一个点和第一个点的连线。
    效果图如下:
    在这里插入图片描述

往期推荐

发布了123 篇原创文章 · 获赞 68 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/mengks1987/article/details/104092642