公告板,英文名Billboarding,是一项让着色四边形根据视角方向来旋转的技术,这样看起来似乎物体总是面向观察者。
unity shader 内置变量
name | Value |
---|---|
UNITY_MATRIX_MVP | 从object space转到 projection space(投影) |
UNITY_MATRIX_MV | 从object space转到view space |
UNITY_MATRIX_V | 从world space转到view space |
UNITY_MATRIX_P | 从view space转到projection space |
UNITY_MATRIX_VP | 从world space转到projection space |
UNITY_MATRIX_T_MV | UNITY_MATRIX_MV的转置矩阵 |
UNITY_MATRIX_IT_MV | UNITY_MATRIX_MV的逆转置矩阵,法线的矩阵转换需要用变换矩阵的逆转置矩阵. 用途参见法线变换 |
unity_ObjectToWorld | 从object space转到world space |
unity_WorldToObject | Object2World的逆矩阵,从world space 到object space |
view space计算
注:如果没有使用到v.vertex,顶点坐标使用其它方式计算出来会导致多个 billboard 无法被 Dynamic Batching
Shader "Unlit/BillBoradShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// "DisableBatching" = "True" 禁用批处理,因为批处理会合并所有相关的模型,而这些模型各自的模型空间就会丢失
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
//模型空间原点(0,0,0,1)=>观察空间
fixed4 viewPos = mul(UNITY_MATRIX_MV, fixed4(0, 0, 0, 1));
//模型位置,丢弃z
viewPos += float4(v.vertex.xy, 0.0, 0.0);
//保持透视大小
o.vertex = mul(UNITY_MATRIX_P, viewPos);
//#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
参考资料: