#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.0 - 1.0; 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); }