How do you get the world position of a vertex in a shader?

I am trying to get the world position of a vertex into my fragment shader but the _Object2World translation doesn’t appear to be working. Is there something I need to do in scripting such that the _Object2World matrix is updated?

Below is my simplified shader. We are using the 3.4.2f3 version of unity.
My scene for this test contains:

plane pos: 0,0,100 rotation: 270,0,0 scale: 5,5,5

cube pos: 0,0,20 rotation: 0,0,0 scale: 1,1,1

camera pos: 0,0,0 rotation: 0,0,0 scale: 1,1,1

The result of this shader when applied to the scene is always red. I would expect to see green because the wpos.z should be in world coordinates and the vpos.z would still be in object coordinates.
Note that I did see a similar question(“How to get the global position of a vertex in a Cg vertex shader?”) and have tried to make my vertex shader do exactly the same thing as the response to that question.


Shader “DepthEffect”
_MainTex (“Base (RGB)”, 2D) = “white” {}
ZTest Always Cull Off ZWrite Off
Fog { Mode off }

		#pragma vertex vert
		#pragma fragment frag
		#pragma fragmentoption ARB_precision_hint_fastest 
		#include "UnityCG.cginc"

		sampler2D _MainTex;
		struct v2f 
			float4 pos  : POSITION;
			float2 uv   : TEXCOORD0;
			float3 wpos : TEXCOORD1;
			float3 vpos : TEXCOORD2;
		v2f vert( appdata_img v )
		    v2f o;
		    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
		    float3 worldPos = mul (_Object2World, v.vertex).xyz;
		    o.wpos = worldPos;
		    o.vpos =;
		    o.uv =  v.texcoord.xy;
		    return o;
		float4 frag (v2f i) : COLOR
		    if (i.vpos.z == i.wpos.z)
		        return float4(1,0,0,1);
		        return float4(0,1,0,1);
FallBack "Diffuse"


_Object2World worked fine for me. Looking at your code, I’m guessing the computed vpos.z and wpos.z are never exactly equal. You should instead check that they are close (subtract, square the difference, compare to a small number).