Как сделать круг из шейдера? - PullRequest
0 голосов
/ 13 июня 2019

Я работаю над игрой с использованием шейдеров GLSL

Я использую Go с библиотекой Pixel, это игра 2D, и в ней нет "камеры" (у меня есть люди, которые предлагают использовать вторую камеручтобы достичь этого)

Мой текущий шейдер - это просто базовый шейдер в оттенках серого

#version 330 core
in vec2  vTexCoords;
out vec4 fragColor;
uniform vec4 uTexBounds;
uniform sampler2D uTexture;
void main() {
    // Get our current screen coordinate
    vec2 t = (vTexCoords - uTexBounds.xy) / uTexBounds.zw;
    // Sum our 3 color channels
    float sum  = texture(uTexture, t).r;
        sum += texture(uTexture, t).g;
        sum += texture(uTexture, t).b;
    // Divide by 3, and set the output to the result
    vec4 color = vec4( sum/3, sum/3, sum/3, 1.0);
    fragColor = color;
}

Я хочу выделить круг шейдера, чтобы показать цвет объектов почти так же, как светит светих.

Это пример того, чего я пытаюсь достичь

example

Я не могу понять, чтоищите, чтобы найти пример с шейдертой или что-то подобное, но раньше я видел нечто подобное, поэтому я уверен, что это возможно.

Переформулировать;Я просто хочу удалить часть шейдера.

Не уверен, что использование шейдеров - лучший способ приблизиться к этому, если есть другой способ, пожалуйста, дайте мне знать, и я переделаю вопрос.

1 Ответ

0 голосов
/ 13 июня 2019

Вы можете легко расширить это, чтобы использовать любую произвольную позицию в качестве «света».

  1. Объявить единый буфер для хранения текущего местоположения и радиуса.
  2. Если расстояниеот заданного местоположения до текущего пикселя меньше квадрата радиуса, возвращает текущий цвет.
  3. В противном случае возвращает его шкалу серого.

    vec2 displacement = t - light_location;
    float distanceSq = (displacement.x * displacement.x + displacement.y * displacement.y)
    float radiusSq = radius * radius;
    if(distanceSq < radiusSq) {
        fragColor = texture(uTexture);
    } else {
        float sum = texture(uTexture).r;
        sum += texture(uTexture).g;
        sum += texture(uTexture).b;
        float grey = sum / 3.0f;
       fragColor = vec4(grey, grey, grey, 1.0f);
    }
    
...