一步步学习 Unity Shader
Shaderlab
定义一个属性
语法:
1 | [var name]([Message], [Type]) = [Default value] |
举例:
1 | _FloatVal("Float Value", float) = 0.0 // 浮点数 |
子着色器(SubShader)
可以创建多个子着色器,但 Unity 只会获取第一个可以运行在用户图形硬件上的着色器,所以可以编写多个版本的子着色器来兼容不同的硬件。每个子着色器可以有多个通道(Pass)。
- Pass 可以有如下命令:
Cull off关闭背面剪裁Blend SrcAlpha OneMinusSrcAlpha开启混合ZWrite off关闭深度写入
- CG
着色器代码包裹在CGPROGRAM和ENDCG两个关键词之间 - FallBack
如果编写的代码不能运行在当前的图形硬件上,系统就会自动将着色器切换到 FallBack 指定的着色器。例如:1
FallBack "Diffuse"
Vertex and fragment shader (顶点和片段着色器)
渲染管线(Rendering pipeline):Vertex shader (顶点着色器) —> Rasterizer (光栅化) —> Fragment shader (片段着色器) —> Framebuffer (帧缓冲)
Annexes (附加)
Variables in CG (CG 中的变量)
Sampler2D表示 2D 纹理Bool表示布尔值Float、Half、Fixed均表示浮点数float2、float3、float4分别表示二维、三维、四维向量。向量的分量可以用下面三种形式表示:- 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