android opengl GLES20:如何用每个模型矩阵绘制多个三角形? (表现不错))

Posted

技术标签:

【中文标题】android opengl GLES20:如何用每个模型矩阵绘制多个三角形? (表现不错))【英文标题】:android opengl GLES20: how to draw many triangles with each model matrix? (with good performance)) 【发布时间】:2016-06-12 16:30:07 【问题描述】:

我想用 android GLES20 制作一个音频可视化器。 captured image that I want to make

每个矩形的位置是(0, 0), (0, 1), (1, 1), (1, 0)

每个矩形都有不同的模型矩阵。 (旋转、平移、缩放)

每个矩形都使用 GLES20.glDrawArrays 绘制。 但是这种方式花费了太多时间。 (使用该方法 200 次) (当然,我想要 60 FPS。)

如果我使用 GLES20.glDrawArrays 方法一次并一次绘制所有矩形(=三角形),性能会变好。

如何使用 GLES20.glDrawArrays 方法一次绘制三角形? (三角形具有相同的位置缓冲区,不同的模型矩阵)

private void draw(int[] bufferId, int color, float[] modelMatrix, int count) 
    GLES20.glUseProgram(programHandle);
    int uMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
    int aPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
    int aColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color");


    Matrix.multiplyMM(MVMatrix, 0, viewMatrix, 0, modelMatrix, 0);
    Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, MVMatrix, 0);
    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
    GLES20.glVertexAttrib4f(aColorHandle, Color.red(color) / 255f, Color.green(color) / 255f, Color.blue(color) / 255f, Color.alpha(color) / 255f);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferId[0]);
    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, 0);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glEnableVertexAttribArray(aPositionHandle);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, count);

此方法绘制一个带有缓冲区、颜色、模型矩阵的矩形。 (计数 = 4)

【问题讨论】:

首先,我要去掉这个 draw 方法开头的 glUseProgram 行。如果每个矩形都使用相同的程序(看起来就是这样),那就没有必要了,而且我不是专家,但这可能会减慢你的 FPS(虽然不是很多)。相反,在 onDrawFrame() 方法中,在对每个矩形调用 draw 之前,插入 glUseProgram 行。 另外,这些句柄, int uMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix"); int aPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position"); int aColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color");每个矩形都相同。这可能不会大幅提高 FPS,但我不会浪费任何时间为每个矩形定义这些句柄。相反,将这些线放在 onSurfaceCreated() 方法中,并允许在矩形的 draw() 方法中访问它们。 这些只是略微提高 FPS 的建议,它们不会显示 FPS 的任何实质性改进,但它可能会有所帮助。我不知道你现在的 FPS 是多少 【参考方案1】:

在单个绘图调用中批处理顶点,上传数组统一矩阵,并为每个矩形添加一个顶点属性,告诉它们使用哪个数组索引。

也就是说 - 您可以使用多少统一空间可能会受到限制,因此 200 个矩阵不太可能工作。鉴于您只是在处理具有少量顶点的矩形,因此在 CPU 上对它们进行动画处理并将预先转换的剪辑空间坐标上传到 GPU 实际上可能更快。

【讨论】:

以上是关于android opengl GLES20:如何用每个模型矩阵绘制多个三角形? (表现不错))的主要内容,如果未能解决你的问题,请参考以下文章

android opengl 2.0 模板缓冲区不起作用

android中使用OpenGLES,有啥方法可以将texture反过来转化成Bitmap的方法没有

OpenGLES渲染颜色问题

如何降低OpenGL纹理的噪点

在 OpenGL ES 2 中更新 VBO 的顶点

如何设置 Open GLES2.0 与 Android 相机配合使用?