如何在着色器中画个圈?

时间:2019-06-13 03:01:17

标签: glsl shader game-engine fragment-shader

我正在使用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

我真的不知道该搜索什么来找到一个sharttoy示例或执行此操作的东西,但是我之前已经看过类似的东西,所以我很确定这是可能的。

重述;我基本上只想删除着色器的一部分。

不确定使用着色器是否是解决此问题的最佳方法,如果还有其他方法,请告诉我,我将重提问题。

1 个答案:

答案 0 :(得分:0)

您可以轻松地将其扩展为使用任意位置作为“灯光”。

  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);
    }