目錄
ASE斷開連接后,不解
放棄一:官方的Interface Shader的含義之理解
Emission
Opacity Mask
放棄二:ZWrite和ZTest
Clip方法
Amplify Shader Editor; 2018~2019年Unity最佳第三方Shader編輯工具,簡稱ASE
ASE斷開連接后,不解
按照教科書做了,沒效果,別人都是牛人,一到自己這,只能放棄.


放棄一:官方的Interface Shader的含義之理解
abledo,normal那些就不用說了,小學生都會
Emission
Opacity Mask
在說這兩個問題時,不得先說明ZWrite和ZTest
放棄二:ZWrite和ZTest
一般人的理解畫畫,是先畫底框,再畫背景,再畫山,然后是房子,這完成了一個完整畫
但Photoshop的渲染,不知道從那個版本開始是從Canvas底往上的渲染順序
Unity一般渲染,也是是先從靠近攝像機物件開始繪制,然后是遠離攝像機的物件
Unity一遍渲染,一邊通過ZTest判斷是否需要丟棄該像素,被遮罩的(Greater)則丟棄,所以默認是Less的,Less通過的才可以被繪制,符合一般人理解
ZWrite 就2個選項,ON/Off
而ZTester很多選項,咋看挺嚇人的,但只要以科學的態度分析一下,這些分類選項來說無非就是:大于和小于
多次混淆,學習多次,在實戰中鍛煉后發現真理如下:
要是ZTester Greater,則只有框內的能被顯示,因為Less(框外)的部分被剔除掉了
要是ZTester Always,和off等價(Unity官方隱性這么干,官方就尿性,忍了吧,也能解釋了為什么ASE沒有ZTest off的選項)
- 所以就是全顯示,場景中100個物件,你100個全顯示me》》???
要是ZTester Less,正常的前繪制,后被覆寫則丟棄;
- TMD不選它還能選什么

總結:
Unity官方好像很貼心地給了你選項;其他引擎或者也是這么干的;大神的技術書也是這么說的
但其實你懂了ZWrtie和ZTest,你也是什么都不能干
華山只有一條道,不要鉆牛角尖,給不起錢坐纜車,就沒什么捷徑了,你只能慢慢爬
a
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Greater
b,ZTest選什么都不重要,除非還有1個c在前面,而b在a前,必然先繪制,主要是a的繪制的判斷大小
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Less
result.

a. Less;只要b不選off或者always;而b要是這么選,是沒有任何實際應用意義的;
SubShader
{
Tags{ "RenderType" = "Custom" "Queue" = "Geometry+0" }
Cull Back
ZWrite On
ZTest Less
result.

Clip方法
clip是一個神秘的方法,祖傳的方法,這么多年過去了
人們總是在談論如何使用clip(),在爭論到底引數是float還是color
但沒有一個人能說出這個方法是怎么定義的,這到底是怎么樣一個SB方法
連UnpackNormal都能隨便找到原始碼
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
return packednormal.xyz * 2 - 1;
#else
return UnpackNormalmapRGorAG(packednormal);
#endif
}
那么到底clip是什么
Unity就是這么神秘
我理解的錯了,寫第二次,這還不一定對,請自行斟酌
clip(a)
if(a<0)
discard;
假如邏輯如上,那么大多數情況,shader里面的數值是范圍【0,1】,
根本不會小于0,有木有,所以,本來這個方法根本用不上的
然后,出了一個天才,一般是這么寫:
clip(a-0.5)
if(a-0.5<0)
discard;
不能說這么用的人不聰明,不是天才,但大多數人這么用,又有人更天才,又多封裝一層,最后,形成今天的狀況,難免套娃
這也就是把標準尺從0,提到了0.5,雖然沒有完全反轉邏輯,<0.5的,或者透明度低的即剔除;1==Opacity == 保留
我們也一直這么用下來了,有點約定俗成,卻沒人去責怪創造clip這個方法的Unity的sb
作為通用的Unity引擎開發人員,也有他的難處,就是你寫clip(空),因為==0,所以不會剔除任何東西,有個保護,這也是程式員的修養;
要是你寫clip這個原始方法,為了省事,或者沒深思熟慮,寫了<=0即剔除;那就更災難了
本來只要多一點點思考,或者多一點點執行力,在unity內部推行更有效的api;就不會有那么多誤解和難堪了
那么問題來了
對于邊界值,要是剛好透明度==0.5,是顯示呢還是不顯示呢?
ASE的Blend Mode改成 Masked

又TM一個隱藏屬性,你必須對blend mode, Alpha Test等了如指掌
用上Ok連線后,會多了一行Clip代碼



Mask Clip Value 也就是Opacity Mask(ASE內部)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286224.html
標籤:其他
上一篇:軟體測驗學習筆記6
