公告板

公告板Shader

Posted by Bob on April 11, 2019

公告板,英文名Billboarding,是一项让着色四边形根据视角方向来旋转的技术,这样看起来似乎物体总是面向观察者。

image

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
		}
	}
}


参考资料:

UnityShaderVariables

BuiltinFunctions