0

次のコードを使用して、レンダリングを開始する前にループで GPU にテクスチャをアップロードしていますが、glTexStorage2D によって返される「ランダムな」メモリ不足エラーが発生します。つまり、小さなテクスチャがメモリから返されることがありますが、次の大きなテクスチャは問題なく返されます。GPU-Zで確認したところ、ビデオカードのメモリ(1GB)が180MBしか使用されていません。Gdebugger も使用しましたが、使用されるメモリはあまりありません (VBO、フロント/バック バッファー、テクスチャ、シェーダー)。テクスチャは 32x32 から 2048x2048 の間です。

glGenTextures(1, &TextureID);
showGlError();
glBindTexture(GL_TEXTURE_2D, TextureID); 
showGlError();

Nof_MipMap = 2; 

glTexStorage2D(
   GL_TEXTURE_2D, 
   Nof_MipMap, 
   GL_RGBA8, 
   Image_Width, Image_Height);
glError = showGlError();

glTexSubImage2D(
   GL_TEXTURE_2D,
   0,
   0, 0,
   Image_Width, Image_Height,
   GL_RGB,
   GL_UNSIGNED_SHORT_5_6_5_REV,
   Image_Address);
glError = showGlError();

glGenerateMipmap(GL_TEXTURE_2D);  //Generate num_mipmaps number of mipmaps here.
glError = showGlError();

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
showGlError();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
showGlError();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
showGlError();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
showGlError();
4

1 に答える 1

0

問題の一部は、GPU-Z が常駐 VRAM サイズを測定することです。テクスチャ データが存在できる場所は、プロセスのユーザー モード アドレス空間、カーネル モード アドレス空間 (カーネル モード グラフィックス API ドライバーを備えた古いバージョンの Windows)、BIOS / によって割り当てられた空間にあります。 AGP / PCIe GART (システム共有グラフィックス メモリ) 用の EFI、または VRAM 内。

Out Of Memory は非常に曖昧なエラーであるため、今日のメモリ管理スキームの複雑さを考えると、それだけではほとんど意味がありません。Java 仮想マシン (ここでは当てはまりませんが、おわかりでしょう) では、別の人為的なメモリ制限が導入され、デフォルトで 256 MiB ヒープが使用されます。GPU / ドライバーが比較的新しい場合はGL_ARB_debug_output、何が起こっているのかをより詳細に説明するために使用することを検討します。

数か月前に書いた回答で、この拡張機能の使用方法の例をここに示します。

于 2013-10-19T23:01:24.417 に答える