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:如何用每个模型矩阵绘制多个三角形? (表现不错))的主要内容,如果未能解决你的问题,请参考以下文章