0

私は、レンダラー、オフスクリーン GLSurfaceView、およびいくつかのシェーダー スクリプト (*.fsh および *.vsh) を備えた OpenGL 2.0 を使用するこの写真アプリに取り組んでいます。

Assets フォルダーからシェーダー スクリプトを読み込んだ後、GL サーフェスとコンテキストを準備するなどして、最終的に呼び出すGLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);と、非常にうまく機能し、エフェクト付きのビットマップが生成されます。

もちろん、問題はメモリの制限と十分な大きさのビットマップ (デバイスに関係なく、古い Gingerbread ではそれほど大きくなく、Nexus 10 では非常に大きな画像) であり、OutOfMemoryException が生成されます。

私は OpenGL についてあまり詳しくありません。非常に大量のデータを処理する方法は、ストリームを使用することなので、すべてをメモリに保持する必要はありません。

問題は、メモリ内 Bitmap の代わりに Stream を介して openGl シェーダー/レンダラーを適用する方法はありますか? はいの場合、リンクまたは基本手順へのポインターはありますか?

4

1 に答える 1

1

あなたが何を意味するのか正確にはわかりませんStreamが、ここに別の解決策があります。レンダリングを複数のパスに分割します。たとえば、512x512 のテクスチャとそれに対応するクワッドからテクスチャがあり、メモリの制限により 256x256 しかアップロードできない場合は、次のようにします。

  • テクスチャを 4 つのチャンクに分割します
  • 単一のフィッティング テクスチャ オブジェクトを作成する
  • チャンクごとに
    • 現在のチャンクを tex オブジェクト データ ストアにアップロードする
    • クワッドの 1/4 を描画します。たとえば、左上とそれに応じてテクスチャを描画します。

上記の例では、512x512 のテクスチャと画面サイズを想定していることに注意してください。いずれにせよ、私はあなたがアイデアを得ると思います。

明らかに、これは通常のメモリとパフォーマンスのトレードオフです。転送により多くの帯域幅を使用し、より多くのレンダリングを行うことで、メモリの制限を回避します。

注: 私はデスクトップ GL を使用していますが、GPU とその他の間でメモリがどのように分割されているか、または専用の VRAM があるかどうかはよくわかりません。GL リソースに使用できる量は限られていると思いますが、これはシステム メモリ全体よりもさらに小さいものです。

于 2013-09-26T10:26:32.323 に答える