我在互联网上找到了一个创建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();
这是使用此着色器创建的灯光的图像,以及由灯光照亮的红色矩形。
根据我从谷歌搜索中可以理解的内容,我想在着色器中应该有其他变量,但我无法弄清楚我需要哪一个以及如何实现它们。有什么帮助吗?
答案 0 :(得分:1)
你可以修改float attenuation = 1.0 / distance;
如果你想要距离更快的亮度下降,你可以,例如,方形它,或者如果你想让它一般变暗,那么你可以从衰减中减去一些常数。例如,http://glsl.heroku.com/e#18242.1