關于Unity UI-Default Shader

之前寫功能對ui的default shader做了修改,然后遇到一些問題邑商,記錄一下(代碼可以在下載unity自選的built-in shaders 里面找到)

如何去寫自定義shader

想要重寫unity的ui材質(zhì)必須要包含一些固有的參數(shù)類型

1.模板緩沖的一堆參數(shù)摄咆,對unity的mask生效,(我覺得既然作為ui就要遵守ui的模板人断,不加沒有問題吭从,但是我看到過使用自定義材質(zhì)導致的奇怪的問題,都是不注意細節(jié)恶迈,比如z-Test默認是開啟的涩金,等等)
 Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255

        _ColorMask ("Color Mask", Float) = 15

        [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }

        Cull Off
        Lighting Off
        ZWrite Off
        ZTest [unity_GUIZTestMode]
        Blend SrcAlpha OneMinusSrcAlpha
        ColorMask [_ColorMask]

2.默認的shader會有兩個宏
      #pragma multi_compile __ UNITY_UI_CLIP_RECT
      #pragma multi_compile __ UNITY_UI_ALPHACLIP

目的是對unity的rect mask 2d 裁剪生效

     #ifdef UNITY_UI_CLIP_RECT
     color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
     #endif

     #ifdef UNITY_UI_ALPHACLIP
     clip (color.a - 0.001);
     #endif

實現(xiàn)原理其實很簡單

inline float UnityGet2DClipping (in float2 position, in float4 clipRect)
{
    // 判斷當前點是否在矩形中,返回inside.x * inside.y 如果有任意一點不在那么返回值為0
    float2 inside = step(clipRect.xy, position.xy) * step(position.xy, clipRect.zw);
    return inside.x * inside.y;
}

clip對gpu并行化處理影響比較大暇仲,所以一般都不勾上這個UNITY_UI_ALPHACLIP宏

所以看你的需求,如果需要rectMask2d的矩形裁剪 ,那么就加上步做,如果不需要,就刪掉奈附,~宏我覺得是沒必要加上了全度,沒有必要為你重寫的這個shader增加3個變體,是吧

3.關于gpu instancing

你會發(fā)現(xiàn)默認的shader帶了兩個函數(shù)接口

       UNITY_SETUP_INSTANCE_ID(v);
       UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);

第一個就是我想解釋一下的gpu instancing斥滤,聽起來還蠻高大上的
GPU Instancing是指由GPU和圖形API支持的将鸵,用一個Draw Call同時繪制多個Geometry相同的物體的技術。
通過降低dc來降低gpu的開銷
第2個是給vr用的佑颇,3dxxxx 所以一般游戲也不需要

比較 dynamic batch和 gpu instancing 區(qū)別

降低dc的辦法嘛顶掉,各有

dynamic batch:

unity自己合并網(wǎng)格的一種方式,是合并頂點數(shù)挑胸,vertex buffer合并傳遞一個比較大的頂點數(shù)量來解決問題的(沒有法線uv的情況下應該支持900一下頂點數(shù)的object)痒筒,cpu處做的優(yōu)化,條件:mesh可以不同,但材質(zhì)必須相同(同一份)簿透。

gpu instancing:

是基于圖形api來實現(xiàn)的移袍,傳遞相同的vertex buffer, mesh必須是相同的萎战,但是一些(比如位置信息,旋轉(zhuǎn)舆逃,顏色等等)是可以通過property block傳遞給gpu去改變的
附上很不錯的教程鏈接供參考

沒有他寫得好 就不多廢話了 = =

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚂维,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子路狮,更是在濱河造成了極大的恐慌虫啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奄妨,死亡現(xiàn)場離奇詭異涂籽,居然都是意外死亡,警方通過查閱死者的電腦和手機砸抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門评雌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人直焙,你說我怎么就攤上這事景东。” “怎么了奔誓?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵斤吐,是天一觀的道長。 經(jīng)常有香客問我厨喂,道長和措,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任蜕煌,我火速辦了婚禮派阱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斜纪。我一直安慰自己颁褂,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布傀广。 她就那樣靜靜地躺著颁独,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伪冰。 梳的紋絲不亂的頭發(fā)上誓酒,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼靠柑。 笑死寨辩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的歼冰。 我是一名探鬼主播靡狞,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隔嫡!你這毒婦竟也來了甸怕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤腮恩,失蹤者是張志新(化名)和其女友劉穎梢杭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秸滴,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡武契,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荡含。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒唆。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖释液,靈堂內(nèi)的尸體忽然破棺而出钧排,到底是詐尸還是另有隱情,我是刑警寧澤均澳,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布恨溜,位于F島的核電站,受9級特大地震影響找前,放射性物質(zhì)發(fā)生泄漏糟袁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一躺盛、第九天 我趴在偏房一處隱蔽的房頂上張望项戴。 院中可真熱鬧,春花似錦槽惫、人聲如沸周叮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仿耽。三九已至,卻和暖如春各薇,著一層夾襖步出監(jiān)牢的瞬間项贺,已是汗流浹背君躺。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留开缎,地道東北人棕叫。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像奕删,于是被迫代替她去往敵國和親俺泣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容