请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

8-2 将FloatBuffer修改为VBO之后,三角形没有绘制出来

请老师帮我看一下原因,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)
    }
}

正在回答 回答被采纳积分+3

插入代码

1回答

李超 2024-02-25 08:21:42

看一下android studio 的输出信息里报啥错了

0 回复 有任何疑惑可以回复我~
  • 提问者 慕侠4793929 #1
    ```
    private val buffer: FloatBuffer = ByteBuffer.allocateDirect(triangleCoords.size * 4)
            .order(ByteOrder.nativeOrder())
            .asFloatBuffer()
    ```
    glBufferData(GL_ARRAY_BUFFER, buffer.capacity(), buffer, GL_STATIC_DRAW)
    
    找到原因了,感谢老师,我这里定义的数据类型和传入VBO的数据不对
    回复 有任何疑惑可以回复我~ 2024-02-25 19:03:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信