【问题标题】:Skewed volumetric data with OpenGL glTexture3D with different texture dimensions具有不同纹理尺寸的 OpenGL glTexture3D 的倾斜体积数据
【发布时间】:2023-03-17 05:08:01
【问题描述】:

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

【问题讨论】:

    标签: c++ opengl boost rendering


    【解决方案1】:

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

    两者都错了。一个 3 阶段的new-ed 数组实际上是一棵树。它是指向值的指针数组的指针数组。你想要的是一个平坦的数据区域。不要理会多维数组,因为你不知道它们是如何在内部排列数据的。

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

    【讨论】:

    • 是的,我正在考虑这样做。唯一的问题是正确的索引。对于像这样的平面数组:texture3DVolume = new GLubyte[textureSizeX*textureSizeY*textureSizeZ ]; 你怎么能像[x][y][z] 一样索引它?
    • @datenwolf 差不多,是[height * width * z + width * y + x][width * (height * z + y) + x]
    • @ChristianRau:哎呀,你是对的。 @lineello:练习,拿一张网格纸,画一个 16×16 的矩形,从左下角开始写数字 0 到 15,向右,然后向上。通常索引多维数组时使用[d_(n-1) * d_(n-2) * d_(n-...) * x_n + d_(n-2) * d_n(n-...) * x_(n-1) + ...],如果是3d 数组[height * width * z + width * y + x]
    • 我已经设法将内存分配为texture3DVolume = new GLubyte[ textureSizeX*textureSizeY*textureSizeZ ];,并以texture3DVolume[textureSizeY* textureSizeX* z + textureSizeX* y + x]; 访问它,但是当textureSizeZ!= 而不是textureSizeX 和@987654335 时,我仍然存在倾斜问题@。这与像素对齐有关吗?
    • @linello:是的,很可能是这样。请查看opengl.org/sdk/docs/man/xhtml/glPixelStore.xml 最重要的是 GL_UNPACK_ALIGNMENT 参数(glPixelStore 应在使用 glTexImage、glTexSubImage 提交数据之前设置)。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2011-10-23
    • 2010-09-26
    • 2019-12-15
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多