8

私はOpenGLに非常に慣れていません。

テクスチャ付きの四角形 (2 つの三角形) を描画しようとしています。テクスチャのサイズは 900x900px です。1 つのクワッドでは問題ありませんが、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 の累乗なし) テクスチャで非常にうまく機能しますが、これにより、最も近い 2 の累乗 (この場合は 1024X1024) に描画する必要があるたびに、テクスチャの再スケーリングが発生します。

次の 2 つのソリューションを使用してみてください。

1- テクスチャを 1024x1024 に変換し、ジオメトリの座標を使用して必要なもの (900x900) のみを描画します

2- ズームが多い場合は、ミップマップを生成してみてください。これは、多くのシナリオでパフォーマンスの救世主となります。

于 2013-02-22T14:21:45.253 に答える
1

Your S3 probably has about 600M texels/sec fillrate (see GLBenchmark). If you're rendering full-screen quads - ten double-texture quads give 20M texels per frame. Assuming GLBenchmark does what it says(measure texturing throughput) 20M texels is 1/30 of the fillrate, giving 33ms the best the hw can process one frame. Framebuffer blending I'm sure actively competes for the fillrate - 10M pixels blended is quite a lot so I can guess the bottleneck could also be there.

What you can try to make sure what is the slow part - reduce texture size to say, 512x512, and see how it affects performance. Reduce screen size of the rendered quads(considerably, as with textures - e.g. make it half/quarter of the screen).

于 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 に答える