unity shader(初识ShaderLab)
cpu —————— gpu
利用缓冲区(ram)cpu会存储一些网格,也就是把一次需要渲染的东西拆分出来,然后发送给gpu使用(draw call),gpu就会完成一次渲染。
使用批处理可以减少cpu的draw call数量,避免cpu过载而gpu陷入等待
unity中的shader
unity中一共提供了4种shader模版供我们选择:
standard surface shader:包含标准光照模型的表面着色器模版
unlit shader:不包含光照(但包含雾效)的基本的顶点/片元着色器
image effect shader:实现各种屏幕后处理效果
compute shader:提供了典型的表面着色器的实现方法
(现在似乎多了一个光线追踪着色器)
单独的shader无法发挥作用,需要和材质结合起来使用
unityshader的基础:shaderlab 一个高层级的抽象 方便对于shader的控制
unityshader的结构
-
命名
这个shader的名字会由一串字符串来定义,可以使用“/”来控制shader在材质选择中出现的位置,例如“Custom/MyShader” -
材质和unity shader的桥梁:Properties
Properties的语义块包含了一系列属性
Properties{
Name (“display name”, PropertyType) = DefaultValue
}
所支持的属性类型(name所对应的模块)在 p30 中
这些属性定义后会在材质的面板中出现并且可以直接设置拖动 或者给予相应默认值 -
SubShader
每一个shader都至少要有一个
在加载时unity会扫描所有语句块然后选择最合适的,不然会选择Fallback所指定的untiyshader
在这个语句块中,定义了一系列Pass以及可选择的状态[RenderSetup]和标签[Tags]
状态在 p31 中可以查找并根据情况设置添加
标签块在 p32 页中可以查找,并根据情况设置添加
而Pass需要使用的标签在 p33 页中可以查找并根据情况设置添加
为了提高复用性,可以使用其他shader中的Pass 利用语句“UsePass“MyShader/必须使用大写形式””
除了普通Pass外还支持一些特殊的Pass
UsePass
GrabPass
- Fallback
相当于后路
如果所有SubShader都无法使用,那么就会使用此Shader
unity shader的形式
-
表面着色器(可编程管线):实质是对顶点片元着色器的抽象 p34
使用过程经过极大简化
与光源等高消耗的效果挂钩 使用时需特别注意移动端的表现
使用 Cg/HLSL 语言进行编写 -
顶点/片元着色器(可编程管线):类似于c++更加复杂,但是灵活性更高
使用 Cg/HLSL 语言进行编写 -
固定函数着色器:对于陈旧设备适用的简单着色器
完全使用 ShaderLab 的语法进行编写
unity shader并不等于一个传统意义上的shader
Cg/HLSL语言是区别于ShaderLab的 另一个世界,一般包含在
CGPROGRAM与ENDCG之间
unity会将Cg转化为对应平台的代码,这样就不会在切换平台时重新编译
可以对其进行展开 看到编译后到代码 也可以自定义选择需要适配的平台