C++ 具有不同纹理尺寸的OpenGL glTexture3D的倾斜体积数据

C++ 具有不同纹理尺寸的OpenGL glTexture3D的倾斜体积数据,c++,opengl,boost,rendering,C++,Opengl,Boost,Rendering,当宽度、高度和深度是不同的值时,如何正确使用glTexImage3D是一个问题。 我认为为了避免三点指针上出现3new,然后非常小心地删除所有内容,boost::multiarray可能非常有用,所以我使用了 boost::multi_array<GLubyte, 3> texture3DVolume; texture3DVolume.resize(boost::extents[textureSizeX][textureSizeY][textureSizeZ]); glPixelS

当宽度、高度和深度是不同的值时,如何正确使用glTexImage3D是一个问题。 我认为为了避免三点指针上出现3
new
,然后非常小心地删除所有内容,
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;
但我的结果是不正确的。我真的不知道我是否对如何使用
boost::multiarray
或什么来布局数据有问题。。。 我的结果如下:

正如您所看到的,球体是倾斜的,这是因为
width==height
,但它们是
=深度
。我想更好地理解这是否是数据布局和/或步幅的问题

如果我设置
depth=512
,我将得到正确比例的立方体。

我认为,为了避免3个新的三点指针,然后非常小心地删除所有内容,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;
两者都是错误的。三级
-ed数组实际上是一棵树。它是指向值的指针数组的指针数组。您需要的是一个平坦的数据区域。不用担心多维数组,因为您不知道这些数组如何在内部排列数据


使用长度
宽度*高度*深度
的简单一维数组。还要确保设置了正确的GL\U UNPACK\U对齐方式,通常为1。

是的,我正在考虑这样做。唯一的问题是正确的索引。对于这样的平面数组:
texture3DVolume=new GLubyte[textureSizeX*textureSizeY*textureSizeZ]
你怎么能把它当作一个
[x][y][z]
来索引呢?@datenwolf差不多,它是
[height*width*z+width*y+x]
或者
[width*(height*z+y)+x]
@ChristianRau:ops,你说得对@莱内洛:练习,拿一张方格纸,画一个16×16的矩形,从左下角开始,把数字0到15写进去,向右,然后向上。通常,为了索引多维数组,您使用
[d_40; n-1)*d_40;n-2)*d_40;n-…)*x_n+d_40; n-2)*d_n(n-…)*x_40;n-1+…]
,在三维数组
[height*width*z+width*y+x]
的情况下,我已设法将内存分配为
texture3DVolume=new GLubyte[textureSizeX*textureSizeY*textureSizeZ]我以
texture3DVolume[textureSizeY*textureSizeX*z+textureSizeX*y+x]的形式访问它
但是当
textureSizeZ
时,我仍然有倾斜的问题=大于
textureSizeX
textureSizeY
。这与像素对齐有关吗?@linello:是的,很可能是这样。请查看最重要的GL_UNPACK_对齐参数(在使用glTexImage、glTexSubImage提交数据之前,应设置glPixelStore)。