使用具有不同纹理尺寸的OpenGL glTexture3D来倾斜体积数据

时间:2013-07-03 15:01:42

标签: c++ opengl boost rendering

我有一个问题是弄清楚当宽度,高度和深度是不同的值时如何正确使用glTexImage3D。 我认为为了避免3 new三重指针,然后对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或什么来布置数据的问题... 我的结果如下:

This is a view of what should be a cube where the sides are covered with spheres coming from volumetric dataset

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

如果我设置depth=512,我会获得正确比例的立方体。 enter image description here

1 个答案:

答案 0 :(得分:5)

  

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

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

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