我正在使用以下代码在开始渲染之前在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();
答案 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中有一个如何使用此扩展的示例。