OpenGL - GLSL 几何着色器 - gl_Position 到 gl_FragCoord

问题描述 投票:0回答:1

如何将 gl_Position 转换为 gl_FragCoord 以检查 gl_FragCoord 是否在 2 点之间?

看看我到目前为止所做的事情,下面是“它出现故障,有一点红色”。我认为我把 gl_Position 转换为 gl_FragCoord 很糟糕。

有人可以帮助我解决我的问题吗?仅供参考:我是 GLSL 新手。

几何着色器:

#version 330 core

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

out vec3 color;

out vec2 v1;
out vec2 v2;
out vec2 v3;

vec2 halfScreenSize;

in DATA
{
    vec3 color;
    vec2 screenSize;
    mat4 projection;
} data_in[];

vec2 ToFragCoord(vec2 position)
{    
    return position * halfScreenSize;
}

void main()
{
    halfScreenSize = vec2(data_in[0].screenSize.x / 2, data_in[0].screenSize.y / 2);

    v1 = ToFragCoord((data_in[0].projection * gl_in[0].gl_Position).xy);
    v2 = ToFragCoord((data_in[1].projection * gl_in[1].gl_Position).xy);
    v3 = ToFragCoord((data_in[2].projection * gl_in[2].gl_Position).xy);

    gl_Position = data_in[0].projection * gl_in[0].gl_Position;
    color = data_in[0].color;
    EmitVertex();

    gl_Position = data_in[1].projection * gl_in[1].gl_Position;
    color = data_in[1].color;
    EmitVertex();

    gl_Position = data_in[2].projection * gl_in[2].gl_Position;
    color = data_in[2].color;
    EmitVertex();

    EndPrimitive();
}

片段

#version 330 core

in vec3 color;

in vec2 v1;
in vec2 v2;
in vec2 v3;

bool Check(vec2 a, vec2 b, vec2 c)
{    
    float len = distance(a,c) + distance(b,c);

    if(len <= distance(a,b) + 1.0f 
    && len >= distance(a,b) - 1.0f)
    {
        return true;
    }

    return false;
}

void main()
{
    if(Check(v1, v2, gl_FragCoord.xy)
    || Check(v2, v3, gl_FragCoord.xy))
    {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
    else
    {
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }
}
opengl glsl
1个回答
0
投票

剪辑空间坐标是齐次坐标。您必须进行透视推导才能获得笛卡尔标准化设备空间坐标。

标准化设备坐标的范围是[-1.0, 1.0]。因此,将标准化设备坐标转换为 [0.0, 1.0] 范围是

x' = (x + 1) / 2

gl_FragColor
包含窗口相对 x 和 y 坐标以及 z 坐标中的深度。因此,您必须将 [0.0, 1.0] 范围内的坐标的 x 和 y 分量乘以窗口的分辨率。

v1 = (gl_in[0].gl_Position.xyz / gl_in[0].gl_Position.w + 1.0) / 2.0 * vec3(screenSize, 1.0);
© www.soinside.com 2019 - 2024. All rights reserved.