type
status
date
slug
summary
tags
category
icon
password
Shader 的基本概念
Shader(着色器)是一种用于渲染图形的技术,它允许开发者自定义 GPU 渲染画面的算法
Shader 的分类:
- 顶点 Shader(Vertex Shader):处理 3D 模型顶点数据,负责顶点变换和为像素渲染做准备。
- 片段 Shader(Fragment Shader/Pixel Shader):处理光栅化后的片段(像素)数据,负责计算光照、颜色等
Shader 编程语言:
- GLSL(OpenGL Shading Language):基于 OpenGL。
- HLSL(High Level Shading Language):基于 DirectX。
- Cg(C for Graphic):由 NVIDIA 开发,与 HLSL 语法相似。
- Unity 推荐使用 Cg/HLSL 在 ShaderLab 框架上编写。
Unity Shader:
- Unity Shader 是 Unity 封装的便于书写的 Shader,也称为 ShaderLab。
- Unity 提供了三种 Shader 编写方式:
- Surface Shaders(表面着色器):Unity 对顶点/片段着色器的封装,简化光照模型和跨平台处理。
- Vertex/Fragment Shaders(顶点/片段着色器):更底层、更灵活的 Shader 编写方式。
- Fixed Function Shaders(固定管线着色器):已被淘汰。
- Shader Graph 可视化 Shader 工具,它生成的是顶点/片段着色器代码。
Shader 与材质(Material)
一个 Shader 可以与无数个材质关联。 一个材质同一时刻只能关联于一个 Shader。(为什么说是同一时刻,因为我们可以通过代码去动态改变材质所关联的 Shader )
材质可以赋与模型,但是 Shader 不行。 材质就像是 Shader 的实例,每个材质都可以参数不一样呈现不同的效果,但是当 Shader 改变时,关联它的所有材质都会相应的改变。
Shader 是渲染算法,Material 是渲染配置。
Shader 定义了渲染的“方式”,Material 定义了渲染的“内容”。
ShaderLab 结构
基本结构
- Properties → 定义 Unity Inspector 材质面板参数, 这些属性会被传递给着色器代码(HLSL)使用
- SubShader → 针对 不同硬件或渲染管线 提供多个备选实现(例如高性能设备用复杂效果,低端设备用简化版)。可以定义多个
SubShader,Unity 会按顺序尝试使用第一个支持的 SubShader
- Pass → 实际渲染逻辑(必须包含 HLSL 代码)
- 每个
Pass代表一次完整的渲染流程(例如绘制一次物体) - 复杂的特效可能需要多个 Pass(如第一个 Pass 处理光照,第二个 Pass 添加边缘光)
ZWrite On适用于不透明物体,确保正确深度遮挡,ZWrite Off适用于透明物体、UI、粒子,避免深度冲突; 与ZTest配合 控制渲染顺序和可见性; 性能影响 合理使用可减少深度计算,但透明物体过多可能导致 OverdrawZWrite off关闭后,物体按从后往前的顺序渲染
- Fallback → 保底方案,当所有
SubShader都不支持当前硬件时,使用的备用着色器(通常是功能简单的内置 Shader)
shader的一些简单案例
颜色混合
在片元着色器中,这通常使用内置函数来实现,例如线性插值(Lerp)
UV动画
在顶点着色器或片元着色器中,对纹理的UV坐标进行偏移或变换,从而改变纹理的采样位置,产生动画效果
顶点着色器中实现:
片元着色器中实现:
溶解效果
使用一张灰度纹理(溶解贴图),根据该纹理的亮度值和一个阈值进行比较。当纹理的亮度值小于阈值时,该片元被丢弃(透明),从而实现溶解的效果

- Author:YGN
- URL:http://preview.tangly1024.com/article/1c6b23d7-4fbf-804a-8ac2-e413833ad06c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts






