UnityShaderLab学习笔记
更新日期:
Shader
Unity中的Shader
在Unity的ShaderLab中提供了GLSL,代码写在GLSLPROGRAM和ENDGLSL之间。
还提供了Cg/HLSL,代码写在CGPROGRAM和ENDCG之间。
Unity中的Shader可以有3种形态
a.固定管线
形如,
1 | Shader "file/to/name"{ |
所有的代码都在一个Pass块中,很少使用。
b.vertex & fragment Shader
也称作可编程Shader,熟悉其他的开源游戏引擎(如cocos2dx)可能听说过。
超级强大,shadertoy上有很多大神使用其完成了很多超级棒的效果!
形如,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Shader "file/to/name"{
Properties{
...
}
Tags{ ... }
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct vext_out{ ... };
vext_out vert(appdata_full v) { ... };
float4 frag(vext_out v){ ... };
ENDCG
}
FallBack "Diffuse"
}
#pragma 有很多设置选项,告诉Unity如何去编译Shader
对于不同的平台和设备有更好的适配方案。
c.Surface Shader
Unity推荐的使用的Shader。
Unity为其包装了很多复杂的东西,但其实最后也是生成了一个vertex & fragment Shader。
具体形式随便新建一个shader文件,默认的就是Surface Shader。
shader数据接口
在Shader中可以看作是一个常量,不过这个常量的赋值在外部完成。
首先在Properties块中定义,
_Color(“Custom Color”,Color)=(1,1,1,1)
然后在Shader代码块中声明才能使用,
float _Color;
关于赋值可以在Unity界面的面板中赋值,
也可以在脚本中赋值
mat.setColor(“_Color”,myColor);
mat是一个Material。
PS:矩阵的声明比较特殊,Propreties中不能定义。
直接声明,
uniformfloat4x4 _Matrix;
空间
模型空间
模型空间可以说是本地坐标系。
以模型的锚点为坐标系原点形成的三位欧几里德空间。
本地到世界坐标系
在脚本中:transform.worldToLocalMatrix的MultiplyPoint或者MultiplyVector方法都可以搞定。
在Shader中通过左乘_World2Object。
世界坐标空间
所有模型所处的整个世界的三维欧几里德空间。
世界到本地坐标系
在脚本中:transform.localToWorldMatrix的MultiplyPoint或者MultiplyVector方法都可以搞定。
在Shader中左乘_Object2World。
相机空间
camera的坐标空间。就是相机能看到到世界空间的那一部分。
脚本中:cameraToWorldMatrix.Shader中:UNITY_MATRIX_MV.
投影矩阵
脚本中:projectionMatrix.Shader中:UNITY_MATRIX_MVP.