normals.glsl 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. // http://www.thetenthplanet.de/archives/1180
  2. mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) {
  3. // Get edge vectors of the pixel triangle
  4. vec3 dp1 = dFdx(p);
  5. vec3 dp2 = dFdy(p);
  6. // Solve the linear system
  7. vec3 dp2perp = cross(dp2, n);
  8. vec3 dp1perp = cross(n, dp1);
  9. vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
  10. vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
  11. // Construct a scale-invariant frame
  12. float invmax = inversesqrt(max(dot(t, t), dot(b, b)));
  13. return mat3(t * invmax, b * invmax, n);
  14. }
  15. mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) {
  16. return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord));
  17. }
  18. // vec3 perturbNormal(vec3 n, vec3 v, vec2 texCoord) {
  19. // Assume N, the interpolated vertex normal and V, the view vector (vertex to eye)
  20. // vec3 map = texture(snormal, texCoord).xyz * (255.0 / 127.0) - (128.0 / 127.0);
  21. // WITH_NORMALMAP_2CHANNEL
  22. // map.z = sqrt(1.0 - dot(map.xy, map.xy));
  23. // WITH_NORMALMAP_GREEN_UP
  24. // map.y = -map.y;
  25. // mat3 TBN = cotangentFrame(n, -v, texCoord);
  26. // return normalize(TBN * map);
  27. // }