<strong id="h7llx"><track id="h7llx"></track></strong>

<li id="h7llx"><object id="h7llx"></object></li>

<em id="h7llx"><acronym id="h7llx"><u id="h7llx"></u></acronym></em>
<rp id="h7llx"><acronym id="h7llx"><input id="h7llx"></input></acronym></rp>
<rp id="h7llx"></rp>
    <tbody id="h7llx"></tbody>

     找回密碼
     注冊帳號

    掃一掃,訪問微社區

    伊利丹·怒風 Unity3D Shader 入門精進

    39
    回復
    6767
    查看
    打印 上一主題 下一主題
    [ 復制鏈接 ]
    排名
    806
    昨日變化

    68

    主題

    420

    帖子

    3365

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    35466
    好友
    28
    蠻牛幣
    5468
    威望
    0
    注冊時間
    2014-7-21
    在線時間
    1135 小時
    最后登錄
    2019-11-18

    專欄作家

    馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

    您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

    x
    本帖最后由 wind2006 于 2017-10-13 09:02 編輯

    背景

          我們都應該經歷過這樣的過程。閱讀了各種大牛小牛發表的關于Shader的文章,他們一般都會貼出相關的代碼和效果圖,看起來酷酷的樣子。我們也是走馬觀花的看了一下代碼,有種一知半解的成就感。等真有一天需要開發相關的Shader效果的時,如果沒有保存相關的鏈接,大腦還是一片空白,然后再重頭Baidu(yi ge sha zi)一遍。實際上這種學習方式是很低效的。說白了就是沒有去深刻的研究,沒有仔細經過大腦的思考和記憶。

    本篇的目的主要是想通過另外一種方式,通過先思考再實踐的推導過程,加深大家的印象,提高學習的效果,所以本文取名叫做Shader入門精進。由于是精進,當然是大家應該有一定的Shader編程基礎。如果沒有還是建議去看一些入門的文章有一個大概印象。

    本篇不想通過什么高大上的效果,或者教條的指明一些基礎知識,而是想通過默認的 shader的簡單代碼來展開。

    實現

    我們知道 是3D引擎來做模擬2d的游戲的。

    干貨來啦!讓我們不看答案自己先回答一下下面問題,記得一定要自己先思考哦。

    問題1:如果讓我們來寫一個2D的默認Shader著色器,它應該具有什么特質呢?

    1、沒有光照也不需要光照;

    2、傳入的主紋理就是2D的圖像信息;

    3、我們普遍認知的2D圖像是有透明信息的,所以渲染的是透明物體;

    4、由于是透明物體,那么根本不需要深度測試;

    5、同樣物體的背面也是不需要渲染的(因為我們根本看不到);

    6、使用的是正交投影,所以沒有透視投影的實質內容。

    問題2:梳理一下Unity3D系統提供的Shader的類型 ,如果是你你會選擇哪一種呢? 

    Unity支持三種shader:
    1) Surface Shaders: 主要處理光照和陰影,利用了Unity的光照流水線,是一種較高層次的抽象。如果不使用光照則不要使用這種shader,因為會有不必要的性能消耗。使用Cg/HLSL編寫shader代碼,但最終的shader是需要編譯生成的。
    2)Vertex and Fragment Shaders: 這個就是一般話的shader了,可以實現任意效果,當然也要處理所有的事情,并且不能利用Unity的光照系統了。同樣也使用Cg/HLSL編寫。
    3)Fixed Function Shaders: 固定功能,只能實現簡單效果,且某些平臺支持不好,因此已經不推薦使用了,完全使用ShaderLab編寫。

    答案是:顯然沒有光照模型的存在,那么可以排除固定管線和還有surface,然后只剩下一個可編程Vertex and Fragment Shaders類型可以選了。

    好了,我的思考就到這里,下面我們揭曉答案吧。

    讓我們看一下默認的2D Shader代碼:

    [C#] 純文本查看 復制代碼
    Shader \"Sprites/Default\"
    
    {
    
    Properties
    
    {
    
    [PerRendererData] _MainTex (\"Sprite Texture\", 2D) = \"white\" {}
    
    _Color (\"Tint\", Color) = (1,1,1,1)
    
    [MaterialToggle] PixelSnap (\"Pixel snap\", Float) = 0
    
    }
    
    SubShader
    
    {
    
    Tags
    
    {
    
    \"Queue\"=\"Transparent\"
    
    \"IgnoreProjector\"=\"True\"
    
    \"RenderType\"=\"Transparent\"
    
    \"PreviewType\"=\"Plane\"
    
    \"CanUseSpriteAtlas\"=\"True\"
    
    }
    
    Cull Off //關閉背面剔除
    
    Lighting Off //關閉燈光
    
    ZWrite Off //關閉Z緩沖
    
    Blend One OneMinusSrcAlpha //混合源系數one(1) 目標系數OneMinusSrcAlpha(1-one=0)
    
    Pass
    
    {
    
    CGPROGRAM
    
    #pragma vertex vert
    
    #pragma fragment frag
    
    #pragma multi_compile _ PIXELSNAP_ON //告訴Unity編譯不同版本的Shader,這里和后面vert中的PIXELSNAP_ON對應
    
    #pragma shader_feature ETC1_EXTERNAL_ALPHA
    
    #include \"UnityCG.cginc\"
    
    struct appdata_t //vert輸入
    
    {
    
    float4 vertex : POSITION;
    
    float4 color : COLOR;
    
    float2 texcoord : TEXCOORD0;
    
    };
    
    struct v2f //vert輸出數據結構
    
    {
    
    float4 vertex : SV_POSITION;
    
    fixed4 color : COLOR;
    
    float2 texcoord : TEXCOORD0;
    
    };
    
    fixed4 _Color;
    
    v2f vert(appdata_t IN)
    
    {
    
    v2f OUT;
    
    OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
    
    OUT.texcoord = IN.texcoord;
    
    OUT.color = IN.color * _Color;
    
    #ifdef PIXELSNAP_ON
    
    OUT.vertex = UnityPixelSnap (OUT.vertex);
    
    #endif
    
    return OUT;
    
    }
    
    sampler2D _MainTex;
    
    sampler2D _AlphaTex;
    
    fixed4 SampleSpriteTexture (float2 uv)
    
    {
    
    fixed4 color = tex2D (_MainTex, uv);
    
    #if ETC1_EXTERNAL_ALPHA //etc1沒有透明通道,從另一圖中取a值
    
    // get the color from an external texture (usecase: Alpha support for ETC1 on android)
    
    color.a = tex2D (_AlphaTex, uv).r;
    
    #endif //ETC1_EXTERNAL_ALPHA
    
    return color;
    
    }
    
    fixed4 frag(v2f IN) : SV_Target
    
    {
    
    fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
    
    c.rgb *= c.a;
    
    return c;
    
    }
    
    ENDCG
    
    }
    
    }
    
    }

      

    A、顯然這是一個可編程著色器類型。

    B、然后我們思考的相關的特性。是不是逐一印證了我們的答案。

    Tags

    {

    "Queue"="Transparent" //渲染順序 是透明物體

    "IgnoreProjector"="True" //忽略投影

    "RenderType"="Transparent" //渲染類型

    "PreviewType"="Plane" //不知道什么鳥

    "CanUseSpriteAtlas"="True //可以使用精靈圖集

    }

    Cull Off //關閉背面剔除

    Lighting Off //關閉燈光

    ZWrite Off //關閉Z緩沖

    Blend One OneMinusSrcAlpha //混合源系數one(1) 目標系數OneMinusSrcAlpha(1-one=0),這個其實是一個公式不用深究,記住是渲染透明效果即可

    C、最后再讓我們補充說明下幾個我們不知道是什么鬼的東東

    1、Tags不明白的標簽

    其中LightMode標簽指定該pass的渲染路徑,Queue指定渲染順序,IgnoreProjector指定是否忽略Projector的影響,PreviewType一般用于UIshader,PreviewType=Plane的話在材質面板看到的就是一個平面而不是材質球。

    2、關于像素渲染和相關的內置函數

    也就是將像素當做頂點逐個處理的方式,在國外的2d游戲中很多都是像素游戲,國內這方面介紹很少,這里知道是干什么的就行了。

    3、etc1沒有透明通道的相關處理。

    這是一種紋理格式的處理。具體參考以下的文字引用主要是在安卓。平臺上應用

    .3之后,平臺的默認壓縮紋理改為ETC2。ETC2支持半透明,使用也很方便,不過問題是尚未普及,尤其是低端機是不支持ETC2的。Unity對不支持ETC2的機子,在加載圖片的時候會解壓為RGBA,不過這樣就會造成極大的內存浪費,也會嚴重影響加載速度。

    對于沒有透明色且為2的整次冪的正方形圖片,Unity會轉為ETC1,所以模型的紋理是可以用默認的壓縮格式。

    需要注意的是非2的整次冪的圖片,以及含有半透明的圖片。這里主要是UI圖片資源。

    Unity提供了ETC1+Alpha的支持。在圖片分頁進行如圖所示的設置

    總結

         上面就是我通過提出問題,獨立思考回答問題,最終驗證答案的精進學習過程,雖然是Unity3d

    默認2D Shader最簡單的代碼。我想也是可以學到很多Shader的基礎知識的,希望對你有用。

     

    本文引用的兩篇資料

    {Unity} Shader初步 http://blog.csdn.net/n5/article/details/50408362

    Unity的UGUI中使用ETC1+Alpha的格式 http://blog.csdn.net/langresser_king/article/details/52759899

    參與人數 1鮮花 +1 收起 理由
    小楓小 + 1 很給力!

    查看全部評分總評分 : 鮮花 +1

    本帖被以下淘專輯推薦:

    回復

    使用道具 舉報

    5熟悉之中
    885/1000
    排名
    3072
    昨日變化

    0

    主題

    48

    帖子

    885

    積分

    Rank: 5Rank: 5

    UID
    138333
    好友
    1
    蠻牛幣
    1116
    威望
    0
    注冊時間
    2016-3-4
    在線時間
    353 小時
    最后登錄
    2019-1-31
    沙發
    2017-10-13 10:54:01 只看該作者
    剛入shader,努力學習中~~
    回復 支持 反對

    使用道具 舉報

    5熟悉之中
    639/1000
    排名
    5018
    昨日變化

    15

    主題

    174

    帖子

    639

    積分

    Rank: 5Rank: 5

    UID
    223692
    好友
    0
    蠻牛幣
    1002
    威望
    0
    注冊時間
    2017-5-25
    在線時間
    162 小時
    最后登錄
    2019-5-5
    板凳
    2017-10-13 11:27:19 只看該作者
    b]好貼要收藏[
    回復

    使用道具 舉報

    排名
    14499
    昨日變化

    0

    主題

    3

    帖子

    88

    積分

    Rank: 2Rank: 2

    UID
    247380
    好友
    0
    蠻牛幣
    186
    威望
    0
    注冊時間
    2017-10-7
    在線時間
    29 小時
    最后登錄
    2018-11-19
    地板
    2017-10-13 11:51:16 只看該作者
    好貼要收藏 , 先謝謝了
    回復 支持 反對

    使用道具 舉報

    5熟悉之中
    898/1000
    排名
    4012
    昨日變化

    4

    主題

    53

    帖子

    898

    積分

    Rank: 5Rank: 5

    UID
    241332
    好友
    2
    蠻牛幣
    851
    威望
    0
    注冊時間
    2017-9-4
    在線時間
    478 小時
    最后登錄
    2020-7-21
    5#
    2017-10-13 14:15:21 只看該作者
    最近一直在看各種Shader的帖子...急需一個從零開的,易懂的教程
    回復 支持 反對

    使用道具 舉報

    5熟悉之中
    960/1000
    排名
    2234
    昨日變化

    2

    主題

    99

    帖子

    960

    積分

    Rank: 5Rank: 5

    UID
    158341
    好友
    0
    蠻牛幣
    1934
    威望
    0
    注冊時間
    2016-7-28
    在線時間
    232 小時
    最后登錄
    2018-11-14
    6#
    2017-10-14 11:53:32 只看該作者
    謝謝分享已經收藏
    回復 支持 反對

    使用道具 舉報

    6蠻牛粉絲
    1228/1500
    排名
    2538
    昨日變化

    0

    主題

    221

    帖子

    1228

    積分

    Rank: 6Rank: 6Rank: 6

    UID
    168312
    好友
    0
    蠻牛幣
    2162
    威望
    0
    注冊時間
    2016-9-13
    在線時間
    436 小時
    最后登錄
    2019-12-16
    7#
    2017-10-14 23:11:43 只看該作者
    路過收藏
    回復

    使用道具 舉報

    5熟悉之中
    708/1000
    排名
    4012
    昨日變化

    4

    主題

    97

    帖子

    708

    積分

    Rank: 5Rank: 5

    UID
    177918
    好友
    0
    蠻牛幣
    1420
    威望
    0
    注冊時間
    2016-10-24
    在線時間
    236 小時
    最后登錄
    2020-7-10
    8#
    2017-10-16 08:17:01 只看該作者
    ..........還沒開始學
    回復

    使用道具 舉報

    7日久生情
    2613/5000
    排名
    969
    昨日變化

    2

    主題

    912

    帖子

    2613

    積分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    206337
    好友
    4
    蠻牛幣
    16760
    威望
    0
    注冊時間
    2017-6-5
    在線時間
    611 小時
    最后登錄
    2020-6-12
    9#
    2017-10-16 08:32:05 只看該作者
    能看懂部分代碼。。。
    回復

    使用道具 舉報

    7日久生情
    1951/5000
    排名
    1653
    昨日變化

    11

    主題

    608

    帖子

    1951

    積分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    204035
    好友
    0
    蠻牛幣
    10887
    威望
    0
    注冊時間
    2017-1-22
    在線時間
    546 小時
    最后登錄
    2019-1-20

    活力之星

    10#
    2017-10-16 08:48:27 只看該作者
    學習啦,感謝分享
    回復

    使用道具 舉報

    7日久生情
    4411/5000
    排名
    2318
    昨日變化

    5

    主題

    3083

    帖子

    4411

    積分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    209186
    好友
    5
    蠻牛幣
    1182
    威望
    0
    注冊時間
    2017-3-1
    在線時間
    685 小時
    最后登錄
    2019-11-27
    11#
    2017-10-16 09:21:12 只看該作者
    牛逼啊,著色器比較抽象
    回復 支持 反對

    使用道具 舉報

    7日久生情
    2755/5000
    排名
    663
    昨日變化

    30

    主題

    578

    帖子

    2755

    積分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    124569
    好友
    25
    蠻牛幣
    7572
    威望
    0
    注冊時間
    2015-10-4
    在線時間
    819 小時
    最后登錄
    2019-9-26
    12#
    2017-10-16 13:58:58 只看該作者
    感謝分享
    回復

    使用道具 舉報

    3偶爾光臨
    167/300
    排名
    11087
    昨日變化

    2

    主題

    26

    帖子

    167

    積分

    Rank: 3Rank: 3Rank: 3

    UID
    243670
    好友
    0
    蠻牛幣
    435
    威望
    0
    注冊時間
    2017-9-15
    在線時間
    47 小時
    最后登錄
    2018-7-11
    13#
    2017-10-16 20:44:29 只看該作者
    剛學習shader兩天,分享的東西很有用!感謝分享
    回復 支持 反對

    使用道具 舉報

    3偶爾光臨
    197/300
    排名
    14499
    昨日變化

    0

    主題

    96

    帖子

    197

    積分

    Rank: 3Rank: 3Rank: 3

    UID
    47340
    好友
    1
    蠻牛幣
    9
    威望
    0
    注冊時間
    2014-9-30
    在線時間
    45 小時
    最后登錄
    2020-7-15
    14#
    2017-10-18 07:43:20 只看該作者
    分享的東西很不錯!感謝分享
    回復 支持 反對

    使用道具 舉報

    6蠻牛粉絲
    1263/1500
    排名
    1978
    昨日變化

    0

    主題

    128

    帖子

    1263

    積分

    Rank: 6Rank: 6Rank: 6

    UID
    247653
    好友
    0
    蠻牛幣
    4074
    威望
    0
    注冊時間
    2017-10-9
    在線時間
    451 小時
    最后登錄
    2020-7-4
    15#
    2017-10-18 09:15:00 只看該作者
    謝謝,收藏了先
    回復

    使用道具 舉報

    您需要登錄后才可以回帖 登錄 | 注冊帳號

    本版積分規則

    神马电影34pp影视午夜|久久热视频任意撸|155女生能接受几厘米|97色色97成人
    <strong id="h7llx"><track id="h7llx"></track></strong>

    <li id="h7llx"><object id="h7llx"></object></li>

    <em id="h7llx"><acronym id="h7llx"><u id="h7llx"></u></acronym></em>
    <rp id="h7llx"><acronym id="h7llx"><input id="h7llx"></input></acronym></rp>
    <rp id="h7llx"></rp>
      <tbody id="h7llx"></tbody>