当宽度、高度和深度是不同的值时,我很难弄清楚如何正确使用 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
我得到正确比例的立方体。