Files
nexus/wiki/concepts/Shader.md
2026-05-03 05:42:12 +08:00

78 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 上运行的专用程序,控制像素如何被渲染——决定颜色、光照、阴影、透明度等视觉特性。游戏开发中最常用的语言为 HLSLDirectX/PC、GLSLOpenGL/Linux和 ShaderLabUnity
## Core Concepts
### Vertex Shader
逐顶点执行,负责几何变换(模型空间 → 世界空间 → 视图空间 → 屏幕空间和传递顶点属性UV、法线
### Fragment/Pixel Shader
逐像素执行,决定最终像素颜色。性能敏感操作应优先考虑移至 Vertex Shader。
### Surface ShaderUnity 概念)
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