UnityShader(1)-基础结构

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
40
41
42
Shader "MyShaderName" {
Properties{
//属性 Name通常需要下划线开始 display name是显然在材质面板上的名字,properytype是其类型 ,最后需要赋一个默认值
Name ("display name",PropertyType)=DefaultValue
}
SubShader{
//针对显卡A的SubShader SubShader可有多个,但最少需要一个
//真正意义上的Shader代码会出现在这里
//表面着色器(Surface shader) or 顶点/片元着色器(Vertex/Fragment shader) or 固定函数着色器(Fixed Function shader)


//可选
[Tags] //标签 为键值对
Tags{"TagName1"="Value1" "TagName2"="Value2"}
[RenderSetup] //状态

Pass{
//设置渲染状态和标签 Pass数目应尽量少,多会造成渲染性能下降
[Name] //设置该Pass名称 可使用ShaderLab的UsePass命令直接使用其他Shader中的Pass ,提高了复用性
[Tags] //不同于subshader中的标签
[RenderSetup]

CGPROGRAM //开始CG代码片段

#pragma vertex vert //编译指令,某函数包含哪类着色器
#pragma fragment frag

//整体CG代码写在这里

ENDCG
//其他设置
}
//其他需要的Pass
}
SubShader{
//针对显卡B
}


Fallback "VertexLit" //用于告诉Unity,上述SubShader在该显卡上都不支持,使用最低级Shader
//Fallback "Name" or Fallback off(关闭fallback)
}

属性类型

image

从上图看出对于Int,Float,Range类型,默认值是一个单独数字,Color和Vector是四维的向量,2d,cube,3d是通过一个字符串后跟一个花括号,字符串要么是空的要么就是内置的纹理名称。

标签

image

渲染状态设置

image

Pass标签

image

相关着色器的语义

image
image
image

UnityShader也支持特殊的Pass,如UsePass和GrabPass,GrabPass负责抓取屏幕并将结果存储在一张纹理中,便于后续Pass处理。

  1. 表面着色器无需写在Pass语义快中,表面着色器无需关心有多少个Pass2
  2. 顶点/片元着色器是写在Pass中,我们需要自己定义Pass中的shader代码,灵活性更高,控制渲染的实现细节。
  3. 都在CGPROGRAM到ENDCG之间写,但是区别在一个在subshader中,一个在pass中。

选择哪种shader形式

  1. 如果需求中有明确表示对旧设备进行支持,需要使用固定函数着色器,否则使用可编程管线着色器
  2. 如果和各种光源打交道,采用表面着色器,但要注意移动平台性能表现
  3. 如果光照数目非常少,有很多自定义渲染效果, 那么使用顶点/片元着色器
文章目录
  1. 1. 属性类型
  2. 2. 标签
  3. 3. 渲染状态设置
  4. 4. Pass标签
  5. 5. 相关着色器的语义
  6. 6. 选择哪种shader形式
,