2

幅、高さ、深さが異なる場合に glTexImage3D を正しく使用する方法を理解するのに問題があります。トリプルポインターで3 を回避し、すべてに細心のnew注意を払うには、非常に役立つ可能性があると考えたので、使用しました。deleteboost::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すると、正しく比例した立方体が得られます。 ここに画像の説明を入力

4

1 に答える 1

5

トリプル ポインターで 3 つの new を回避し、慎重にすべてを削除するには、boost::multiarray が非常に役立つ可能性があると考えたので、使用しました。

どちらかが間違っています。3 段階のnew配列は、実際にはツリーです。これは、値へのポインターの配列へのポインターの配列です。必要なのは、データの平坦な領域です。多次元配列が内部でデータをどのように配置するかわからないため、気にしないでください。

length の単純な 1 次元配列を使用しwidth * height * depthます。また、正しい GL_UNPACK_ALIGNMENT (通常は 1) を設定してください。

于 2013-07-03T15:14:07.590 に答える