[Untiy Shader] Shader學習筆記4 - ShaderLab語法:Properties

 

這篇開始主要介紹ShaderLab的語法,參考資料主要來自官方手冊。html

如前所述,Unity中的全部Shaders都是用「ShaderLab」這種聲明式語言(Declarative programming)編寫的。真正的「shader code」寫在同一shader文件的CGPROGRAMsnippets內。CGPROGRAM snippets 是用通用的 HLSL/Cg 語言編寫的。編輯器

Properties

Properties { Property [Property ...] }ide

  • 格式
    _Name(「Display Name」,type) = defaultValue{options}
    屬性名(「顯示名」,類型) = 默認值 {可選參數}函數

  • 數字和滑動條
    FloatIntRange (min, max)
    這些都使用默認值定義了數字屬性。 Range格式會顯示一個min到max的滑動條。spa

    name ("display name", Range (min, max)) = number
    name ("display name", Float) = number3d

  • Colors and Vectors
    定義一個RGBA顏色,或者一個4D向量屬性。code

    name ("display name", Color) = (number,number,number,number)
    name ("display name", Vector) = (number,number,number,number)orm

  • Textures
    定義一個2D texturecubemap or 3D (volume) 屬性。htm

    name ("display name", 2D) = "defaulttexture" {}
    name ("display name", Cube) = "defaulttexture" {}
    name ("display name", 3D) = "defaulttexture" {}ip

    • 2D:一張2的階數大小的貼圖。這張貼圖將在採樣後被轉爲對應基於模型UV的每一個像素的顏色,最終顯示出來。
    • Cube: 即Cube map texture(立方體紋理),簡單說就是6張有聯繫的2D貼圖的組合,主要用來作反射效果(好比天空盒和動態反射),也會被轉換爲對應點的採樣。
    • 3D: Unity支持3D紋理,從着色器和腳本使用並建立。目前,3D紋理只能經過腳本建立。
  • 細節
    每一個屬性都是根據name引用的(在Unity中通常如下劃線_開始),而在編輯器界面顯示的是display name,等號後面指定了默認值:

    • 對於Range和Float其只是一個浮點數,color範圍0~1
    • Color和Vector是括號內的四個數
    • 貼圖(2D、Cube)默認值是一個空字符串,或者是內建的默認貼圖:「white」, 「black」, 「gray」 or 「bump」.

    以後在shader的fixed function部分,屬性值能夠經過方括號加屬性名獲取:[name]。
    Properties塊中的屬性會被序列化成material數據,這對於在腳本控制值很是有用 (使用 Material.SetFloat 或相似函數).

  • Property attributes and drawers
    對以前的屬性,均可以使用方括號指定可選的修飾(attributes),下面是一些Unity能夠認出的修飾,或是能夠本身指定(MaterialPropertyDrawer classes) 以控制它們在material inspector中如何被渲染。

    • [HideInInspector] 不在inspector顯示
  • [NoScaleOffset] 對於texture屬性,不會顯示貼圖的 tiling/offset字段。
  • [Normal] 指示一個貼圖是normal-map。
  • [HDR] 指示一個貼圖是高動態範圍(high-dynamic range (HDR))貼圖。
  • [PerRendererData] 指示一個貼圖是來自MaterialPropertyBlock格式的 per-renderer data 。
相關文章
相關標籤/搜索