playcanvas
Version:
PlayCanvas WebGL game engine
56 lines (54 loc) • 1.46 kB
JavaScript
var TBNPS = `
uniform float tbnBasis;
void getTBN(vec3 tangent, vec3 binormal, vec3 normal) {
dTBN = mat3(normalize(tangent), normalize(binormal), normalize(normal));
vec2 uv = {lightingUv};
vec3 dp1 = dFdx( vPositionW );
vec3 dp2 = dFdy( vPositionW );
vec2 duv1 = dFdx( uv );
vec2 duv2 = dFdy( uv );
vec3 dp2perp = cross( dp2, normal );
vec3 dp1perp = cross( normal, dp1 );
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
float denom = max( dot(T,T), dot(B,B) );
float invmax = (denom == 0.0) ? 0.0 : tbnBasis / sqrt( denom );
dTBN = mat3(T * invmax, -B * invmax, normal );
vec3 B = cross(normal, vObjectSpaceUpW);
vec3 T = cross(normal, B);
if (dot(B,B)==0.0)
{
float major=max(max(normal.x, normal.y), normal.z);
if (normal.x == major)
{
B = cross(normal, vec3(0,1,0));
T = cross(normal, B);
}
else if (normal.y == major)
{
B = cross(normal, vec3(0,0,1));
T = cross(normal, B);
}
else if (normal.z == major)
{
B = cross(normal, vec3(1,0,0));
T = cross(normal, B);
}
}
dTBN = mat3(normalize(T), normalize(B), normalize(normal));
}
`;
export { TBNPS as default };