我有一个问题是弄清楚当宽度,高度和深度是不同的值时如何正确使用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
或什么来布置数据的问题...
我的结果如下:
如您所见,球体倾斜,这是因为width==height
,但它们是!=depth
。我想更好地理解这是否是数据布局和/或跨越的问题。
如果我设置depth=512
,我会获得正确比例的立方体。
答案 0 :(得分:5)
我认为为了避免3个新的三重指针,然后非常小心地删除所有内容,boost :: multiarray可能非常有用,所以我用过。
要么是错的。 3阶段new
- ed数组实际上是一棵树。它是一个指向数组指针数组的指针数组。你想要的是一个平坦的数据区域。不要打扰多维数组,因为你不知道那些内部如何排列数据。
使用长度为width * height * depth
的简单1维数组。另外,请确保设置正确的GL_UNPACK_ALIGNMENT,通常为1。