Learn Unity Shader 2

Marterial, Shader, Texture

Material是渲染结果,Shader是渲染过程,方式,Texture是渲染中的一个参数

Unity Shader Code Struct

Properties

输入的一些参数

SubShader

Unity会调用第一个显卡可用的Shader,且只调用一个,所以高级的SubShader写在前面

1
SubShader{[Tags][LOD][RenderSetup]Passdef[Passdef...]}
  • Tags: 一般写成以下形式
    1
    Tags{ "Queue" = "Geometry - 20" "RenderType" = "Opaque" }

  下面介绍一下Tags中的Queue和Render Type
  Queue: 表示渲染顺序,值越高渲染越后面,叠的越前面

  Render Type: 一般用于以下两个函数

1
2
Camera.RenderWithShader(Shader shader, string replacementTag);
Camera.SetReplacementShader(Shader shader, string replacementTag);

  • LOD: Level of Detail
      可以设置支持的最大LOD(shader.maximumLOD),那么有比这个值大的LOD的shader就不会被执行

  • RenderSetup: 一些设定值

  • Pass: 一个pass是一个完整的Graphics Pipeline

      UsePass{}: 在其中定义一个name,可让其他shader去抓,达到重复利用的效果
      GrabPass{}: 抓取画面中的渲染结果,存到一张贴图,再对它进行一些细节操作,比如玻璃效果、模糊效果

    1
    Pass{[Name and Tags][RenderSetup]}

  如果在前面的RenderSetup里面写的话,下面的每个Pass都会被套用,在Pass里写就是自己用

FallBack

所有SubShader都不能用时,当备用

Unity Shader Category

Fixed Function Shader
  • 不可程式码编辑要用选项式(设定式)
  • 完全使用ShaderLab命令
  • 支持旧设备
  • 用于简单效果
Surface Shader
  • 可程式码编辑(CGPROGRAM…ENDCG,CG语法)
  • 编辑多个Pass
  • 编译Vertex Shader,Fragment Shader
  • 硬件帮我们封装了很多光影处理细节和光照模式
Vertex and Fragment Shader
  • 可程式码编辑(CGPROGRAM…ENDCG,CG语法)
  • 最灵活弹性,语法最复杂
  • 特别的效果(顶点位置改变,部分颜色混合)

A Shader Example

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Shader "Custom/Sample"
{
Properties
{
_Texture("Texture", 2D) = "White" {}
_Color("Color", Color) = (1,1,1,1)
}

SubShader
{
Tags{ "Queue" = "Geometry" "RenderType" = "Opaque" }
LOD 100

Pass
{
CGPGOGRAM //CG语言开始

#pragma vertex vert //定义一个VS
#pragma fragment frag //定义一个FS

sampler2D _Texture; //把输入的东西拿进来
fixed4 _Color;

//输入参数的结构
struct appdata{
fixed4 vertex : POSITION;
//大写的POSITION是个semantics(语义)告诉Unity这个变量的含义是要一个顶点位置
fixed2 uv : TEXCOORD0;
//0是第一个uv位置
}

//VS到FS参数传递的结构
struct v2f{
fixed4 vertex : SV_POSITION;
//SV_前缀的变量代表system value,代表最后是到屏幕的坐标值
fixed2 uv : TEXCOORD0;
}

//vertex shader输入是POSITION,输出是SV_POSITION

//开始写方法
v2f vert(appdata i)
{
v2f o;
o.uv = i.uv;
//坐标转化MVP(Model-View-Projection)
o.vertex = mul(UNITY_MATRIX_MVP, i.vertex);
return o;
}

//FS输出颜色值,所以输出类型是fixed4,SV_Target也是emantics,即渲染目标
fixed4 frag(v2f v) : SV_Target
{
//将贴图根据uv位置贴上,再跟原来的颜色值做混合
return tex2D(_Texture, v.uv) * _Color;
}

ENDCG //CG语言结束
}
}
}