2013-07-26 82 views
0

我有一個簡單的GLSL片段着色器,我正在使用2D光源,有什麼方法可以修改此設置來實現光線的半徑和/或強度?目前唯一可用的修改是恆定/線性/二次光衰減。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); 
} 
+2

真實世界中的燈光沒有半徑。你想要在這個任意半徑處發生什麼? –

+0

強度可以通過法線與光線位置的距離來計算。對不起,我不能提供任何代碼,但這應該是它背後的理論。 – Bisder

回答

0

強度 - 剛剛乘法光通過顏色強度參數。您也可以將預乘光色傳遞給着色器。

半徑。二次衰減光的影響基本上是無界的。出於實際的目的,我們可以將半徑定義爲光的影響大於某個任意常數時的最大距離。這意味着半徑由光的衰減和強度來定義。現在取決於你想要達到什麼目的,你應該調整衰減或強度來設置所需的範圍。在着色器之前也應該完成 - 只需傳遞適當的光線顏色和衰減值即可。