请老师帮我看一下原因,Triangle类的代码如下:
class Triangle {
private val vertexShader = """
attribute vec4 vPosition;
uniform mat4 mTMatrix;
void main() {
gl_Position = mTMatrix * vPosition;
}
""".trimIndent()
private val triangleCoords = floatArrayOf(
0f, 0.5f, 0f,
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f
)
private val fragmentShader = """
precision mediump float;
uniform vec4 uColor;
void main() {
gl_FragColor = uColor;
}
""".trimIndent()
private val color = floatArrayOf(0.3f, 0.5f, 0.7f, 1f)
private var program: Int = 0
private val buffer: FloatBuffer = ByteBuffer.allocateDirect(triangleCoords.size * 4)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
private var positionHandler: Int = 0
private var colorHandler: Int = 0
private var matrixHandler: Int = 0
private val translateMatrix = FloatArray(16)
private var vboIds = IntArray(1)
private fun loadShader(type: Int, code: String): Int {
val shader = glCreateShader(type)
glShaderSource(shader, code)
glCompileShader(shader)
return shader
}
init {
buffer.put(triangleCoords)
buffer.position(0)
// 设置变换矩阵
Matrix.setIdentityM(translateMatrix, 0)
Matrix.scaleM(translateMatrix, 0, 1f, 1f, 1f)
val vertexShader = loadShader(GL_VERTEX_SHADER, vertexShader)
val fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentShader)
program = glCreateProgram()
glAttachShader(program, vertexShader)
glAttachShader(program, fragmentShader)
glLinkProgram(program)
glGenBuffers(1, vboIds, 0)
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0])
glBufferData(GL_ARRAY_BUFFER, buffer.capacity(), buffer, GL_STATIC_DRAW)
// unbind
glBindBuffer(GL_ARRAY_BUFFER, 0)
}
fun draw() {
glUseProgram(program)
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0])
positionHandler = glGetAttribLocation(program, "vPosition")
glEnableVertexAttribArray(positionHandler)
glVertexAttribPointer(positionHandler, 3, GL_FLOAT, false, 0, 0)
matrixHandler = glGetUniformLocation(program, "mTMatrix")
glUniformMatrix4fv(matrixHandler, 1, false, translateMatrix, 0)
colorHandler = glGetUniformLocation(program, "uColor")
glUniform4fv(colorHandler, 1, color, 0)
glDrawArrays(GL_TRIANGLES, 0, triangleCoords.size / 3)
glDisableVertexAttribArray(positionHandler)
glBindBuffer(GL_ARRAY_BUFFER, 0)
}
}