在片段着色器中绘制锯齿状的像素完美线条?

时间:2019-06-07 22:17:03

标签: opengl glsl fragment-shader

我正在尝试使用片段着色器在OpenGL中绘制像素完美的线条。我有以下来自this question的片段着色器。但是结果是2像素而不是1像素。

#version 330

layout(location=0) out vec4 frag_colour;

in vec4 color;

uniform vec2 positionA;
uniform vec2 positionB;
uniform int thickness;

float lineSegment(vec2 p, vec2 a, vec2 b, float thickness)
{
    vec2 pa = p - a;
    vec2 ba = b - a;

    float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );

    float k = length(pa - ba*h);

    return smoothstep(0.0, thickness, k);
}

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

    frag_colour = mix(color,vec4(0),lineSegment(uv,positionA,positionB,thickness));
}

据我了解,这是因为无论“线条”在哪里,技术上两侧的像素之间的距离都是相同的,因此,如果我尝试删除任何类型的抗锯齿,则它们都“在线上” ”,所以我的1像素宽的线最终是2像素。

enter image description here 您会看到黄色水平线的宽度为2像素(将其与文本中的单个像素进行比较)。

我在互联网上到处都尝试了其他一些片段代码,它们都存在相同的问题。

如何在GLSL中绘制像素完美的,带锯齿(而不是抗锯齿)的线条?

编辑1 通过0.5f调整位置和厚度后,移动到像素的中心,对角线在每种“台阶”上均具有抗锯齿功能。

对角线:

enter image description here

0 个答案:

没有答案