78 lines
3.5 KiB
Markdown
78 lines
3.5 KiB
Markdown
---
|
||
title: "Shader"
|
||
type: concept
|
||
tags: [game-dev, rendering, graphics]
|
||
sources: [technical-artist, unity-shader-graph-artist]
|
||
last_updated: 2026-05-01
|
||
---
|
||
|
||
# Shader
|
||
|
||
## Definition
|
||
Shader(着色器)是在 GPU 上运行的专用程序,控制像素如何被渲染——决定颜色、光照、阴影、透明度等视觉特性。游戏开发中最常用的语言为 HLSL(DirectX/PC)、GLSL(OpenGL/Linux)和 ShaderLab(Unity)。
|
||
|
||
## Core Concepts
|
||
|
||
### Vertex Shader
|
||
逐顶点执行,负责几何变换(模型空间 → 世界空间 → 视图空间 → 屏幕空间)和传递顶点属性(UV、法线)。
|
||
|
||
### Fragment/Pixel Shader
|
||
逐像素执行,决定最终像素颜色。性能敏感操作应优先考虑移至 Vertex Shader。
|
||
|
||
### Surface Shader(Unity 概念)
|
||
Unity URP/HDRP 的高级抽象,自动处理光照模型,开发者只需定义表面属性。
|
||
|
||
### Compute Shader
|
||
通用 GPU 计算,可用于后处理、特效、布料模拟等非传统渲染任务。
|
||
|
||
## Technical Artist 的 Shader 标准
|
||
|
||
- **移动端安全变体**:所有自定义着色器必须包含移动端安全版本或明确标注平台限制
|
||
- **Shader 复杂度分析**:使用引擎的 Shader 复杂度可视化工具验证,绿色/黄色合格,红色必须修订
|
||
- **参数文档化**:暴露给艺术家的所有着色器参数必须在材质检查器中有 Tooltip 注释
|
||
- **避免逐像素操作**:可在顶点阶段完成的操作不应放在像素阶段(移动端尤其重要)
|
||
|
||
## Shader 类型与预算
|
||
|
||
| 类型 | PC 复杂度 | Mobile 复杂度 | 典型应用 |
|
||
|------|-----------|---------------|---------|
|
||
| Unlit | 极低 | 极低 | UI、纯色物体 |
|
||
| Lit (PBR) | 中等 | 中等-高 | 角色、环境 |
|
||
| 透明/加法 | 中等 | 高 | VFX、玻璃 |
|
||
| 自定义光照 | 高 | 极高 | 特殊效果 |
|
||
|
||
## Unity Shader Graph 规范(来自 [[unity-shader-graph-artist]])
|
||
|
||
### Sub-Graph 强制复用
|
||
所有重复逻辑必须封装为 Sub-Graph,重复节点簇是维护和一致性失败。Sub-Graph 封装典型场景:DissolveCore(消融逻辑)、Fresnel(边缘高光)、TriplanarMapping(三角平面映射)。
|
||
|
||
### URP / HDRP API 严格区分
|
||
- **URP 自定义通道**:`ScriptableRendererFeature` + `ScriptableRenderPass`,不能用 `OnRenderImage`
|
||
- **HDRP 自定义通道**:`CustomPassVolume` + `CustomPass`,API 与 URP 不兼容
|
||
- Shader Graph 必须设置正确的 Render Pipeline asset,否则 URP 图形无法在 HDRP 中工作
|
||
|
||
### 移动端性能硬约束
|
||
| 指标 | 上限 |
|
||
|------|------|
|
||
| 每 Fragment Pass 纹理采样 | ≤ 32 次 |
|
||
| 不透明 Fragment ALU | ≤ 60 条 |
|
||
| Alpha Clipping | 优先于 Alpha Blend(避免过度绘制深度排序) |
|
||
| `ddx`/`ddy` 导数 | 移动端禁止(tile-based GPU 上行为未定义) |
|
||
|
||
### HLSL 规范
|
||
- 使用 `.hlsl` 扩展名声明 include 文件,`.shader` 扩展名声明 ShaderLab wrapper
|
||
- 必须使用 `TEXTURE2D`/`SAMPLER` 宏(`Core.hlsl`),`sampler2D` 不是 SRP 兼容的
|
||
- `CBUFFER_START(UnityPerMaterial)` 属性块必须与 `Properties` 块完全匹配,否则产生静默黑材质
|
||
|
||
## Related Concepts
|
||
- [[VFX]]:Shader 常用于 VFX 特效实现
|
||
- [[LOD-Pipeline]]:LOD 切换时着色器需保持视觉一致性
|
||
- [[RenderingPipeline]]:Shader 是渲染管线的可编程核心
|
||
|
||
## Connections
|
||
- [[TechnicalArtist]] ← writes ← Shader
|
||
- [[UnityShaderGraphArtist]] ← Unity 专精 ← Shader
|
||
- [[VFX]] ← implements via ← Shader
|
||
- [[URP]] ← 渲染管线 ← Shader
|
||
- [[HDRP]] ← 渲染管线 ← Shader
|