當前位置:首頁 » 操作系統 » shader源碼

shader源碼

發布時間: 2023-06-15 23:35:41

㈠ unity shader里 dot(lightCoord, lightCoord).rr

#ifdef USING_DIRECTIONAL_LIGHT
fixed atten = 1.0;
#else
float3 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1)).xyz;
fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
#endif

  • _LightMatrix0:這個變數在書的P184頁表格和官方文檔中均有說明,它在內置的AutoLight.cginc文件中的特定宏下被定義,可以用於把點從世界空間變換到該光源的局部空間下。因此,上面代碼第一句「mul(_LightMatrix0, float4(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的官網上也有說明。我們隨後使用這個二維坐標對光照衰減紋理_LightTexture0進行采樣,得到衰減值。關於_LightTexture0後面會系統講。

  • 這段代碼不夠規范:書上有說這一節的代碼不能直接用到項目里,僅僅是用來闡述原理,但如果你想用這段代碼直接發布項目的話,是需要修改的,因為當時寫的時候不夠規范。原因是這段代碼的keyword判斷條件有問題,導致_LightTexture0或_LightMatrix0可能並沒有被定義。我們可以將原來的代碼替換成下面的代碼(新的代碼也已經push到了github上):

    #ifdef USING_DIRECTIONAL_LIGHT
    fixed atten = 1.0;
    #else
    #if defined (POINT)
    // 把點坐標轉換到點光源的坐標空間中,_LightMatrix0由引擎代碼計算後傳遞到shader中,這里包含了對點光源范圍的計算,具體可參考Unity引擎源碼。經過_LightMatrix0變換後,在點光源中心處lightCoord為(0, 0, 0),在點光源的范圍邊緣處lightCoord模為1
    float3 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1)).xyz;
    // 使用點到光源中心距離的平方dot(lightCoord, lightCoord)構成二維采樣坐標,對衰減紋理_LightTexture0采樣。_LightTexture0紋理具體長什麼樣可以看後面的內容
    // UNITY_ATTEN_CHANNEL是衰減值所在的紋理通道,可以在內置的HLSLSupport.cginc文件中查看。一般PC和主機平台的話UNITY_ATTEN_CHANNEL是r通道,移動平台的話是a通道
    fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
    #elif defined (SPOT)
    // 把點坐標轉換到聚光燈的坐標空間中,_LightMatrix0由引擎代碼計算後傳遞到shader中,這裡麵包含了對聚光燈的范圍、角度的計算,具體可參考Unity引擎源碼。經過_LightMatrix0變換後,在聚光燈光源中心處或聚光燈范圍外的lightCoord為(0, 0, 0),在點光源的范圍邊緣處lightCoord模為1
    float4 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1));
    // 與點光源不同,由於聚光燈有更多的角度等要求,因此為了得到衰減值,除了需要對衰減紋理采樣外,還需要對聚光燈的范圍、張角和方向進行判斷
    // 此時衰減紋理存儲到了_LightTextureB0中,這張紋理和點光源中的_LightTexture0是等價的
    // 聚光燈的_LightTexture0存儲的不再是基於距離的衰減紋理,而是一張基於張角范圍的衰減紋理
    fixed atten = (lightCoord.z > 0) * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
    #else
    fixed atten = 1.0;
    #endif
    #endif

    上面更加精確地判斷了keyword條件,保證只在正確的時候執行訪問衰減紋理的代碼。_LightTexture0和_LightMatrix0隻在某些條件下會被定義,例如在開啟了POINT、SPOT、POINT_COOKIE、DIRECTIONAL_COOKIE等,具體我們可以在AutoLight.cginc裡面找到。但因為原來的代碼里沒有進行嚴格判斷,在發布的時候由於Unity會嚴格編譯Unity Shader根據不同的keyword生成對應的shader program,此時它就會發現我們的錯誤了。

㈡ 哪裡看unity官方shader源碼

有些Material確實沒有Color屬性. 選取材質球Shader的時候一定要看是否可以在監視面板中修改顏色屬性.如果可以修改,基本上都可以用renderer.material.color = 顏色; 修改. 等同於 renderer.material.SetColor("_Color",顏色); 有些不能直接通過面

㈢ 怎麼查看Unity built-in Shader的源代碼

官方網站上有內置材質的代碼的

下載中心地址:https://unity3d.com/get-unity/download/archive

下拉需要的版本,built-in shader就是了

熱點內容
linux個shell 發布:2025-03-23 08:26:02 瀏覽:680
oraclelinux監聽配置 發布:2025-03-23 08:07:48 瀏覽:966
鎖頻密碼忘了怎麼辦 發布:2025-03-23 08:05:30 瀏覽:739
如何查詢公會伺服器 發布:2025-03-23 07:50:24 瀏覽:768
老電腦卡頓如何升級配置 發布:2025-03-23 07:48:08 瀏覽:979
伺服器tnt禁了怎麼炸區塊 發布:2025-03-23 07:43:48 瀏覽:687
線上兒童編程哪家好 發布:2025-03-23 07:43:42 瀏覽:923
如何配置多肉的圖片 發布:2025-03-23 07:38:37 瀏覽:805
千尋位置手簿哪裡輸入賬號密碼 發布:2025-03-23 07:34:50 瀏覽:419
荒野求生游戲需要哪些配置 發布:2025-03-23 07:34:49 瀏覽:233