8

我对 OpenGL很陌生。

我正在尝试绘制带纹理的四边形(2 个三角形)。纹理大小为 900x900px。我对一个四边形没有任何问题,但是当我尝试绘制 5-10 个四边形时,我发现速度明显变慢。

也许我做错了什么......

代码:

public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
    ... matrix calculation ...
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}

顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;
void main() {
  gl_Position = uMVPMatrix*vPosition;
  v_TexCoordinate = a_TexCoordinate;
}

片段着色器:

    precision mediump float;
    uniform sampler2D u_PreviewTexture;
    varying vec2 v_TexCoordinate;

    void main() {
      vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate);
      gl_FragColor = color;
    }

测试平台为 Galaxy S3。在分析器中,我看到大约 60 毫秒需要 eglSwapBuffers 调用。

如何快速绘制具有大纹理的四边形?

4

3 回答 3

4

这可能是由于纹理的大小以及您正在使用的设备的 OpenGL 驱动程序实现所致。

大多数现代 GPU 在 NPOT(没有二次幂)纹理方面做得非常好,但这会导致每次需要将纹理绘制到最接近的 2 次幂(在您的情况下为 1024X1024)时重新缩放纹理。

尝试使用以下两种解决方案:

1-将您的纹理转换为 1024x1024 并使用几何中的坐标仅绘制您需要的 (900x900)

2-尝试生成 mipmap,如果您有很多缩放,这在许多情况下都是性能救星。

于 2013-02-22T14:21:45.253 回答
1

您的 S3 可能有大约 600M 纹素/秒的填充率(请参阅GLBenchmark)。如果您正在渲染全屏四边形 - 十个双纹理四边形每帧提供 20M 纹素。假设 GLBenchmark 做到了它所说的(测量纹理吞吐量)20M 纹素是填充率的 1/30,硬件可以处理一帧的最佳时间为 33 毫秒。帧缓冲混合我敢肯定会积极竞争填充率 - 混合的 1000 万像素是相当多的,所以我猜瓶颈也可能在那里。

您可以尝试确定什么是慢速部分 - 将纹理尺寸减小到 512x512,看看它如何影响性能。减小渲染四边形的屏幕尺寸(相当大,与纹理一样 - 例如使其成为屏幕的一半/四分之一)。

于 2013-02-25T11:22:08.397 回答
0

根据我的经验,纹理性能问题通常源于 MIPMAP 过滤的设置方式。如果以下参数没有最佳设置(显示的最小设置),可能会损失很多性能:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

如果可能,请尝试禁用深度测试。@marekb 关于纹理压缩的建议也提供了很多性能优势。

于 2013-03-02T23:50:35.190 回答