In the past, we uses mul(UNITY_MATRIX_MVP, v.vertex)
to convert vertex position from local to world space. v.vertex is float4 which has w component.
UnityObjectToClipPos When writing shader scripts, always use UnityObjectToClipPos(v.vertex)instead of mul(UNITYMATRIXMVP,v.vertex). While you can continue to use UNITYMATRIXMVPas normal in instanced Shaders, UnityObjectToClipPosis the most efficient way to transform vertex positions from object space into clip space. To make vertex shader run faster, Unity replaced it with UnityObjectToClipPos (float3 pos), which ignores w component even you pass a float4 position instead of float3. For some advanced users who still need the w component in their custom shaders, here is a cheaper UnityObjectToClipPos function which respects the w component!
But in most cases w is = 1. To make vertex shader run faster, Unity replaced it with UnityObjectToClipPos(float3 pos)
, which ignores w component even you pass a float4 position instead of float3.
For some advanced users who still need the w component in their custom shaders, here is a cheaper UnityObjectToClipPos() function which respects the w component!😄
// More efficient than computing M*VP matrix product
inline float4 UnityObjectToClipPosRespectW(in float4 pos)
{
return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, pos));
}