文章目录
  1. 1. Shader
    1. 1.1. Unity中的Shader
    2. 1.2. shader数据接口
  2. 2. 空间
    1. 2.1. 模型空间
    2. 2.2. 世界坐标空间
    3. 2.3. 相机空间
    4. 2.4. 投影矩阵

Shader

Unity中的Shader

在Unity的ShaderLab中提供了GLSL,代码写在GLSLPROGRAM和ENDGLSL之间。
还提供了Cg/HLSL,代码写在CGPROGRAM和ENDCG之间。

Unity中的Shader可以有3种形态
a.固定管线
形如,

1
2
3
4
5
6
7
8
9
10
Shader "file/to/name"{
Properties{
...
}
SubShader{
Pass{
...
}
}
}

所有的代码都在一个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
21
Shader "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.

文章目录
  1. 1. Shader
    1. 1.1. Unity中的Shader
    2. 1.2. shader数据接口
  2. 2. 空间
    1. 2.1. 模型空间
    2. 2.2. 世界坐标空间
    3. 2.3. 相机空间
    4. 2.4. 投影矩阵