分类
Shader按管线分类一般分为固定渲染管线与可编程渲染管线
- 固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控 制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。功能比较有限。基本所有的显卡都能正常运行。
- 可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。
Unity中的Shader分为三类
- 固定管线着色器(Fixed Function Shader)
- 表面着色器(Surface Shader)
- 顶点片段着色器(Vertex and Fragment Shader)
结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
//shader的名字会显示在unity的inspector中选择shader的菜单里面 Shader "Shader的路径和名称"{ //属性 [Properties] //可能存在多个subshader。Unity会在所有的subshader列表中选中第一个硬件可以支持的subshader SubShader{ //SubShader的标签 //[Tags] //给该SubShader中所有pass公用的设置 //[Common State] [Common Tags] //可能存在多个pass,每个pass都会引起一次渲染 Pass{ //该Pass的标签 [Tags] //渲染设置,如颜色混合 [Render Setup] //纹理设置,只有在fixed function shader中才可用 [Texture Setup] } //可以有其他的Pass [其他的Pass] } //可以有多个SubShader [其他的SubShader] //当所有的subshader失败时,使用Fallback指定的shader [Fallback] //当有自定义shader的设置UI时候用 [CustomEditor] } |
Properties
Properties中定义一些属性
1 2 3 4 5 6 7 8 |
name ("display name", Int) = number name ("display name", Float) = number name ("display name", Range (min, max)) = number name ("display name", Color) = (number,number,number,number) name ("display name", Vector) = (number,number,number,number) name ("display name", 2D) = "defaulttexture" {} name ("display name", Cube) = "defaulttexture" {} name ("display name", 3D) = "defaulttexture" {} |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Shader "Hidden/TestProperties" { Properties { _MainTex ("Texture", 2D) = "white" {} _TestInt("TestInt",Int)=1 _TestFloat("TestFloat",Float)=2.0 _TestVector4("TestVector4",Vector)=(0,0,0,0) _TestColor("TestColor",Color) = (1,0,0,1) _TestRange("TestRange",Range(0,100))=100 _Test2D("Test2D",2D) = ""{} _TestCube("TestCube",Cube) = ""{} _Test3D("Test3D",3D) = ""{} } } |
SubShader
在SubShader中定义了可选的状态,标签和一系列的Pass(Pass数目过多会引起渲染性能的下降)
SubShader中常见的状态设置有:
- 剔除设置Cull:分为剔除正面Front,剔除背面Back,关闭剔除Off三个状态
- 深度测试ZTest:可以设置为不同的深度测试函数
- 深度写入ZWrite:开启On,关闭Off
- 混合Blend:设置是否开启混合及混合形式
SubShader中的标签是一个键值对,键值均为字符串类型,常见的标签有:
- 渲染队列控制Queue
- 着色器类型RenderType
- 批处理控制DisableBatching
- 阴影投射控制ForceNoShadowCasting
Pass
Pass定义在SubShader中,其结构为:
1 2 3 4 5 6 |
Pass{ [Name] [Tags] [RenderSetup] //code } |
首先我们可以定义这个Pass块的名字,如:
1 |
Name "MyPass" |
但是要注意,在unity的内部,会把所有Pass的名字设置为大写形式,所以当我们要使用UsePass命令来使用其他的Pass时,要写为大写的名字,如:
1 |
UsePass "MyShader/MYPASS" |
在Pass中,也有属于Pass块的标签设置,如:LightMode用于设置光照模型。RequireOptions指定满足某些条件时才渲染该Pass
Fallback
当所有的subshader失败时,使用Fallback指定的shader
- 本文固定链接: http://www.u3d8.com/?p=2433
- 转载请注明: 网虫虫 在 u3d8.com 发表过