【Unity Shader】1.Unity的基本Shader框架學習(顏色,光照,材質)

   首先說明,博主是一位Shader的初學者,在大學裏也是菜鳥一枚,只是對遊戲有着熱情纔開始學習Shader,若有寫的不好地方,望各位見諒。。。哈哈哈,廢話不多說,開始正題。O(∩_∩)O

效果展示

這裏寫圖片描述


一、基本概念瞭解

     1.學過計算機圖形學的同學都知道,計算機圖形學中的渲染管線一共有兩種:

1)固定功能渲染管線
2)可編程渲染管線

ps:渲染管線就是計算機繪製圖形的過程:
   局部座標系->世界座標系->觀察座標系->背面消除->光照->裁剪->投影->計算視口->光柵化
  無論是固定渲染管線還是可編程管線,大致都需要經過這九個步驟

那麼什麼叫固定功能渲染管線和可編程渲染管線呢?

   可編程渲染管線,從名字上就可以看出來了,可編程,所謂的可編程就是自己可以控制了嘛,就像API函數封裝前的樣子,可以自己隨意修改達到自己想要的效果
   這是博主自己的理解,若有說的不好地方,希望大家指出。。。

   Shader,即着色器,着色器分爲頂點着色器和像素着色器。
    頂點着色器是在進行座標變換和光照計算時工作
    像素着色器是在光柵化環節工作

    人們對着色器進行自定義編程時,這個流水線就叫做 **可編程管線**
    當遊戲或應用程序完全使用默認着色器程序時,這個流水線就叫做 **固定管線**

按照這兩個管線來進行分類的話,unity中的shader大致也可分爲三類:

1.固定功能着色器

2.表面着色器

3.頂點着色器&片段着色器

顧名思義

固定功能着色器便是我們所說的固定功能渲染管線的具體表現
表面着色器、頂點着色器以及片段着色器便屬於可編程渲染管線。

   表面着色器這個概念更多的只是在Unity中聽說,可以說是Unity自己發揚光大的一項使Shader的書寫門檻降低和更易用的技術。

   頂點着色器和片段着色器,應該很多學過DirectX和OpenGL的同學都不陌生:

   頂點着色器:產生紋理座標,顏色,點大小,霧座標,然後把它們傳遞給裁剪階段。
   片段着色器:進行紋理查找,決定什麼時候執行紋理查找,是否進行紋理查找,及把什麼作爲紋理座標

那麼,在unity中如何區分這三類Shader呢?

  • 沒有嵌套CG語言,也就是代碼段中沒有CGPROGARAM和ENDCG關鍵字的,就是固定功能着色器。

  • 嵌套了CG語言,代碼段中有surf函數的,就是表面着色器。

  • 嵌套了CG語言,代碼段中有#pragma vertex name和 #pragma fragment frag聲明的,就是頂點着色器&片段着色器。

二、Unity中Shader和Material的關係

   Shader實際上就是一小段程序,它負責將輸入的Mesh以指定的方式和輸入的貼圖或者顏色等組合作用,然後輸出。繪圖單元可以依據這個輸出來將圖像繪製到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的一個就是Material。
   之後,我們便可以將材質賦予給合適的render來渲染輸出了。。。所以說,Shader就是規定好輸入和輸出的程序。而shader的開發者就是要做根據輸入,進行計算變換,產生輸出而已。

三、Unity中基本Shader框架學習

先來看一段代碼:

Shader "Custom/Lighting_Material" {

Properties
       {
          _MainColor("主顏色",Color) = (1,.1,.5,1)
       }
    SubShader
    {

      Pass
      {
         Material
         {
            Diffuse[_MainColor]
            Ambient[_MainColor]
         }
         Lighting On
      }
    }

   //備胎設爲Unity自帶的普通漫反射  
       Fallback" Diffuse "  
}

大致的框架爲:

1.着色器通過properties來可選的定義一個可通過材質設定界面來自定義的列表。具體到上述代碼中寫的Properties,就是定義了一個基本屬性,參數名叫做_MainColor,在編輯器中顯示的名稱叫做“主顏色”
2.後面緊跟着核心部分子着色器SubShader,裏面的一個Pass裏面設置了顏色爲我們屬性中定義的那個_ MainColor
3.添加一句Fallback代碼用於應對我們Shader中的SubShader不能正確運行的情況,類似我們switch裏面最後的default,當所有的通道都不能滿足時就執行這個

四、Properties屬性 相關寫法列舉

Properties { Property [Property ...] }

定義屬性塊,其中可包含多個屬性,其定義如下:

name (“display name”, Range (min, max)) =number
定義浮點數屬性,在檢視器中可通過一個標註最大最小值的滑條來修改。

name (“display name”, Color) =(number,number,number,number) 定義顏色屬性

name (“display name”, 2D) = “name” {options }
定義2D紋理屬性

此處博主只列舉部分,需要其他功能的請自行查閱

示例:

Shader "Custom/Lighting_Material_Beat" {
    Properties
    {
       _MainColor("主顏色",Color) = (1,1,1,0)
       _SpecColor("反射高光",Color) = (1,1,1,0)
       _Emission("自發光",Color) = (0,0,0,0)
       _Shininess("光澤度",Range(0.1,2)) = 0.7
       _MainTex("主紋理",2D) = "white"{}
    }
}

五、用於通道Pass中的代碼寫法列舉

這些代碼一般是寫在Pass{ }中的:

Color Color
設定對象的純色。顏色即可以是括號中的四值(RGBA),也可以是被方框包圍的顏色屬性名。

Material { Material Block }
材質塊被用於定義對象的材質屬性。

Lighting On | Off
開啓光照,也就是定義材質塊中的設定是否有效。想要有效的話必須使用Lighting On命令開啓光照,而顏色則通過Color命令直接給出。

SeparateSpecular On | Off
開啓獨立鏡面反射。這個命令會添加高光光照到着色器通道的末尾,因此貼圖對高光沒有影響。只在光照開啓時有效。

ColorMaterial AmbientAndDiffuse | Emission
使用每頂點的顏色替代材質中的顏色集。AmbientAndDiffuse 替代材質的陰影光和漫反射值;Emission 替代材質中的光發射值。

示例:

Pass
       {
         Material
         {
           Diffuse[_MainColor]
           Ambient[_MainColor]
           //光澤度
           Shininess[_Shininess]
           //反射高光
           Specular[_SpecColor]
           //自發光
           Emission[_Emission]
         }
         //開啓光照
         Lighting On
         //開啓鏡面反射
         SeparateSpecular On
       }

[]中的定義詳見前面屬性Properties中的定義

六、材質塊Material Block 中相關寫法列舉

Diffuse Color(R,G,B,A)
漫反射顏色構成。這是對象的基本顏色。
Ambient Color(R,G,B,A)
環境色顏色構成.這是當對象被RenderSettings.中設定的環境色所照射時對象所表現的顏色。
`Specular Color(R,G,B,A) 
對象反射高光的顏色。(R,G,B,A)四個分量分別代表紅綠藍和Alpha,取值爲01之間。`
Shininess Number
加亮時的光澤度,在01之間。0的時候你會發現更大的高亮也看起來像漫反射光照,1的時候你會獲得一個細微的亮斑。
Emission Color 
自發光顏色,也就是當不被任何光照所照到時,對象的顏色。(R,G,B,A)四個分量分別代表紅綠藍和Alpha,取值爲01之間。

示例:

Material
         {
           Diffuse[_MainColor]
           Ambient[_MainColor]
           //光澤度
           Shininess[_Shininess]
           //反射高光
           Specular[_SpecColor]
           //自發光
           Emission[_Emission]
         }

[]中參數的定義詳見前面Properties中的定義,屬性中的定義

七、Shader實戰

1.純色的shader

1)首先,我們打開Unity創建工程,創建幾個文件夾分別是Material,Shader,Texture 這就不需要多說了吧
2)在Shader文件夾上點擊右鍵Create->Shader->Standard Surface Shader,取名。。。
這裏寫圖片描述
3)打開所創建的shader文件,刪除原本的代碼,輸入以下代碼

Shader "Custom/SingleColor" {
    //---------------------------------【子着色器】----------------------------------  
    SubShader  
    {  
        //----------------通道---------------  
        Pass  
        {  
            //設爲藍色單色  
            Color(0,0,0.5,0)  
        }  
    }  

    //FallBack "Diffuse"
}

4)保存shader文件,返回unity中,在Material上點擊右鍵創建材質,將Shader文件拖到材質文件上
這就是我們剛剛寫的Shader的效果

5)然後在場景中創建一個Cube,將材質賦予此Cube
這就是我們寫的shader的效果

是不是很激動呢,嘿嘿,畢竟這是自己寫的第一個shader

2.光照&材質shader
一樣的方法,在這裏,博主就不多說啦。。。

Shader "Custom/Lighting_Material" {

Properties
       {
          _MainColor("主顏色",Color) = (1,.1,.5,1)
       }
    SubShader
    {

      Pass
      {
         Material
         {
            Diffuse[_MainColor]
            Ambient[_MainColor]
         }
         Lighting On
      }
    }
}

效果:
這裏寫圖片描述
這裏寫圖片描述

3.光照&材質&貼圖

Shader "Custom/Lighting_Material_Beat" {
    Properties
    {
       _MainColor("主顏色",Color) = (1,1,1,0)
       _SpecColor("反射高光",Color) = (1,1,1,0)
       _Emission("自發光",Color) = (0,0,0,0)
       _Shininess("光澤度",Range(0.1,2)) = 0.7
       _MainTex("主紋理",2D) = "white"{}
    }

    SubShader
    {
       Pass
       {
         Material
         {
           Diffuse[_MainColor]
           Ambient[_MainColor]
           //光澤度
           Shininess[_Shininess]
           //反射高光
           Specular[_SpecColor]
           //自發光
           Emission[_Emission]
         }
         //開啓光照
         Lighting On
         //開啓鏡面反射
         SeparateSpecular On

         SetTexture[_MainTex]
         {
           Combine texture * primary DOUBLE ,texture * primary
         }
       }
    }
}

在貼圖屬性中,shader賦予給材質以後,材質可選擇什麼紋理

這裏寫圖片描述

這裏寫圖片描述

大家是不是都做完了呢。。。。。。好啦,今天就寫到這裏,謝謝大家的關注,時間不早了,寫了一下午,吃飯去咯,希望能幫到大家,同時也是對我自己的一種鞭策吧,加油,騷年

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章