ShaderLab 是 Unity 引擎中用于编写着色器(Shader)的配置语言和结构化框架。它不是一种真正的编程语言(如 HLSL 或 Cg),而是一个描述性语言,用来组织和定义着色器的结构、属性、子着色器、渲染状态等。在 Unity 中,使用 ShaderLab 来描述整个着色器的行为,并嵌入实际的 GPU 着色器代码(如 HLSL、CG 等)来实现具体的视觉效果。

示例

SHADERLAB
Shader "ChaimLearn/Framework"
{
    Properties {
        // 定义材质的可调节属性
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader {
	    Tags { "Queue" = "Geometry" }
        Pass {
	        Tags { "LightMode" = "ForwardBase" }
            // 设置渲染状态
            Cull Off
            ZWrite On
            Blend SrcAlpha OneMinusSrcAlpha
            
            HLSLPROGRAM // 着色器代码开始
            
            #pragma vertex vert // 指定顶点着色器函数名
            #pragma fragment frag // 指定片段着色器函数名

			sampler2D _MainTex; // 属性变量
			float4 _Color;
            
            float4 vert (float4 pos : POSITION) : SV_POSITION {
                return UnityObjectToClipPos(pos);
            }
            
            fixed4 frag () : SV_Target {
                return _Color;
            }
            
            ENDHLSL // 着色器代码结束
        }
    }
    Fallback "Diffuse" // 退路
    // CustomEditor "MyFancyShaderGUI" // 设置自定义编辑器
}
点击展开查看更多

结构

1. Shader “xx/xx”

用于在Unity中标识Shader


2. Properties

定义材质的可调节属性

SHADERLAB
[Attribute][...] _Name ("显示名称", Type) = 默认值
点击展开查看更多

-> [属性 Properties](/posts/属性 Properties)


3. SubShader

每个 Shader 可以有多个 SubShader,Unity 会根据当前平台从上往下寻找选择最合适的 SubShader 运行。

3.1 Tags

Tags 是 SubShader 上的元数据标签,用于告诉 Unity 如何处理这个着色器。

3.2 Pass

Pass 表示一个完整的渲染通道

3.2.1 Tags

Tags 是 SubShader 或 Pass 上的元数据标签,用于告诉 Unity 如何处理这个着色器或渲染通道。

3.2.1 渲染状态

设置渲染状态,如: [混合模式 Blend Mode](/posts/混合模式 Blend Mode)、[面剔除 和 双面渲染](/posts/面剔除 和 双面渲染)

SHADERLAB
Cull Off // 剔除模式
ZWrite On // 写入深度缓冲区
Blend SrcAlpha OneMinusSrcAlpha // 颜色混合模式
...
点击展开查看更多
3.2.2 HLSLPROGRAM 和 ENDHLSL

编译指令 和 着色器代码(HLSL/Cg) 需要被包裹在HLSLPROGRAMENDHLSL之间。

3.2.3 编译指令
用于指定着色器函数 描述
#pragma vertex name 指定顶点着色器函数名
#pragma fragment name 指定片段(像素)着色器函数名
#pragma geometry name 指定几何着色器函数(需硬件支持)
#pragma hull name / #pragma domain name 控制细分着色器(Tessellation)
#pragma surface surf surfFunction 使用 Surface Shader 编写方式(自动处理光照)
其他与C/C++相似:
3.2.4 着色器代码(HLSL/Cg)

着色器代码(HLSL/Cg)


4. Fallback

如果所有 SubShader 都不被当前硬件支持,Unity 将使用 Fallback 指定的内置着色器作为替代方案。


5. CustomEditor

CustomEditor 用于指定一个自定义的 材质编辑器脚本(C#),实现更友好或更复杂的 UI 控件来编辑当前材质。

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/shaderlab/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键