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实现都有权拒绝基于内存的操作。
如果要拒绝此操作,您将无能为力。
您能做的最好的就是尝试为图像提供适当的像素大小。也就是说,使用