uniform mat4 matView; uniform mat3 matViewProjection; uniform float fHeightScale; uniform float fPerspectiveBias; uniform vec4 vLightOffset; varying vec2 TexCoord; varying vec3 Normal; varying vec3 Binormal; varying vec3 Tangent; varying vec3 EyeVector; varying vec3 LightVector; varying vec2 vParallaxXY; attribute vec3 rm_Binormal; attribute vec3 rm_Tangent; void main(void) { // Transform the position gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // Set the texture coordinate TexCoord = gl_MultiTexCoord0.xy; // Compute the view vector in view space vec3 vView = -(matView * gl_Vertex); // Compute tangent space basis vector in view space vec3 vTangent = mat3(matView) * rm_Tangent; vec3 vBinormal = mat3(matView) * rm_Binormal; vec3 vNormal = mat3(matView) * Normal; // Normalize the view vector in tangent space vec3 vViewTS = mat3(vTangent, vBinormal, vNormal) * normalize(vView); // Compute initial parallax displacement direction vec2 vParallaxDirection = normalize(vViewTS.xy); // Compute the length of the parallax displacement vector float fParallaxLength = -sqrt(1.0 - vViewTS.z * vViewTS.z) / vViewTS.z; // Compute the parallax bias parameter float fParallaxBias = fPerspectiveBias + (1.0 - fPerspectiveBias) * (2.0 * vViewTS.z - 1.0); // Compute the actual reverse parallax displacement vector vParallaxXY = -vParallaxDirection * fParallaxLength * fParallaxBias * fHeightScale; // Compute light vector (view space): vec3 vLight = vView + vLightOffset; // Propagate the view and the light vectors (in tangent space): EyeVector = mat3(vTangent, vBinormal, vNormal) * vView; LightVector = mat3(vTangent, vBinormal, vNormal) * vLight; }Now the first thing I wondered about was if we can't replace all occurrences of matView with gl_ModelViewMatrix. Obviously matView should transform vertices from world to view space but for example vec3 vView = -(matView * gl_Vertex); Here gl_Vertex is in object space so the modelview matrix maps from object to view space, right? The 2nd thing: // Compute the length of the parallax displacement vector float fParallaxLength = -sqrt(1.0 - vViewTS.z * vViewTS.z) / vViewTS.z; Why do we negate the length and divide it by vViewTS.z? And the 3rd: What is the fPerspective bias input? Would be really nice if someone can help me out with this :)