當前位置:編程學習大全網 - 源碼下載 - Android著色器源代碼

Android著色器源代碼

#ifdef使用_DIRECTIONAL_LIGHT

固定atten = 1.0;

#否則

float 3 light coord = mul(_ light matrix 0,float4(i.worldPos,1))。xyz

fixed atten = tex2D(_ light texture 0,dot(lightCoord,lightCoord)。rr)。UNITY _ ATTEN _頻道;

#endif

_LightMatrix0:該變量在本書P184頁的表格和官方文檔中有描述。它在內置AutoLight.cginc文件中的特定宏下定義,可用於將點從世界空間轉換到光源的局部空間。所以上面代碼的第壹句話“mul (_ lightmatrix0,float 4 (i.worldpos,1))。XYZ”就是把頂點坐標轉換成光源空間中的坐標,書中也有解釋。

_LightTexture0:類似於_LightMatrix0,也是在內置AutoLight.cginc文件中的特定宏下定義的,後面是_LightMatrix0的定義。它是壹個包含光源衰減信息的衰減紋理,我們可以進壹步處理第壹個代碼得到的坐標,得到衰減紋理的采樣坐標。由於Unity並沒有正式說明_LightMatrix0的數值範圍的具體含義,所以我們可以推斷出_LightMatrix0得到的坐標模值範圍將是[0,1],即與光源重合的地方是(0,0,0),光源範圍邊界處的模值是1。在dot(lightCoord,lightCoord)的句子裏。rr,首先從點積得到光源距離的平方,這是壹個標量。我們表演。對這個變量進行rr運算,相當於構造了壹個二維向量,這個二維向量的每個分量的值就是標量值,從而得到壹個二維采樣坐標。這個操作是shader中常見的swizzling操作,在Cg官網也有說明。然後,我們使用這個二維坐標對照明衰減texture _LightTexture0進行采樣,並獲得衰減值。_LightTexture0後面會詳細討論。

這個代碼不規範:書上說這壹節的代碼不能直接用在項目中,只是用來說明原理,但是如果妳想直接用這個代碼發布項目,需要修改,因為當時還不規範。原因是這段代碼的關鍵字判斷條件有問題,可能沒有定義_LightTexture0或者_LightMatrix0。我們可以用下面的代碼替換原來的代碼(新代碼也已經推送到github了):

#ifdef使用_DIRECTIONAL_LIGHT

固定atten = 1.0;

#否則

#如果已定義(點)

//將點坐標轉換為點光源的坐標空間。_LightMatrix0由引擎代碼計算並傳遞給shader,它包含點光源範圍的計算。詳情請參考Unity引擎的源代碼。經過_LightMatrix0變換後,點光源中心的lightCoord為(0,0,0),點光源範圍邊緣的lightCoord模為1。

float 3 light coord = mul(_ light matrix 0,float4(i.worldPos,1))。xyz

//用點到光源中心的距離的方點(lightCoord,lightCoord)組成二維采樣坐標,采樣衰減紋理_LightTexture0。_LightTexture0的紋理是什麽樣的,後面可以看到。

// UNITY_ATTEN_CHANNEL是衰減值所在的紋理通道,可以在內置的HLSLSupport.cginc文件中查看。UNITY_ATTEN_CHANNEL是通用PC和主機平臺的R通道,也是移動平臺的壹個通道。

fixed atten = tex2D(_ light texture 0,dot(lightCoord,lightCoord)。rr)。UNITY _ ATTEN _頻道;

#elif定義(現場)

//將點坐標轉換到聚光燈的坐標空間。_LightMatrix0由引擎代碼計算並傳遞給shader,其中包括聚光燈範圍和角度的計算。詳情請參考Unity引擎的源代碼。_LightMatrix0變換後,聚光燈光源中心或聚光燈範圍外的lightCoord為(0,0,0),點光源範圍邊緣的lightCoord模數為1。

float 4 light coord = mul(_ light matrix 0,float4(i.worldPos,1));

//與點光源不同,聚光燈有更多的角度等要求,所以為了得到衰減值,除了采樣衰減紋理外,還需要判斷聚光燈的範圍、開啟角度和方向。

//此時衰減紋理存儲在_LightTextureB0中,這個紋理相當於點光源中的_LightTexture0。

//聚光燈的_LightTexture0不再存儲基於距離的衰減紋理,而是存儲基於張角範圍的衰減紋理。

固定atten =(light coord . z & gt;0) * tex2D(_LightTexture0,lightCoord.xy / lightCoord.w + 0.5)。w * tex2D(_LightTextureB0,dot(lightCoord,lightCoord)。rr)。UNITY _ ATTEN _頻道;

#否則

固定atten = 1.0;

#endif

#endif

上面對關鍵字條件的判斷更加準確,保證了訪問衰減紋理的代碼只在正確的時間執行。_LightTexture0和_LightMatrix0只能在壹定的條件下定義,比如打開POINT、SPOT、POINT_COOKIE和DIRECTIONAL_COOKIE時,這可以在AutoLight.cginc中找到,但是由於在原代碼中沒有嚴格的判斷,Unity會嚴格編譯Unity Shader根據發布時不同的關鍵字生成相應的著色器程序,這個時候就會發現我們的錯誤。

  • 上一篇:Servlet項目源代碼
  • 下一篇:價值百萬,為何應屆生的身份如此寶貴?
  • copyright 2024編程學習大全網