4

openglで3Dテクスチャを使用して、ボリュームレンダリングを実装しようとしています。各ボクセルにはrgbaカラー値があり、現在、クワッドに面した画面としてレンダリングされています(テスト目的で)。サンプラーにシェーダーのカラー値を表示させることができないようです。クワッドは常に黒くなります。シェーダーを変更して(xyz座標に基づいて)色を生成すると、正常に機能します。次のコードでテクスチャをロードしています。

glGenTextures(1, &tex3D);
glBindTexture(GL_TEXTURE_3D, tex3D);
unsigned int colours[8];

colours[0] = Colour::AsBytes<unsigned int>(Colour::Blue);
colours[1] = Colour::AsBytes<unsigned int>(Colour::Red);
colours[2] = Colour::AsBytes<unsigned int>(Colour::Green);
colours[3] = Colour::AsBytes<unsigned int>(Colour::Magenta);
colours[4] = Colour::AsBytes<unsigned int>(Colour::Cyan);
colours[5] = Colour::AsBytes<unsigned int>(Colour::Yellow);
colours[6] = Colour::AsBytes<unsigned int>(Colour::White);
colours[7] = Colour::AsBytes<unsigned int>(Colour::Black);

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colours);

色の配列には正しいデータが含まれています。つまり、最初の4バイトの値は青の場合は0、0、255、255です。レンダリングする前に、次のようにテクスチャを2番目のテクスチャユニットにバインドします。

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, tex3D);

そして、次のコードでレンダリングします。

shaders["DVR"]->Use();
shaders["DVR"]->Uniforms["volTex"].SetValue(1); 
shaders["DVR"]->Uniforms["World"].SetValue(Mat4(vl_one));
shaders["DVR"]->Uniforms["viewProj"].SetValue(cam->GetViewTransform() * cam->GetProjectionMatrix());

QuadDrawer::DrawQuads(8);

以前、これらのクラスを使用してシェーダーパラメーターを設定しましたが、正常に機能します。quaddrawerは、8つのインスタンス化されたクワッドを描画します。頂点シェーダーコードは次のようになります。

#version 330

layout(location = 0) in vec2 position;
layout(location = 1) in vec2 texCoord;

uniform sampler3D volTex;
ivec3 size = ivec3(2, 2, 2);
uniform mat4 World; 
uniform mat4 viewProj;

smooth out vec4 colour;

void main()
{
    vec3 texCoord3D;

    int num = gl_InstanceID;

    texCoord3D.x = num % size.x;
    texCoord3D.y = (num / size.x) % size.y;
    texCoord3D.z = (num / (size.x * size.y));

    texCoord3D /= size;
    texCoord3D *= 2.0;
    texCoord3D -= 1.0;

    colour = texture(volTex, texCoord3D);
    //colour = vec4(texCoord3D, 1.0);   

    gl_Position = viewProj * World * vec4(texCoord3D, 1.0) + (vec4(position.x, position.y, 0.0, 0.0) * 0.05);

}

texcoordに等しい色の値を設定した行のコメントを解除すると、正常に機能し、四角形が色付けされます。フラグメントシェーダーは単純です。

#version 330

smooth in vec4 colour;
out vec4 outColour;

void main()
{
    outColour = colour;
}

だから私の質問は、私が間違っているのはなぜですか、サンプラーが3Dテクスチャからカラー値を取得しないのはなぜですか?

[編集]それを理解したが、自己回答できない(新規ユーザー):

私がこれを投稿したらすぐに私はそれを理解しました、私は他の誰かを助けるために答えを出します(それは特に3Dテクスチャの問題ではありません、そして私も以前にそれに反しました、D'oh!)。テクスチャのミップマップを生成せず、デフォルトの拡大/縮小フィルターがGL_LINEARまたはGL_NEARESTのいずれにも設定されていませんでした。ブーム!テクスチャはありません。同じことが2Dテクスチャでも起こります。

4

1 に答える 1

3

私がこれを投稿したらすぐに私はそれを理解しました、私は他の誰かを助けるために答えを出します(それは特に3Dテクスチャの問題ではありません、そして私も以前にそれに反しました、D'oh!)。テクスチャのミップマップを生成せず、デフォルトの拡大/縮小フィルターがGL_LINEARまたはGL_NEARESTのいずれにも設定されていませんでした。ブーム!テクスチャはありません。同じことが2Dテクスチャでも起こります。

于 2012-06-24T15:26:20.550 に答える