着色器语言

以下是主流的几种着色器语言:


1. HLSL (High-Level Shading Language)

这是你在Unity中最主要、最应该学习的语言。

  • 开发方:微软 (Microsoft)

  • 主要应用平台Unity、DirectX (Windows, Xbox)

  • 特点

    • 语法与C语言非常相似,易于学习。

    • Unity内置渲染管线和URP/HDRP的默认着色器编程语言。你在CGPROGRAM块中编写的代码其实就是HLSL。

    • 拥有丰富的内置函数和宏(通过包含 UnityCG.cginc, Lighting.cginc 等文件),极大地简化了开发。

    • 与DirectX生态深度绑定,性能优化良好。

  • 在你提供的代码中的体现
    CGPROGRAMENDCG 之间的所有代码,包括 #include "Lighting.cginc"struct 定义、vertfrag 函数,都是HLSL。

2. GLSL (OpenGL Shading Language)

OpenGL/WebGL生态的标准语言。

  • 开发方:Khronos Group

  • 主要应用平台 :OpenGL (macOS, Linux, 移动端)、Vulkan、WebGL、Unity GLSL ES(用于移动端和WebGL)

  • 特点

    • 同样是类C语法,但与HLSL在内置变量名和函数名上有较大差异。

    • 是WebGL的唯一选择。

    • 在Unity中,你可以通过 GLSLPROGRAM 代替 CGPROGRAM 来编写GLSL代码,但这通常只用于针对特定平台(如WebGL)的优化,不常见。

  • 与HLSL的简单对比

    功能 HLSL (Unity) GLSL
    顶点位置 v.vertex : POSITION in vec3 position;
    变换矩阵 UNITY_MATRIX_MVP gl_ModelViewProjectionMatrix (旧版)
    采样纹理 tex2D(_MainTex, uv) texture2D(_MainTex, uv)

3. Cg (C for Graphics)

曾经是Unity的默认语言,现在可以看作是HLSL的前身和超集。

  • 开发方:NVIDIA

  • 主要应用平台Unity (旧版本)、NVIDIA硬件

  • 现状

    • 在Unity早期,Cg是标准的着色器语言。它的语法与HLSL几乎完全相同

    • 如今,Unity已经官方从Cg迁移到了HLSL 。但你仍然会看到很多教程和老Shader代码使用 CGPROGRAM,这是因为Unity为了保持兼容性,依然保留了这个关键字,并将其编译为HLSL。所以,你现在在Unity里学的"Cg",其实就是HLSL

4. ShaderLab

Unity特有的声明式配置语言,它不是编程语言。

  • 角色 :它是Shader的"外壳 "或"包装器"。

  • 作用

    • 组织Shader的整体结构(Shader, Properties, SubShader, Pass)。

    • 声明在材质面板中显示的属性(_MainTex, _Color)。

    • 配置渲染状态(如深度测试 ZWrite、剔除模式 Cull、混合模式 Blend)。

    • 指定真正的代码块(用 CGPROGRAM/ENDCG 包裹HLSL代码)。

  • 在你代码中的体现

    Shader "Custom/..." 开始,到 Properties, SubShader, Pass 等所有非CGPROGRAM块的代码都是ShaderLab。

5. 可视化编程工具 (Shader Graph)

这不是传统意义上的语言,而是现代的游戏开发方式。

  • 代表工具 :Unity的 Shader Graph 、UE4/UE5的 Material Editor

  • 特点

    • 无需编写代码,通过连接节点来创建着色器。

    • 非常直观,易于学习和迭代,艺术家也能参与制作。

    • 是Unity URP/HDRP和UE引擎的现代标准做法

    • 底层最终会自动生成对应的HLSL或GLSL代码。


总结与给初学者的建议

语言/工具 在Unity中的角色 学习优先级
HLSL 核心编程语言,实现所有逻辑计算 必学 (最高)
ShaderLab 组织与配置框架,定义属性和渲染状态 必学 (最高)
Shader Graph 可视化创作工具,用于URP/HDRP 强烈推荐 (现代工作流)
Cg HLSL的前身,语法兼容,可视为HLSL 了解即可
GLSL 用于OpenGL/WebGL平台,与HLSL相似但有差异 有特定目标平台(如WebGL)时再学

学习路径建议:

  1. 从 HLSL + ShaderLab 开始 :就像你提供的这段代码一样。这是理解着色器原理的基础。先学会写标准的Surface ShaderUnlit Shader,理解顶点和片元着色器的流程。

  2. 同时熟悉 Shader Graph :尝试用Shader Graph重现你用代码实现的效果。这能帮你直观地理解每个节点(如Dot Product, Lerp, Fresnel Effect) 对应的数学运算和逻辑。

  3. 明白它们的关系ShaderLab 是外壳,HLSL 是内核。你编写Shader的过程就是:用ShaderLab定义属性和结构,然后在CGPROGRAM块中写入HLSL代码来实现核心功能。