unity shader學習筆記(十五)——Unity中的複雜光照之光照衰減

光照衰減

  Unity中是使用一張紋理作爲查找表在片元着色器中計算逐像素光照的衰減。這樣可以使計算不依賴於數學公式的複雜性,但也有一些不好的地方:

  • 需要預處理得到採樣紋理,紋理的大小也會影響衰減的精度;
  • 不直觀,也不方便,一旦數據存儲好,就無法使用其他公式來計算衰減。

Unity是默認使用這種方式來計算逐像素的點光源和聚光燈的衰減的。Untiy內部使用一張_LightTexture0的紋理來計算衰減,_LightTexture0對角線上的紋理顏色值對應了光源空間中不同位置的點的衰減值。(0,0)點表示與光源重合的位置的點的衰減值,而(1,1)點表明了距離光源最遠的點的衰減值。計算公式如下:

float3 lightCoord = mul(unity_WolrdToLight, float4(i.worldPos, 1)).xyz;
fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;

在上面的計算中,先利用 unity_WorldToLight將點的位置從世界空間轉換到光源空間,然後使用了光源空間中的頂點距離的平方(dot函數)來對紋理採樣,最後使用宏UNITY_ATTEN_CHANNEL來計算衰減紋理中衰減值所在的分量。

  除此之外,還可以通過公式計算光源的衰減,公式如下:

float distance = length(_WorldSpaceLightPos0.xyz - i.worldPosition.xyz);
fixed atten = 1.0/distance;

但是這種方式得到的效果不是很好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章