#define diagonal3(m)vec3((m)[0].x,(m)[1].y,m[2].z)
#define projMAD(m,v)(diagonal3(m)*(v)+(m)[3].xyz)

vec3 ToNDC(vec3 pos){
	vec4 iProjDiag=vec4(gbufferProjectionInverse[0].x,
		gbufferProjectionInverse[1].y,
	gbufferProjectionInverse[2].zw);
	vec3 p3=pos*2.-1.;
	vec4 viewPos=iProjDiag*p3.xyzz+gbufferProjectionInverse[3];
	return viewPos.xyz/viewPos.w;
}

vec3 ToWorld(vec3 pos){
	return mat3(gbufferModelViewInverse)*pos+gbufferModelViewInverse[3].xyz;
}

vec3 ToShadow(vec3 pos){
	vec3 shadowpos=mat3(shadowModelView)*pos+shadowModelView[3].xyz;
	return projMAD(shadowProjection,shadowpos);
}