Opengl ES2.0 android 学习02——glDrawArrays

// C function void glDrawArrays ( GLenum mode, GLint first, GLsizei count )

    public static native void glDrawArrays(
        int mode,
        int first,
        int count
    );

mode:可以有如下选项
public static final int GL_POINTS                                  = 0x0000;//点
public static final int GL_LINES = 0x0001;//线
public static final int GL_LINE_LOOP = 0x0002;//线段
public static final int GL_LINE_STRIP = 0x0003;
public static final int GL_TRIANGLES = 0x0004;
public static final int GL_TRIANGLE_STRIP = 0x0005;
public static final int GL_TRIANGLE_FAN = 0x0006;

first:从数组第几个开始

count:绘制的点数。
 

下面逐一实验这些mode 

一、GL_POINTS

package com.tian.studyopengles.points

import android.opengl.GLES20
import android.opengl.GLSurfaceView
import com.tian.studyopengles.utils.GL2Utils
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class OnePointsRender : GLSurfaceView.Renderer {
    private val V_SHADER_SOURCE = "" +
            "void main(){\n" +
            "gl_Position = vec4(0.0,0.0,0.0,1.0);\n" +
            "gl_PointSize = 10.0;\n" +
            "}"

    private val F_SHADER_SOURCE = "" +
            "void main(){\n" +
            "gl_FragColor = vec4(1.0,0.0,0.0,1.0);" +
            "}"

    private var mProgram: Int = -1
    override fun onDrawFrame(gl: GL10?) {
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
        GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 1)
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)

        mProgram = GL2Utils.createProgram(V_SHADER_SOURCE, F_SHADER_SOURCE)

        GLES20.glUseProgram(mProgram)
    }

}

这是最简单的,绘制一个固定的点。

如何绘制多个点?

package com.tian.studyopengles.points

import android.opengl.GLES20
import android.opengl.GLSurfaceView
import com.tian.studyopengles.utils.GL2Utils
import com.tian.studyopengles.utils.LogUtils
import java.nio.ByteBuffer
import java.nio.ByteOrder
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class MultiplePointsRender : GLSurfaceView.Renderer {
    private val V_SHADER_SOURCE = "" +
            "attribute vec4 a_Position;\n" +
            "void main(){\n" +
            "gl_Position = a_Position;\n" +
            "gl_PointSize = 20.0;\n" +
            "}"

    private val F_SHADER_SOURCE = "" +
            "void main(){\n" +
            "gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n" +
            "}"
    private val vertexPoints = floatArrayOf(
        0.0f, 0.0f,
        -0.5f, -0.5f,
        0.5f, 0.5f
    )
    private var mProgram: Int = -1

    override fun onDrawFrame(gl: GL10?) {
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
        GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 3)
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {

        mProgram = GL2Utils.createProgram(V_SHADER_SOURCE, F_SHADER_SOURCE)

        val buffer = ByteBuffer.allocateDirect(vertexPoints.size * 4)
            .order(ByteOrder.nativeOrder())
            .asFloatBuffer()
            .put(vertexPoints)
            .position(0)

        val position = GLES20.glGetAttribLocation(mProgram, "a_Position")
        GLES20.glVertexAttribPointer(position, 2, GLES20.GL_FLOAT, false, 0, buffer)
        GLES20.glEnableVertexAttribArray(position)

        GLES20.glValidateProgram(mProgram)
        val statusArray = IntArray(1)
        GLES20.glGetProgramiv(mProgram, GLES20.GL_VALIDATE_STATUS, statusArray, 0)

        val statusInfo = GLES20.glGetProgramInfoLog(mProgram)
        LogUtils.i("status code == ${statusArray[0]},status info == $statusInfo")

        GLES20.glUseProgram(mProgram)
    }

}

注意的点:1、shader不要写错,代码里面有工具方法,可以监测出是否出错。

                  2、因为是平面绘制,只用了(x,y)表示坐标,shader里面定义的是vec4 表示四个向量,此次表示默认第三和第四是(0.0,1.0)。

           GLES20.glVertexAttribPointer(position, 2, GLES20.GL_FLOAT, false, 0, buffer)中的2,表示是几个数据来表示一个顶点坐标。此处是(x,y)则所以是2
3、这三行,铁三角,先定位、再赋值、最后激活。
        val position = GLES20.glGetAttribLocation(mProgram, "a_Position")
        GLES20.glVertexAttribPointer(position, 2, GLES20.GL_FLOAT, false, 0, buffer)
        GLES20.glEnableVertexAttribArray(position)

具体可以查看https://github.com/tianjisheng/OpenGL-ES-2.0-android-learning/tree/master/app/src/main/java/com/tian/studyopengles/points

猜你喜欢

转载自www.cnblogs.com/mltx/p/11252099.html