一步步学习 Unity Shader

Shaderlab

定义一个属性

语法:

1
[var name]([Message], [Type]) = [Default value]

举例:

1
2
3
4
_FloatVal("Float Value", float) = 0.0 // 浮点数
_MainTex("Texture", 2D) = "white"{} // 纹理图片
_RangeVal("Range value", Range(0.0, 10.0)) = 1.0 // 范围
_Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) // 颜色

子着色器(SubShader)

可以创建多个子着色器,但 Unity 只会获取第一个可以运行在用户图形硬件上的着色器,所以可以编写多个版本的子着色器来兼容不同的硬件。每个子着色器可以有多个通道(Pass)。

  1. Pass 可以有如下命令:
    • Cull off 关闭背面剪裁
    • Blend SrcAlpha OneMinusSrcAlpha 开启混合
    • ZWrite off 关闭深度写入
  2. CG
    着色器代码包裹在 CGPROGRAMENDCG 两个关键词之间
  3. FallBack
    如果编写的代码不能运行在当前的图形硬件上,系统就会自动将着色器切换到 FallBack 指定的着色器。例如:
    1
    FallBack "Diffuse"

Vertex and fragment shader (顶点和片段着色器)

渲染管线(Rendering pipeline):Vertex shader (顶点着色器) —> Rasterizer (光栅化) —> Fragment shader (片段着色器) —> Framebuffer (帧缓冲)

Annexes (附加)

Variables in CG (CG 中的变量)

  1. Sampler2D 表示 2D 纹理
  2. Bool 表示布尔值
  3. FloatHalfFixed 均表示浮点数
  4. float2float3float4 分别表示二维、三维、四维向量。向量的分量可以用下面三种形式表示:
    • x, y, z, w
    • r, g, b, a
    • s, t, p, q

Structures (结构体)

一个结构体可以包含多个变量

Functions (方法)

方法封装了一个任务

Shader Semantics (Shader 语义)

语义表示了一个参数的目的。例如:float4 vertex : POSITION; 语句中的 POSITION 表示 vertex 变量用于一个位置。常见语义关键词有:

  • POSITION 位置
  • COLOR 颜色
  • NORMAL 法向量
  • TANGENTE 切向量
  • TEXCOORD 纹理坐标

参考链接

  • http://www.shaderslab.com/shaders.html