0

GLSLシェーダでテクスチャ座標はどのように補間されますか?

画像を画面サイズから元のサイズの 1/4 にダウンサンプリングしようとしています。これは非常に単純な手順ですが、正しくないようです。私は、1/4 画面サイズのターゲットとして使用する単一色のアタッチメントを備えた FBO を持っています。

テクスチャをダウンサンプリングするために、描画する単純なフルサイズのクワッドがあります。座標は次のとおりです。

v[0].v.position.x = -1.f; v[0].v.position.y = -1.f; v[0].v.position.z = 0.f;
v[1].v.position.x = -1.f; v[1].v.position.y =  1.f; v[1].v.position.z = 0.f;
v[2].v.position.x =  1.f; v[2].v.position.y = -1.f; v[2].v.position.z = 0.f;
v[3].v.position.x =  1.f; v[3].v.position.y =  1.f; v[3].v.position.z = 0.f;

ここで、頂点シェーダーは、次のように、テクスチャ座標を生成するために入力座標をスケーリングおよびバイアスするだけで、頂点を変換する必要はなく、ジオメトリと共にテクスチャ座標を渡す必要もなく、頂点を通過します。

#version 420

layout(location = 0) in vec3 attrib_Position;

out vec2 attrib_Fragment_Texture;

void main()
{
    attrib_Fragment_Texture = attrib_Position.xy * 0.5 + 0.5; 

    gl_Position = vec4(attrib_Position.xy, 0.0, 1.0);
}

したがって、*attrib_Fragment_Texture* として出力されるテクスチャ座標は、頂点座標が -1 から 1 になると 0.0 から 1.0 になります。しかし、次のシェーダーでこれを少しテストすると、uv.x と uv.y だけが動くことが示されているようです。 0.0 から 0.25 まで。私はそれらが 0.0 から 1.0 に補間されることを期待していました!

#version 420

in vec2 attrib_Fragment_Texture;

out vec4 Out_Colour;

void main(void)
{
    vec2 uv = attrib_Fragment_Texture.xy;

    Out_Colour = vec4(uv.x, uv.y, 1.0, 1.0);
}

私の明らかに単純な間違い/誤解が何であるかを誰かが見つけることができますか?

4

1 に答える 1

1

FBO の 4 倍のサイズの元のビューポートでレンダリングしているため、ほとんどのプリミティブが切り取られていると思われます。

于 2013-01-30T17:04:49.423 に答える