Unity Shader (2)

1、给shader取名字,为了方便管理可以在名字中插入‘/’分隔符来进行分层与MenuItem一个意思。

Shader "NewMenu/colorMaterialShader" {}

2、属性(Properties) 是材质与shader通信的媒介,这是可选属性

Properties

{

    Name ("display name", PropertyType) = DefaultValue

    ......

}

Name 是代码中使用的,display name是编辑器属性面板显示用的,PropertyType是数据类型

 对于Int、Float、Range(min, max) 来说都是数字类型的属性;对于Color、Vector这些复合数字类型的属性,默认值使用一个括号包围起来;2D、Cube、3D这些纹理类型的默认值通常是一个字符串跟着一个花括号,字符串要么是空要么是内置纹理的名字,花括号适用于指定一些纹理属性但在Unity 5.0后这些内容被移除。

 

3、SubShader是为实现一个效果针对不同环境下提供的实现代码块。当Unity需要加载shader的时候,会从头开始遍历所有的SubShader,选取第一个能够在目标平台(硬件支持)上顺利执行的代码实现,都没有那么就会使用Fallback(这就是个备胎啊)。

SubShader

{

    [Tag]

    [RenderSetup]

    Pass {}

    Pass {}

    ......

}

RenderSetup 是一些渲染管线的状态设置指令,作用于同一个SubShader组的所有Pass块,当要在Pass之间区分是需要各自在Pass内设置这些内容,面剔除、深度测试、混合等等

Tags 是键值对,设置渲染方式,前向渲染、控制渲染顺序等等

4、Pass 是目标渲染效果的具体实现,Pass可以在其它shader中通过UsePass "Shader_Name/Pass_Name" 被调用(Unity内部会把Pass的名字都转换为大写)

Pass {

   [Name]

   [Tags]

   [RenderSetup]

   ......//imp code

}

RenderSetup 与SubShader中的一样

Tags 设置的也是渲染相关的内容

5、FallBack "Shader_Name" 表示的当其它的效果实现代码无法使用时,这是最后的选择,但也可以不要这个备胎 FallBack Off

 

6、Unity Shader 并不是大众所说OpenGL、DirectX意义上的Shader,因为Unity Shader的管辖范围包括了众多渲染状态的设置,同时也隐藏了实现上的许多细节,更如对于细分着色器、几何着色器的支持力度不够。

 

7、GL/HLSL、GLSL能够嵌入到ShaderLab中,需要嵌套在CGPROGRAM、ENDCG与GLSLPROGRAM、ENDGLSL之间

Pass {

    Name "PassName"

    ......// 渲染状态、tags等内容的设置

    CGPROGRAM

    #pragram vertex vert

    #pragram fragment frag

    ......

    ENDCG

    ......// 其它一些内容的写入

}

 

8、Unity Shader有一种独有的shader类型,表面着色器(Surface Shader),它的主要功能是隐藏了许多光照实现的细节方便我们使用光照。另外两种是顶点(vertex shader)和片元(fragment shader)着色器。

 

posted @ 2020-03-17 21:47  no-being  阅读(218)  评论(0编辑  收藏  举报