0

在开始渲染之前,我正在使用以下代码在 GPU 上循环上传我的纹理,但我得到 glTexStorage2D 返回的一些“随机”内存不足错误。我的意思是有时较小的纹理会从内存中返回,但下一个较大的纹理会返回正常。我用 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();
4

1 回答 1

0

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

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

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

于 2013-10-19T23:01:24.417 回答