0

如何在 GLSL 着色器中插入纹理坐标?

我正在尝试将图像从屏幕尺寸缩小到其原始尺寸的 1/4。这是一个非常简单的过程,但它似乎并不正确。我有一个 FBO,带有一个单一颜色的附件,用作 1/4 屏幕大小的目标。

为了对纹理进行下采样,我要绘制一个简单的全尺寸四边形,其坐标如下:

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* 将从 0.0 变为 1.0,因为顶点坐标从 -1 变为 1。然而,使用以下着色器对此进行一点测试,似乎表明 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 回答