1

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

通过在glTexImage3D(...)之后添加glGetError( ) ,我得到错误代码1285,这意味着“内存不足”。

但是,我的卡是 NV quadro 4800,其内存大小为 1536MB,大于上面的纹理大小(1GB)。该卡的驱动程序版本为 296.88。glew的版本是最新的1.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\n", err);

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

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

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

4

2 回答 2

3

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

我以前在win32模式下编译代码。当我转向使用x64模式编译和运行时,它最终 WORKS !而且无论 GL_LUMINANCE 还是 GL_LUMINANCE8,它都有效。

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

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

于 2012-08-06T07:27:00.880 回答
2

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

您超出了内存限制。

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

如果它想拒绝这个,你也无能为力。

你能做的最好的就是尝试给你的图像一个合适的像素大小。也就是说,使用GL_LUMINANCE8而不是 unsized GL_LUMINANCE。或者更好的是,使用GL_R8. 不能保证其中任何一个都会起作用。

于 2012-08-04T09:13:34.553 回答