Потеря определения текстуры в фрагментном шейдере - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь нарисовать эталонную сетку, используя фрагментный шейдер, и обнаружил, что текстура теряет свое определение при уменьшении, как вы можете видеть здесь.Кто-нибудь знает почему?Выглядит хорошо при увеличении.

текстура сетки на четырехугольнике при выходе

текстура сетки без увеличения

А вот и код:

#version 330 core
uniform int multiplicationFactor;
uniform lowp float threshold;
uniform vec4 gridColor;

in vec2 vUV;

void main() {
    // multiplicationFactor scales the number of stripes
    vec2 t = vUV * multiplicationFactor;

    // the threshold constant defines the with of the lines
    if (abs(t.x - round(t.x)) <= threshold  || abs(t.y - round(t.y)) < threshold )
        gl_FragColor = gridColor;    
    else
        discard;
}

1 Ответ

0 голосов
/ 01 марта 2019

Вы должны рассчитать расстояние до линии по отношению к размеру области просмотра.

Добавьте универсальную переменную типа vec2 resolution, которая содержит ширину и высоту области просмотра и переменную threshold должен содержать толщину линии в пикселях (например, 1,0):

#version 330 core

uniform int        multiplicationFactor;
uniform lowp float threshold;   // line width in pixel
uniform vec4       gridColor;
uniform vec2       resolution;  // width and height of the viewport

in vec2 vUV;

void main()
{
    float m   = float(multiplicationFactor);
    vec2 t    = vUV * m;
    vec2 dist = abs(t - round(t)) / m; 
    vec2 th   = threshold / resolution;

    if (dist.x > th.x  && dist.y > th.y)
        discard;

    gl_FragColor = gridColor;    
}
...