有关分配1G的openGL 3D纹理大小的问题

Problems about allocating openGL 3D texture size of 1G

我正在做一些关于体积渲染的工作。我想分配一个1024x1024x1024 uchar的3D亮度纹理。不幸的是,它总是失败。

通过在glTexImage3D(...)之后添加glGetError(),我得到错误代码1285,表示"内存不足"。

但是,我的卡是NV Quadro 4800,其内存大小为1536MB,大于上面的纹理大小(1GB)。该卡的驱动程序版本为296.88。 glew的版本是最新的版本1.8。

我有关分配纹理的代码如下所示:

1
2
3
4
5
6
7
8
glBindTexture(GL_TEXTURE_3D, texVoxels);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, volumeSize.x, volumeSize.y, volumeSize.z, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, voxels);

int err = glGetError();
printf("%d\
", err);

PS。通过使用* glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE,dim)*,它返回2048,这意味着我的硬件应该能够分配1024立方的uchar纹理。

PPS。顺便说一句,我也使用CUDA做一些工作。当我在CUDA中分配2048立方的uchar纹理时没有问题。

这种openGL 3D纹理有什么问题?


感谢所有朋友回答我的问题。最终我发现了我的错。

我曾经在win32模式下编译代码。当我转向使用x64模式进行编译和运行时,它最终将发挥作用!而且无论GL_LUMINANCE还是GL_LUMINANCE8,它都可以工作。

该设备似乎无法寻址大于600MB(或多或少)的视频内存。

这是我找到的最后一个链接,它解释了我遇到的相同问题。
http://www.opengl.org/discussion_boards/showthread.php/177442-Out-of-memory-problem?highlight=memory


What's the problem of this openGL 3D texture?

您超出了内存限制。

仅仅因为GPU的内存为1.5GB,并不意味着您可以将1GB的块分配为单个纹理。无论您的卡有多少GPU内存,您的OpenGL实现都有权拒绝基于内存的操作。

如果要拒绝此操作,您将无能为力。

您能做的最好的就是尝试为图像提供适当的像素大小。也就是说,使用GL_LUMINANCE8而不是未设置大小的GL_LUMINANCE。或者更好的是使用GL_R8。无法保证其中任何一个都会起作用。