unity引擎源碼
『壹』 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,此時它就會發現我們的錯誤了。
『貳』 怎麼看unity3d的引擎源碼
花錢買。跟Unity公司買。一般出自幾百上千萬,會給你的。但是你要有保密協議,不能外傳。
『叄』 Unity3D這款游戲引擎軟體的源碼是開源的嗎
Unity3D是不開源的。
相關介紹:
Unity類似於Director、Blender game engine、Virtools 或 Torque Game Builder等利用交互的圖型化開發環境為首要方式的軟體。
開放源碼軟體通常是有right的,它的許可證可能包含這樣一些限制: 蓄意的保護它的開放源碼狀態,著者身份的公告,或者開發的控制。「開放源碼」正在被公眾利益軟體組織注冊為認證標記,這也是創立正式的開放源碼定義的一種手段。
(3)unity引擎源碼擴展閱讀
開放源碼軟體主要被散布在全世界的編程者隊伍所開發,但是同時一些大學,政府機構承包商,協會和商業公司也開發它。源代碼開放是信息技術發展引發網路革命所帶來的面向未來以開放創新、共同創新為特點的、以人為本的創新2.0模式在軟體行業的典型體現和生動註解。
共享軟體。允許他人自由拷貝並收取合理注冊費用。使用者可在軟體規定的試用期限內免費試用,再決定注冊購買與否。大部分共享版軟體都有功能和時間限制,試用期通常分為7天、21天、30天不等。而有的共享軟體還限制用戶只能安裝一次,若刪除後重新安裝將會失效。像Winzip、ACDSee等軟體就是共享軟體。
『肆』 怎麼看unity3d的引擎源碼
Unity3D是非開源項目,源碼已經被編譯加密了,不能查看。
如果實在想查看可以潛入unity公司內部~~·
『伍』 unity源代碼怎麼導入
將源代碼導入Assets目錄後,
unity引擎會出現以下報錯:
解決辦法:
在 unity項目Assets目錄中創建smcs.rsp文件,內容為-unsafe,其作用為可編譯不安全代碼。
『陸』 unity源碼多大
源碼大小1個G,騙人是孫子。。。 (0)踩踩(0) 下載所需:1積分下載次數:1 禁用360或Edge瀏覽器 下載申明(下載視為同意此申明) 1.在網站...