Unity自學筆記2017.9.28 著色器

著色器分析


首先看一下create shader時,unity的幾種著色器

unity著色器

前三個都可以直接拖到material上俩由,圖標也相同苦银。

幾種shader

查了一下發(fā)現(xiàn)

Standard surface shader會產生一個包含了標準光照模型(使用了unity5中新添加的基于物理的渲染方法)的表面著色器模板(為我們提供了典型的表面著色器的實現(xiàn)方法)
Unlit shader則會產生一個不包含關照(但包含霧效)的基本的頂點/片元著色器
Image effect shader則為我們實現(xiàn)各種屏幕后處理效果提供了一個基本的模板
Compute shader會產生一種特殊的shader文件莹妒,這類shader目的是利用GPU的并行性來進行一些與常規(guī)渲染流水線無關的計算红碑。
ShaderVariantCollection是Unity在5.x后提供的一個著色器預編譯的方案舞吭,使用它可以輕松的指定需要著色器變體,在需要的時候加載、解析镣典、編譯等一條龍服務。 其實就是一個著色器資源列表唾琼,是一個由通道類型+著色器關鍵字組合的列表

似懂非懂……看一下代碼吧

Standard surface shader

Shader "Custom/1" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_CBUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_CBUFFER_END

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
結合material面板食用

可以看到可以改變的有顏色兄春、貼圖、平滑度和金屬度(自己定義的float類型)

#pragma surface surf Standard fullforwardshadows看起來這是一個表面著色器

著色器名稱 含義
surface shaders 指的是表面著色器锡溯,據說本質上也是頂點和片段著色器
vertex and fragment shaders 頂點著色器主要是處理頂點的平移赶舆,縮放等位置或者大小相關的函數。片段著色器主要處理的是像素的顏色祭饭。
fixed function shaders 指固定功能著色器

代碼主體部分可以看到芜茵。void surf (Input IN, inout SurfaceOutputStandard o)有這樣的一個輸入。然后這個著色器把材質和顏色數據簡單相乘得到的rgb值作為了o的Albedo(反照率倡蝙,=diffuse)九串,其他的值就直接賦給了光照模型。

Input是之前定義的結構體(據說是用于計算中的信息傳遞)寺鸥,SurfaceOutputStandard是標準光照模型猪钮,inout指的是可以輸入也可以輸出

一點疑問fixed4 c中fixed4這個變量是用rgba來指代思維的數據嗎?網上查到的定義是:

fixed:11位低精度浮點數。范圍是[-2, 2]胆建,精度是1/256烤低。

Unlit shader

Shader "Unlit/US"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

#pragma vertex vert說明了這是頂點著色器弊攘。#pragma fragment frag應該是片段著色器的意思仔涩。在Pass中也能看到對應兩者的函數。
#pragma multi_compile_fog開啟了霧效

float4 vertex : POSITION; ':' 后面的是語義黍翎,代表這個變量的意義

看起來可以調整貼圖的uv坐標

Tiling表示UV坐標的縮放倍數凉驻,Offset表示UV坐標的起始位置腻要。

ShaderVariantCollection不能用VS打開,嗯……以后研究


看起來可以放很多shader

今日參考資料:
【淺墨Unity3D Shader編程】之一 夏威夷篇:游戲場景的創(chuàng)建 & 第一個Shader的書寫
yejianyong:unity shader入門指南與總結
Unity3D Shader加載時機和預編譯
Unity5中新的Shader

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沿侈,隨后出現(xiàn)的幾起案子闯第,更是在濱河造成了極大的恐慌,老刑警劉巖缀拭,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咳短,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛛淋,警方通過查閱死者的電腦和手機咙好,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐荷,“玉大人勾效,你說我怎么就攤上這事。” “怎么了层宫?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵杨伙,是天一觀的道長。 經常有香客問我萌腿,道長限匣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任毁菱,我火速辦了婚禮米死,結果婚禮上,老公的妹妹穿的比我還像新娘贮庞。我一直安慰自己峦筒,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布窗慎。 她就那樣靜靜地躺著物喷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遮斥。 梳的紋絲不亂的頭發(fā)上脯丝,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音伏伐,去河邊找鬼宠进。 笑死,一個胖子當著我的面吹牛藐翎,可吹牛的內容都是我干的材蹬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吝镣,長吁一口氣:“原來是場噩夢啊……” “哼堤器!你這毒婦竟也來了?” 一聲冷哼從身側響起末贾,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤闸溃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拱撵,有當地人在樹林里發(fā)現(xiàn)了一具尸體辉川,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年拴测,在試婚紗的時候發(fā)現(xiàn)自己被綠了乓旗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡集索,死狀恐怖屿愚,靈堂內的尸體忽然破棺而出汇跨,到底是詐尸還是另有隱情,我是刑警寧澤妆距,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布穷遂,位于F島的核電站,受9級特大地震影響娱据,放射性物質發(fā)生泄漏塞颁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一吸耿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酷窥,春花似錦咽安、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沸伏,卻和暖如春糕珊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毅糟。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工红选, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姆另。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓喇肋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迹辐。 傳聞我的和親對象是個殘疾皇子蝶防,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容

  • <轉>我也忘了轉自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對3D對象進行操作...
    星易乾川閱讀 5,590評論 1 16
  • Unity shader 官網文檔全方位學習(一)What?? Shader,看起來好高級的樣子明吩,是的间学,這是Uni...
    狼之獨步閱讀 6,026評論 0 12
  • 寫與燈光交互的Shader是很復雜的,因為有不同的燈光類型(light Type)印荔,不同的陰影選項(Shadow ...
    Unity云中客閱讀 6,808評論 0 4
  • “哇哇哇低葫!”這是我第一次發(fā)出的聲音。我困難的睜開眼睛仍律,看著周圍帶著白色的帽子氮采,穿著白色的衣服的阿姨們。她們把我抱起...
    懶晨閱讀 230評論 0 1
  • @西瓜仙女 望喜歡哦染苛!?(?^o^?)? 小禮物走一走鹊漠,來簡書關注我
    唐小清呀閱讀 200評論 0 1