2013-02-21 18 views
8

私はです。 new to OpenGL。Android Openg GL ES 2大きなテクスチャの描画が遅い

テクスチャ付きクワッド(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; 
    } 

テストプラットフォームですギャラクシーS3。 プロファイラでは、約60msでeglSwapBuffersが呼び出されることがわかります。

大きなテクスチャでクワッドを高速に描画するにはどうすればよいですか?

+0

もう少し重要な情報:ビットマップはARGB_8888形式であり、GL_BLENDは有効です。 –

答えて

4

これは、テクスチャのサイズと使用しているデバイスのOpenGLドライバの実装が原因である可能性があります。

ほとんどの現代GPUはNPOT(2の累乗なし)テクスチャでは非常にうまく機能しますが、これは2の最も近い累乗に描画する必要があるたびにテクスチャを再スケーリングします(1024X1024の場合) 。

次の2つのソリューションを使用するようにしてください:

2-ミップマップを生成するようにしてください(900x900)1024×1024にあなたのテクスチャを変換し、あなたが必要なものを描くだけにあなたのジオメトリの座標を使用し

1-、ズームがたくさんある場合、これは多くのシナリオでパフォーマンスの救済者です。

+0

テクスチャが静的圧縮の場合、メモリバンド幅も減少する可能性があります。 ETC1圧縮は、おそらくすべてのモバイルデバイスで利用可能です。アルファチャンネルのないRGB形式のみをサポートしています。 – marekb

+0

答えをありがとう。私は1024x1024にテクスチャをスケールしようとしましたが、何の違いもありません。私は実行時にビットマップを取得するので、私はETC1を使用することはできません。 gpu呼び出しをプロファイルしようとしましたが、すべての呼び出しが2ms未満であるように見えます... –

+0

別のテスト:10個のクォード、それぞれ1024x1024の2つのテクスチャ(mix()を使用):eglSwapBuffers呼び出しは、 GPUプロファイラはすべての描画プロセスが3ms未満で完了します。 –

1

S3にはおそらく約600Mテクセル/秒の充填率があります(GLBenchmark参照)。 フルスクリーンクワッドをレンダリングする場合、10個のダブルテクスチャクワッドはフレームあたり20Mテクセルを与えます。 GLBenchmarkが(テクスチャのスループットを測定する)とすれば、20Mテクセルはフィルレートの1/30で、33msにが最も良いは1フレームを処理できます。フレームバッファのブレンド私は確かにfillrateのために競争していると確信しています - 10Mのピクセルが混在しているので、私はボトルネックがそこにあるかもしれないと推測することができます。

遅い部分が何であるかを確認するために、テクスチャサイズを512x512に減らし、パフォーマンスにどのような影響があるかを確認することができます。レンダリングされたクワッドの画面サイズを縮小します(テクスチャの場合と同様に、画面の半分または1/4にするなど)。

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のテクスチャ圧縮に関するアドバイスは、多くのパフォーマンス上の利点も提供します。

関連する問題