在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个三角形。