playcanvas
Version:
PlayCanvas WebGL game engine
4 lines (2 loc) • 2.13 kB
JavaScript
var TBNPS = "\n\n#ifdef LIT_TANGENTS\n #define TBN_TANGENTS\n#else\n #if defined(LIT_USE_NORMALS) || defined(LIT_USE_CLEARCOAT_NORMALS)\n #define TBN_DERIVATIVES\n #endif\n#endif\n\n#if defined(TBN_DERIVATIVES)\n uniform float tbnBasis;\n#endif\n\nvoid getTBN(vec3 tangent, vec3 binormal, vec3 normal) {\n\n #ifdef TBN_TANGENTS // tangents / binormals based TBN\n\n dTBN = mat3(normalize(tangent), normalize(binormal), normalize(normal));\n\n #elif defined(TBN_DERIVATIVES) // derivatives based TBN\n\n vec2 uv = {lightingUv};\n\n // get edge vectors of the pixel triangle\n vec3 dp1 = dFdx( vPositionW );\n vec3 dp2 = dFdy( vPositionW );\n vec2 duv1 = dFdx( uv );\n vec2 duv2 = dFdy( uv );\n\n // solve the linear system\n vec3 dp2perp = cross( dp2, normal );\n vec3 dp1perp = cross( normal, dp1 );\n vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;\n\n // construct a scale-invariant frame\n float denom = max( dot(T,T), dot(B,B) );\n float invmax = (denom == 0.0) ? 0.0 : tbnBasis / sqrt( denom );\n dTBN = mat3(T * invmax, -B * invmax, normal );\n\n #else // object space TBN\n\n vec3 B = cross(normal, vObjectSpaceUpW);\n vec3 T = cross(normal, B);\n\n if (dot(B,B)==0.0) // deal with case when vObjectSpaceUpW normal are parallel\n {\n float major=max(max(normal.x, normal.y), normal.z);\n\n if (normal.x == major)\n {\n B = cross(normal, vec3(0,1,0));\n T = cross(normal, B);\n }\n else if (normal.y == major)\n {\n B = cross(normal, vec3(0,0,1));\n T = cross(normal, B);\n }\n else if (normal.z == major)\n {\n B = cross(normal, vec3(1,0,0));\n T = cross(normal, B);\n }\n }\n\n dTBN = mat3(normalize(T), normalize(B), normalize(normal));\n\n #endif\n}\n";
export { TBNPS as default };