Я пытаюсь нарисовать идеальные по пикселям линии в 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 пикселя.
Вы можете видеть, как желтая горизонтальная линия имеет ширину 2 пикселя (сравните ее с отдельными пикселями в тексте).
Я попробовал какой-то другой фрагмент кода здесь и там из Интернета, и все они имеют этота же проблема.
Как нарисовать идеальную по пикселям, псевдонимную (не сглаженную) линию в GLSL?
РЕДАКТИРОВАТЬ 1 После настройки положения и толщинына 0.5f
, поэтому переместитесь в центр пикселей, диагональные линии имеют сглаживание на каждом виде «шага».
Диагональная линия: