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

lin*_*llo 2 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;
Run Code Online (Sandbox Code Playgroud)

用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);
Run Code Online (Sandbox Code Playgroud)

但我的结果是扭曲的.我真的不知道我是否有关于如何布置数据boost::multiarray或什么...的问题我的结果如下:

这是一个应该是多维数据集的视图,其中两侧被来自体积数据集的球体覆盖

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

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

dat*_*olf 5

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

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

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