ShaderLab开发规范之布局

一. ShaderLab 代码整体布局

 Shader "Shader名字"
 {
     //1.属性块
     Properties{}

     //2.代码块
     CGINCLUDE
     ...
     ENDCG
     或者
     HLSLINCLUDE
     ...
     ENDHLSL
     或者
     GLSLINCLUDE
     ...
     ENDGLSL

     //3.子着色器列表块
     SubShader{
         Tags{}
         Pass{...}
         Pass{...}
         ...
     }
     SubShader{...}
     ...

     //4.备用着色器定义块
     FallBack "..."
 }

二. 材质属性定义

  • 关键字:Properties

  • 属性定义格式: 属性名("属性描述",属性类型) = 属性默认值

  • 用处:只要在这里被定义的属性,就在Unity的Editor中,被材质的默认Inspector识别.也就是说可以通过编辑器修改这个属性,设置预设值.

  • 需要注意:
    1. 每个属性的定义,在语句最后一定不能有分号

    2. 这里定义了某个属性,那么使用这个Shader的材质,本属性就是不会被SetGlobalxxx来改变的.

  • 布局示例:

   Properties
   {
       //主颜色,类型:颜色
       _Color ("Main Color", Color) = (1, 1, 1, 1)
       //颜色的调整值, 类型:范围值
       _ColorMultiplier("Color Multipler", Range(0,10)) = 2  
       //主纹理, 类型:纹理
       _MainTex ("Effect Texture", 2D) = "black" {} 
       //环境立方体贴图, 类型: 立方体贴图
       _EnvCube("Env Cube", Cube) = "white" {} 
       //切割区域, 类型:向量
       _ClipRect("ClipRect", Vector) = (-50000,-50000,50000,50000)
       //曝光系数, 类型:浮点值
       _BloomFactor("BloomFactor", Float) = 0
   }

三. 逻辑代码区域

  • 关键字:会根据使用的语言有不同.
    • cg语言:CGINCLUDE ... ENDCG

    • hlsl语言:HLSLINCLUDE ... ENDHLSL

    • glsl语言:GLSLINCLUDE ... ENDGLSL

  • 用处:当前着色器中需要有不同逻辑的子着色器或者pass时,方便代码编写和统一管理.也是为了用于分离业务逻辑定义和渲染标记定义.

  • 需要注意:
    1. 每个着色器的代码文件中尽量只有一个逻辑代码块.

    2. 每个着色器的代码文件中尽量只使用一种高级语言,cg,hlsl,glsl.其中

你可能感兴趣的:(unity3d,shader)