0031275: Visualization, TKOpenGl - handle normal-map texture with Path-Tracing
[occt.git] / src / Shaders / TangentSpaceNormal.glsl
CommitLineData
78607702 1//! Calculates transformation from tangent space and apply it to value from normal map to get normal in object space
2vec3 TangentSpaceNormal (in mat2 theDeltaUVMatrix,
3 in mat2x3 theDeltaVectorMatrix,
4 in vec3 theNormalMapValue,
5 in vec3 theNormal,
6 in bool theIsInverse)
7{
8 theNormalMapValue = normalize(theNormalMapValue * 2.0 - vec3(1.0));
9 // Inverse matrix
10 theDeltaUVMatrix = mat2 (theDeltaUVMatrix[1][1], -theDeltaUVMatrix[0][1], -theDeltaUVMatrix[1][0], theDeltaUVMatrix[0][0]);
11 theDeltaVectorMatrix = theDeltaVectorMatrix * theDeltaUVMatrix;
12 // Gram-Schmidt orthogonalization
13 theDeltaVectorMatrix[1] = normalize(theDeltaVectorMatrix[1] - dot(theNormal, theDeltaVectorMatrix[1]) * theNormal);
14 theDeltaVectorMatrix[0] = cross(theDeltaVectorMatrix[1], theNormal);
15 float aDirection = theIsInverse ? -1.0 : 1.0;
16 return mat3 (aDirection * theDeltaVectorMatrix[0], aDirection * theDeltaVectorMatrix[1], theNormal) * theNormalMapValue;
17}