以3D空间里的Sprite为例
思路:
- 使物体旋转到合适的位置
- 需要知道模型空间下的点(x,y,z)和旋转后的坐标系的方向向量在原来的模型空间下的值(i,j,k)
- 新的点在模型空间下为xi + yj + zk
注:
上面的i,j,k为矢量,x,y,z为标量
都是在物体原来的模型空间下完成的
- Sprite面对摄像机的点
详情看最下面的完整代码以及注释
- Sprite平行于屏幕平面,近大远小(类似于血条,饥荒中的物体的面片实现)
定点着色器核心代码
//化简版
float3 forwardDir = UNITY_MATRIX_MV[2].xyz;
float3 upDir = UNITY_MATRIX_MV[1].xyz;
float3 rightDir = UNITY_MATRIX_MV[0].xyz;
//完整版
//float3 forwardDir = mul(UNITY_MATRIX_T_MV, float4(0, 0, 1, 1)).xyz;
//float3 upDir = mul(UNITY_MATRIX_T_MV, float4(0, 1, 0, 1)).xyz;
//float3 rightDir = mul(UNITY_MATRIX_T_MV, float4(1, 0, 0, 1)).xyz;
UNITY_MATRIX_MV代表从模型空间向观察空间的转换矩阵,
UNITY_MATRIX_T_MV代表从观察空间向模型空间的转换矩阵,是UNITY_MATRIX_MV的转置矩阵,完整版就代表观察空间下的方向向量到模型空间的转换
下面是坐标系转换相关内容,来自于《Unity Shader入门精要》
第一部分代码来自于《Unity Shader 入门精要》第十一章
Shader "Test/Billboard" {
Properties {
_MainTex ("Main Tex", 2D) = "white" {
}
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_Vert