2D GLSL光半径/强度

时间:2013-07-26 22:43:36

标签: opengl glsl shader lighting fragment-shader

我有一个简单的GLSL片段着色器,我用于2D灯,有没有办法修改它来实现设置灯的半径和/或强度?目前唯一可用的修改是恒定/线性/二次光衰减。

这是当前着色器代码(未更新为现代OpenGL)

uniform vec2 lightpos;
uniform vec4 lightColor;
uniform float screenHeight;
uniform vec3 lightAttenuation;
uniform float radius; //Doesn't do anything
uniform float intensity; //Doesn't do anything

uniform sampler2D texture;

void main()
{       
    vec2 pixel=gl_FragCoord.xy;     
    pixel.y=screenHeight-pixel.y;   
    vec2 aux=lightpos-pixel;
    float distance=length(aux);
    float attenuation=1.0/(lightAttenuation.x+lightAttenuation.y*distance+lightAttenuation.z*distance*distance);
    vec4 color=vec4(attenuation,attenuation,attenuation,1.0)*lightColor;
    gl_FragColor = color;//*texture2D(texture,gl_TexCoord[0].st);
}

1 个答案:

答案 0 :(得分:0)

强度 - 只需按强度参数乘以浅色。您还可以将预乘的灯光颜色传递给着色器。

半径。对于二次衰减,光的影响基本上是无限的。出于实际目的,我们可以将半径定义为光的影响大于某个任意常数的最大距离。这意味着半径由光的衰减和强度定义。现在,根据您要实现的目标,您应调整衰减或强度以设置所需范围。在着色器之前也应该这样做 - 只需传递适当的光色和衰减值。