當前位置:首頁 » 密碼管理 » unityshader加密

unityshader加密

發布時間: 2022-04-21 21:04:09

Ⅰ unity自定義shader的問題

注意到網上的Shader代碼中的最後一行FallBack "Specular"沒有?該語句的意思是如果沒有找到適合該Shader的硬體,那麼自動匹配Unity3D自帶的Specular Shader。
那麼答案就很清楚了:Unity3D自帶的Shader必須全面的針對幾乎所有可能出現的硬體,所以要添加盡量多的分支來滿足要求。每一個分支匹配不同的硬體。而網上下載的Shader往往只需要考慮幾種硬體就可以了。一般Shader作者會標明是否匹配移動平台,適應OpenGL ES1,2,3還是需要DX11支持等信息。如果沒有標明那麼你就只能自己嘗試了。

Ⅱ unity打開shader文件,系統詢問我要如何打開這個文件是怎麼回事

點擊更多應用,找到UNITY,找不到再點在這台電腦上查找其他應用,找到你的UNITY下載位置就行了

Ⅲ unity shader怎麼用

Shader就是在GPU上運行的程序叫做著色器程序(一般的程序在CPU上執行指令)。
Unity Shader使用的是NVIDIA公司的Cg標准語言,可以處理頂點著色、像素著色任務。Unity中的游戲對象只要是可視的,就一定會調用shader渲染,最簡單的shader就是diffuse類型,就是你給對象塗個什麼顏色,這個對象在白光下就是什麼顏色。
一般來講游戲中的 材質=shader+貼圖和其它數據,要想表現特殊的材質,比如鏡面反射、水面、塑料等,就需要編程shader(Unity中有一些默認的shader)。

Ⅳ 如何系統的學習 Unity 3D 中的 shader 編寫

僅針對你只想學些shader編程來講:

1、先要明白shader在整個3D流水線中的地位或者是作用,建立流水線概念的過程,是理解整個當代3D的基礎。

2、把Unity當做shader編輯器,這一方面講,unity的確也是不錯的,:)。由簡到難的分析和實驗各個shader,調試各種參數,用unity的所見即所得界面,了解shader內部代碼的意義。

3、就每個遇到的問題,在互聯網上查找該問題的可能的答案。如Diffuse light的演算法公式究竟是什麼,shadow map的矩陣幹嘛用的。在這塊上,請盡量查找英文資料,會痛快些。

就這么三點,第一點是面,能幫助自己確定方向。第三點是點,知道自己的短線位置在哪裡。書籍不舉例,只知道我第一本看的書是《3D游戲編程大師技巧》。後來在各種查找過程中,各種不同的書籍自然會進入自己的腰包,沒有一本是需要全部讀完的。但是讀完所有的每本的某一個部分,應該每本書都算是讀完了,你明白的。

Ⅳ 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 能加密

主要是 sm1和sm2 sm3支持的很少
在開發時切換圖形模擬環境看看shader是否報錯
另外要注意渲染效率 shader中盡量不要有太復雜的計算

Ⅶ unity shader中有哪些屬性如何使用

如果是進行3d游戲開 發的話,想必您對著兩個詞不會陌生。Shader(著色器)實際上就是一小段程序,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組 合作用,然後輸出。繪圖單元可以依據這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設 置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的就是一個Material(材質)。之後,我們便可以將材質賦予合適的 renderer(渲染器)來進行渲染(輸出)了。
所以說Shader並沒有什麼特別神奇的,它只是一段規定好輸入(顏色,貼圖等)和輸出(渲染器能夠讀懂的點和顏色的對應關系)的程序。而Shader開發者要做的就是根據輸入,進行計算變換,產生輸出而已。
Shader大體上可以分為兩類,簡單來說
表面著色器(Surface Shader) - 為你做了大部分的工作,只需要簡單的技巧即可實現很多不錯的效果。類比卡片機,上手以後不太需要很多努力就能拍出不錯的效果。
片段著色器(Fragment Shader) - 可以做的事情更多,但是也比較難寫。使用片段著色器的主要目的是可以在比較低的層級上進行更復雜(或者針對目標設備更高效)的開發。

Ⅷ Unity3D 用腳本控制Shader參數

Unity3D用腳本控制Shader參數是:this.renderer.material.SetFloat("_Progress", 0.5f);

熱點內容
sql分離 發布:2024-05-08 16:09:12 瀏覽:889
怎麼把安卓手機視頻播放器 發布:2024-05-08 16:08:17 瀏覽:565
昆侖通態腳本改變按鈕顏色 發布:2024-05-08 15:51:44 瀏覽:3
dlcache文件夾 發布:2024-05-08 15:46:49 瀏覽:897
大眾大屏科士達密碼是多少 發布:2024-05-08 15:25:47 瀏覽:514
flutter不重新編譯調試 發布:2024-05-08 15:22:42 瀏覽:713
mysql資料庫編碼修改 發布:2024-05-08 15:03:27 瀏覽:979
高斯混合模型的em演算法 發布:2024-05-08 14:56:55 瀏覽:342
您訪問過快 發布:2024-05-08 14:31:32 瀏覽:145
android廣播生命周期 發布:2024-05-08 14:28:58 瀏覽:60