2012-04-18 8 views
0

私は75 * 9 * 32のイメージを持っていて、合計64 MBのハードドライブをPNG形式で持っています。 128 * 256ピクセルの画像をロードすると、RAMで約1.5 GBのメモリが必要になります。ミップマッピングが有効になっていません。OpenGLのテクスチャがあまりにも多くのメモリを占める

これは、GPUに生のイメージしか保存されないためです。メモリ使用量を増やす方法はありますか?

フレームバッファオブジェクトを使用してテクスチャをロードしていますが、これは1回だけ作成されます。

私はテクスチャをロードするために、次を使用します。

 QImage catchImage = catchFbo->toImage(); 
     QImage t = QGLWidget::convertToGLFormat(catchImage); 

     glGenTextures(1, &Item::texture[i]); 
     glBindTexture(GL_TEXTURE_2D, Item::texture[i]); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

EDIT:GL_COMPRESSED_RGBA代わりにGL_RGBAが大きな違いを作るようです。現在は500 MBを使用しています。

答えて

3

まあ、もちろん彼らは生の形式です。 GPUがDeflateとJPEG圧縮解除を直接サポートするのはきれいですが、サポートしていません。

メモリ使用量を増やす方法はありますか?

圧縮テクスチャ形式を使用できます。はい、現代のGPU で実行中の圧縮解除をサポートしていますが、使用されるコーデックはPNGまたはJPEGと大きく異なります。

フレームバッファオブジェクトを使用してテクスチャをロードしていますが、これは1回だけ作成されます。

なぜですか? FBOは他のもののためのものです。このようなプロキシを使わずにファイルからQImageを直接読み込むことができます。

+0

あなたの投稿はやや矛盾しています。 *もちろん、それらは生のフォーマットであり、あなたは圧縮されたテクスチャフォーマットを使用することができます。とにかく、FBOはイメージをビルドしています(そして、FBOからロードします)。 – RobotRock

+0

@RobotRock:その混乱のために申し訳ありません。明示的に圧縮形式を要求しない場合、GPUはテクスチャを圧縮していない生の形式で保持します。 BTW:FBOでイメージを構築する場合、QImageの方法は、CPUメモリとのやりとりをGPUに移すというボトルネックを2回繰り返します。 glCopyTexImageまたはglCopyTexSubImageを使用して、FBOの内容をテクスチャに転送してください。または、(カラーアタッチメントとしてバインドして)テクスチャに直接レンダリングし、コピープロセスをすべて保存します。 – datenwolf

+0

あなたはラウンドトリップについては正しいですが、私はglWidgetsを越えて動作するcopyTexImageを取得できません。 – RobotRock

0

クリッピングを実装する必要があります。もちろん、メモリの占有を防ぐことはできませんので、画像がビュースコープに収まる場合は、画像を遅延ロードする必要があります。これについてのちょっとした記事はhereです。

+0

申し訳ありませんが、どのようにクリッピングが彼のメモリ消費でOPを助けますか?クリッピングは、プリミティブをビューポートのサイズにカット(=クリップ)するプリミティブ操作です。私はあなたが淘汰を意味すると思うが、それもOPを助けることはありません。また、レイジーローディングイメージも扱いにくいことがあります。 – datenwolf

+0

いいえ、私はクリッピングを意味しませんでした。クリッピングを拡大して、表示する内容を表示するだけでなく、表示する内容を読み込むだけでなく、少し余分な作業が必要になります。おそらくそれは簡単な解決策ではないかもしれませんが、明日は1.5ではなく3GBだと、彼は同じ問題を圧縮でやり直すつもりです。これはより良い長期的なソリューションです。私はそれが私を評価するのが適切だとは思わない... – Neil

+0

-1:@Neil:それはナンセンスだ。クリッピングはどれくらいのメモリが使用されるかについては何もしません。 「表示する必要があるものだけを読み込む」ように「展開」すると、それはもう*クリッピング*ではありません。クリッピングは、GPUのハードウェア機能です。あなたはそれを何かに「拡大」することはできません。 –

0

より圧縮された形式に変換したり、ディスクから遅延ロードすることはできますが、それはそれです。私は、GPUだけでRAW画像を保存するので、これは可能性が把握してい

関連する問題