Рисование линий с идеальными пикселями в фрагментном шейдере? - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь нарисовать идеальные по пикселям линии в OpenGL, используя фрагментный шейдер.У меня есть следующий фрагментный шейдер, который я получил от этого вопроса .Однако результат имеет размер 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

...