GLSL:如何降低2D光中心密度?

时间:2014-07-09 18:10:55

标签: opengl 2d glsl fragment-shader lighting

我在互联网上找到了一个创建2D灯的着色器。

我感到好奇的是"如何让光线的中心不那么密集,以便在照亮它们的同时能够看到其他物体?"

以下是着色器

uniform vec2 lightLocation;
uniform vec3 lightColor;
uniform float screenHeight;

void main() {
    float distance = length(lightLocation - gl_FragCoord.xy);
    float attenuation = 1.0 / distance;
    vec4 color = vec4(attenuation, attenuation, attenuation, attenuation) * vec4(lightColor, 1);

    gl_FragColor = color;
}

光线渲染

    glUseProgram(lightShaderProgram);
    glUniform2f(glGetUniformLocation(lightShaderProgram, "lightLocation"), location.getX(), location.getY());
    glUniform3f(glGetUniformLocation(lightShaderProgram, "lightColor"), red, green, blue);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);

    glBegin(GL_QUADS); {
        glVertex2f(0, 0);
        glVertex2f(0, Engine.getDisplayHeight());
        glVertex2f(Engine.getDisplayWidth(), Engine.getDisplayHeight());
        glVertex2f(Engine.getDisplayWidth(), 0);
    } glEnd();

这是使用此着色器创建的灯光的图像,以及由灯光照亮的红色矩形。

The centre is very dense.

根据我从谷歌搜索中可以理解的内容,我想在着色器中应该有其他变量,但我无法弄清楚我需要哪一个以及如何实现它们。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

你可以修改float attenuation = 1.0 / distance;如果你想要距离更快的亮度下降,你可以,例如,方形它,或者如果你想让它一般变暗,那么你可以从衰减中减去一些常数。例如,http://glsl.heroku.com/e#18242.1