数据传递

这里介绍OpenGL数据从Java代码如何一步一步渲染至屏幕

数据准备

由于Java运行在JVM中,所以在准备传递大块数据时(即C接口使用指针时),需要用到Buffer类。

代码示例

val colorAry = floatArrayOf(
        1f, 0f, 0f, 1f,
        0f, 1f, 0f, 1f,
        0f, 0f, 1f, 1f)
color = ByteBuffer
        .allocateDirect(colorAry.size * 4)
        .order(ByteOrder.nativeOrder())
        .asFloatBuffer()
        .put(colorAry)
        .position(0)

uniform、attribute、varying

uniform

uniform数据用于传递绘制期间的‘常量’,例如变换矩阵、光源、全局偏移、贴图等等。

attribute

attribute数据用于传递顶点数据,例如顶点坐标、顶点颜色、法线向量、贴图坐标等等。

varying

varying数据用于在顶点着色器与片段着色器间传递数据,与上两种数据不同,varying类型数据不能由着色器之外传入。

举个例子

VaryingFigure

绘制

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3)

如果我们顶点数据准备了足够三个顶点的数据的话,上访的操作将会调用三次顶点着色器,并利用顶点着色器生成的顶点最终坐标(gl_Position)生成一个屏幕上的三角形,并对屏幕上三角形内的每一个像素调用片段着色器,使用gl_FragColor的值输出到屏幕上。

常用接口

GLUniforms

GLVertexs

GLEnableVertex