私は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を使用しています。
あなたの投稿はやや矛盾しています。 *もちろん、それらは生のフォーマットであり、あなたは圧縮されたテクスチャフォーマットを使用することができます。とにかく、FBOはイメージをビルドしています(そして、FBOからロードします)。 – RobotRock
@RobotRock:その混乱のために申し訳ありません。明示的に圧縮形式を要求しない場合、GPUはテクスチャを圧縮していない生の形式で保持します。 BTW:FBOでイメージを構築する場合、QImageの方法は、CPUメモリとのやりとりをGPUに移すというボトルネックを2回繰り返します。 glCopyTexImageまたはglCopyTexSubImageを使用して、FBOの内容をテクスチャに転送してください。または、(カラーアタッチメントとしてバインドして)テクスチャに直接レンダリングし、コピープロセスをすべて保存します。 – datenwolf
あなたはラウンドトリップについては正しいですが、私はglWidgetsを越えて動作するcopyTexImageを取得できません。 – RobotRock