以下是主流的几种着色器语言:
1. HLSL (High-Level Shading Language)
这是你在Unity中最主要、最应该学习的语言。
-
开发方:微软 (Microsoft)
-
主要应用平台 :Unity、DirectX (Windows, Xbox)
-
特点:
-
语法与C语言非常相似,易于学习。
-
Unity内置渲染管线和URP/HDRP的默认着色器编程语言。你在CGPROGRAM块中编写的代码其实就是HLSL。
-
拥有丰富的内置函数和宏(通过包含
UnityCG.cginc
,Lighting.cginc
等文件),极大地简化了开发。 -
与DirectX生态深度绑定,性能优化良好。
-
-
在你提供的代码中的体现 :
CGPROGRAM
和ENDCG
之间的所有代码,包括#include "Lighting.cginc"
、struct
定义、vert
和frag
函数,都是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)时再学 |
学习路径建议:
-
从 HLSL + ShaderLab 开始 :就像你提供的这段代码一样。这是理解着色器原理的基础。先学会写标准的
Surface Shader
和Unlit Shader
,理解顶点和片元着色器的流程。 -
同时熟悉 Shader Graph :尝试用Shader Graph重现你用代码实现的效果。这能帮你直观地理解每个节点(如
Dot Product
,Lerp
,Fresnel Effect
) 对应的数学运算和逻辑。 -
明白它们的关系 :ShaderLab 是外壳,HLSL 是内核。你编写Shader的过程就是:用ShaderLab定义属性和结构,然后在CGPROGRAM块中写入HLSL代码来实现核心功能。