【Unity Shaders】學習筆記——SurfaceShader(一)認識結構


【Unity Shaders】學習筆記——SurfaceShader(一)認識結構


轉載請注明出處:http://www.cnblogs.com/-867259206/p/5595747.html

寫作本系列文章時使用的是Unity5.3。
寫代碼之前:

  1. 當然啦,如果Unity都沒安裝的話肯定不會來學Unity Shaders吧?

  2. 閱讀本系列文章之前你需要有一些編程的概念。

  3. 在VS里面,Unity Shaders是沒有語法高亮顯示和智能提示的,VS黨可以參考一下這篇文章使代碼高亮顯示,也可以下載shaderlabvsNShader之類的插件使代碼高亮顯示。

  4. 這是針對小白的Unity Shaders的基礎知識,如果你已經有了基礎或者你是大神,那么這些文章不適合你。

  5. 由於作者水平的局限,文中或許會有謬誤之處,懇請指出。


現在我們就要正式開始寫Unity Shaders了~

1. 新建Unity Project。
2. 在Assets文件夾下新建三個文件夾:Materials、Shaders、Textures。
3. 在Shaders文件夾下右鍵,Create-Shader-Standard Surface Shader,命名為MySurfaceShader。
4. 在Materials文件夾下新建Material,命名為MySurfaceShader,將它的Shader改為新建的Shader。
5. 新建一個Cube,將新建的材質賦給它。

如果你使用的是低於5.3的版本,你的右鍵菜單里不會有那么多種Shader,直接創建就好。直接創建的Shader代碼和Standard Surface Shader不同,其實就是比Standard Surface Shader更為簡化一點,聽了解釋你就會明白。
右鍵菜單里總共有四種Shader,分別是Standard Surface Shader、Unlit Shader、ImageEffect Shader、Compute Shader。
Unlit Shader和ImageEffect Shader都是Vertex&Fragment Shader,Compute Shader上一篇文章里講過。

讓我們打開MySurfaceShader看一看。

Shader "Custom/MySurfaceShader" {
    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;

        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"
}
  1. 第一行代碼定義的是Shader在Unity里的路徑,在Material的Shader選項的下拉列表里可以看到它,你隨時都可以修改它。

  2. 最后一行表示前面的着色程序顯卡不支持的時候就用默認的“Diffuse”。

  3. Properties括號里的東西就是Shader的屬性,打開Material的Inspector,你可以看見他們。語法就是:
    變量名 (“檢視面板里顯示的名稱”, 變量類型)= 默認值
    注意啦,沒有分號的。
    這是Unity官網對Properties的介紹。
    Unity支持的Properties類型如下:

Color :顏色 Inspector面板里會有一個選取顏色的picker
Range :某范圍內的浮點數 Inspector面板里會出現一個Slider
2D :2D紋理
Rect :創建非2次方邊長的紋理
Cube :創建Cube Map,也是一種紋理
Float :浮點數,和Range的區別就是Range是一個范圍內的數,Float是單個數
Vector:向量 定義一個四元素的容器
  1. SubShader是子着色器。Tags{}是標簽。LOD是Level of Detail的縮寫。Tag標簽里通常可以指定“Queque”和“RenderType”的值。“Queque”指渲染順序,有一些預定義的值,比如“BackGround”、“Geometry”等,可以自定義。“RenderType”是渲染類型,不透明物體用“Opaque”,透明物體用“Transparent”,還有一些其他的預定義的值,也可以自定義。

  2. CGPROGRAM和ENDCG里面是CG程序。

  3. #pragma surface surf Standard fullforwardshadowssurface說明是surface shader,可以換成Vertex或Fragment,surf是表面處理函數,在代碼段的下面就有一個surf函數。Standard fullforwardshadows是光照模型函數。

  4. #pragma target 3.0設置編譯目標Shader model的版本。

后面surf函數里的東西就是重點啦。
在surf函數的上面,將properties里的變量用相同的名稱定義一遍。還有一個Input結構體,這是輸入結構。
來看看surf函數里都做了什么吧。
先定義了一個4元的定點數c,tex2D是紋理采樣函數,第一個參數是紋理,第二個參數是uv坐標,函數的返回值乘以顏色。o這個變量就是着色器會輸出的變量,也就是存儲着我們眼睛會看到的效果的變量。后面的語句的意思就是將各個值賦給o里的不同值。rgb就是RGB顏色,Albedo是反射值,Metalic是金屬值,Smoothness是光滑值,Alpha是透明通道。其實英語好就能看懂這些變量的意思了。(原諒我的翻譯)
如果是低於5.3的版本,o 變量的類型是SurfaceOutPut,這兩種類型意思是一樣的,只不過是不同的結構體。
如果是Standard fullforwardshadows光照模型,則對應用SurfaceOutputStandard,如果是Lambert光照模型(其他版本Unity默認的光照模型),則對應SurfaceOutput。
這就是一個surface shader程序的基本結構。

下一篇文章我會詳細介紹CG的類型和Input、SurfaceOutPut這兩個結構體。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM