glTexStorage2D返回内存不足

时间:2013-10-17 13:37:22

标签: opengl

我正在使用以下代码在开始渲染之前在GPU上上传我的纹理,但是我得到了一些随机的' glTexStorage2D返回的内存不足错误。我的意思是,有时较小的纹理会返回内存但下一个,较大的纹理会返回ok。我用GPU-Z检查过,只使用了180MB的显卡内存(1GB)。我还使用了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();

1 个答案:

答案 0 :(得分:0)

部分问题是GPU-Z测量驻留VRAM大小。在您的进程用户模式地址空间,在其内核模式地址空间(在具有内核模式图形API驱动程序的Windows的旧版本中),在您的BIOS分配的空间中,有许多位置可以存在纹理数据用于AGP / PCIe GART(系统共享图形内存)或VRAM的EFI。

Out of Memory是一个模糊的错误,鉴于当今内存管理方案的复杂性,它本身几乎毫无意义。 Java虚拟机(不是它在这里应用,但你明白了)引入了另一个人工内存限制,默认情况下为256 MiB堆。如果您的GPU /驱动程序相对较新,我会考虑使用GL_ARB_debug_output来更详细地了解正在发生的事情。

我在几个月前写的答案here中有一个如何使用此扩展的示例。