0

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

这是当前的着色器代码(未更新到现代 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);
}
4

1 回答 1

0

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

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

于 2013-07-28T15:57:20.103 回答