- 关系: 物体 <-- 材质 <-- Shader
- Unity对象创建
- 创建Material 菜单 Assets/Create
Project面板 右键/Create - 创建Shader
同上 - 关联Shader到Material
材质面板 最上方 下拉菜单 选择Shader - 调解属性
材质面板中 颜色、纹理、浮点数、滑动条、向量等
- Unity Shader 类型
Standard Surface Shader 包含标准光照模型 表面着色器 基于物理的渲染方法
Unlit Shader 不包含光照 但包含雾效 基本的顶点/片元着色器
Image Effect Shader 实现屏幕后处理效果
Compute Shader GPU并行性 与常规渲染流水线无关的计算 - Unity Shader Insptector 显示相关信息
Default Maps 指定默认纹理
Render queue 渲染队列
Disable batching 是否关闭批处理
Properties 属性列表 - ShaderLab语言
- 专门为Unity Shader服务的说明性语言,是高层级的渲染抽象层,开发者不再需要和很多文件与设置打交道
- 使用花括号嵌套的语义 来描述Unity Shader的结构
- 结构中包含渲染所需的数据
- Properties语句块 定义了Shader所需的属性
- 材质面板 显示Shader的属性
- Unity Shader 的基础结构
Shader "ShaderName" {
Properties {
//属性
}
SubShader {
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
Unity会把结构编译成真正的代码和shader文件,开发者只需些Unity Shader
6.Unity Shader的详细结构
- 指定Unity Shader的名字
Shader "Custom/MyShader" { }
材质面板下拉列表 Shader位置 Shader->Custom->MyShader - Properties 语义块
材质和Unity Shader的桥梁 —— 目的: 定义的属性将会出现在材质面板中
Properties{
_Name ("display name", PropertyType) = DefaultValue //注意后面没有分号结尾
// ...以此类推
}
属性在Properties语义块中声明后,可以更方便地在材质面板中调整。
- 材质面板上显示属性名 display name
- 在Shader中访问属性: _Name
- 属性的数据类型 PropertyType
主要语句形式 : _Name (“display name”, PropertyType) = DefaultValue
单值定义
_Int ("Int", Int) = 2
范围值定义——Range类型会以 Slider形式在材质面板显示
_Range("Range", Range(0.0, 5.0)) = 3.0
Color、Vector型——默认值形式 四维向量
_Color("Color", Color) = (1,1,1,1)
_Vector("Vector", Vector) = (2,3,1,4)
特殊体定义——默认值形式 字符串跟着花括号
_2D("2D",2D) = "" {} //字符串为空
_Cube("Cube", cube) = "white" {} //字符串为纹理名称
- SubShader 语义块
每个Unity Shader有>=1个SubShader
SubShader定义块
SubShader{
// (可选的)标签设置
[Tags]
// (可选的) 状态设置
[RenderSetup]
Pass {
}
//Other Passes
}
- Tags
- 键值对 (Key / Value)—— Key:字符串类型,Value Pair:字符串类型
- 与渲染引擎沟通,如何渲染对象
- Tags 结构:
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
- Tags 种类:
- )透明渲染:
Tags { "Queue" = "Transparent" }
指定物体属于哪一个渲染队列,保证透明物体在不透明物体之后被渲染,还可以自定义渲染队列 - )着色器分类:
Tags { "RenderType" = "Opaque" }
如透明着色器,不透明着色器;用于Shader Replacement 功能 - )批处理
Tags { "DisableBatching" = "True" }
如顶点动画 - )投射阴影
Tags { "ForceNoShadowCasting" = “true” ” }
可设置不受Projector影响,如半透明物体 - )精灵对象
Tags { "CanUseSpriteAtlas" = "False" }
- )材质面板预览(默认为球形)
Tags { "PreviewType" = "Plane" }
orskybox
- )透明渲染:
- RenderSetUp
- 渲染状态的设置指令,可以设置显卡的状态
- 常见渲染设置
- )Cull 剔除模式
Cull Back | Front | Off
- )ZTest 深度测试
- )ZWrite 深度写入
- )Blend 混合模式
- )Cull 剔除模式
- Pass
-
每个Pass定义了一个完整的渲染流程
-
Pass 加多,渲染性能下降,使用尽可能少数目的Pass
-
在Subshader中进行的标签设置,将会用于所有的Pass
-
Pass 语义块
Pass { [Name] [Tags] [RenderSetup //...}
- 定义Pass 的名称
Name "MyPassName"
- 可对Pass设置渲染状态
- 可对Pass设置标签 类型有
- ) LightMode 定义该 Pass在 Unity流水线中的角色
Tags { "LightMode" = ""ForwardBase }
- ) RequireOptions 当满足于某些条件时才渲染该 Pass
Tags { "RequireOptions" = "SoftVgetation" }
- 调用其它Unity Shader中的Pass
使用Pass名字时要大写,因为Unity内部会把Pass名称转换成大写字母的表示, 告诉渲染引擎如何渲染物体UsePass " MyShader/MYPASSNAME "
-
- Fallback
当上面所有SubShader在这块显卡上都不能运行时,使用这个低级Shader
Fallback "name"
Fallback Off
Fallback "VertexLit"
中英名词
syntax 语义