2

当宽度、高度和深度是不同的值时,我很难弄清楚如何正确使用 glTexImage3D。我认为为了避免new三重指针上的 3 然后对delete所有事情都非常小心,boost::multiarray可能非常有用,所以我使用了。

boost::multi_array<GLubyte, 3> texture3DVolume;
texture3DVolume.resize(boost::extents[textureSizeX][textureSizeY][textureSizeZ]);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &(this->textureID));
glBindTexture(GL_TEXTURE_3D, this->textureID);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_3D);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, this->textureSizeX,this->textureSizeY, this->textureSizeZ,  0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texture3DVolume.data());

int textureSizeX=512;
int textureSizeY=512
int textureSizeZ=511;

使用 511,我得到一个倾斜的纹理。[-0.5,0.5]x[-0.5,0.5]x[-0.5,0.5]对于我使用的每个顶点(立方体的顶点),纹理坐标是用一个非常简单的着色器制作的:

// vertex shader...
texture_coordinate = (v.xyz+vec3(1.0))*0.5;
// then in the fragment shader
gl_FragColor = texture(my_color_texture, texture_coordinate);

但我的结果是有偏差的。我真的不知道我是否对数据的布局方式boost::multiarray或什么有疑问......我的结果如下:

这是应该是立方体的视图,其中侧面覆盖有来自体积数据集的球体

如您所见,球体是倾斜的,这是因为width==height它们是!=depth. 我想更好地了解这是否是数据布局和/或跨步的问题。

如果我设置depth=512我得到正确比例的立方体。 在此处输入图像描述

4

1 回答 1

5

我认为为了避免三重指针上的 3 个 new 然后非常小心地删除所有内容,boost::multiarray 可能非常有用,所以我使用了。

要么是错的。一个 3 stage new-ed 数组实际上是一棵树。它是指向值的指针数组的指针数组。你想要的是一个平坦的数据区域。不要打扰多维数组,因为您不知道它们如何在内部排列数据。

使用长度为 的简单一维数组width * height * depth。还要确保设置正确的 GL_UNPACK_ALIGNMENT,通常为 1。

于 2013-07-03T15:14:07.590 回答