armory/Shaders/std/normals.glsl

32 lines
1.1 KiB
Plaintext
Raw Normal View History

2017-03-31 14:18:47 +02:00
// http://www.thetenthplanet.de/archives/1180
2017-04-01 10:06:49 +02:00
mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) {
2017-07-14 11:43:12 +02:00
// Get edge vectors of the pixel triangle
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
2017-03-31 14:18:47 +02:00
2017-07-14 11:43:12 +02:00
// Solve the linear system
vec3 dp2perp = cross(dp2, n);
vec3 dp1perp = cross(n, dp1);
vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
2017-03-31 14:18:47 +02:00
2017-07-14 11:43:12 +02:00
// Construct a scale-invariant frame
float invmax = inversesqrt(max(dot(t, t), dot(b, b)));
return mat3(t * invmax, b * invmax, n);
2017-03-31 14:18:47 +02:00
}
2017-04-01 10:06:49 +02:00
mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) {
2017-07-14 11:43:12 +02:00
return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord));
2017-04-01 10:06:49 +02:00
}
2017-03-31 14:18:47 +02:00
// vec3 perturbNormal(vec3 n, vec3 v, vec2 texCoord) {
2017-07-14 11:43:12 +02:00
// Assume N, the interpolated vertex normal and V, the view vector (vertex to eye)
// vec3 map = texture(snormal, texCoord).xyz * (255.0 / 127.0) - (128.0 / 127.0);
2017-03-31 14:18:47 +02:00
// WITH_NORMALMAP_2CHANNEL
2017-07-14 11:43:12 +02:00
// map.z = sqrt(1.0 - dot(map.xy, map.xy));
2017-03-31 14:18:47 +02:00
// WITH_NORMALMAP_GREEN_UP
2017-07-14 11:43:12 +02:00
// map.y = -map.y;
// mat3 TBN = cotangentFrame(n, -v, texCoord);
// return normalize(TBN * map);
2017-03-31 14:18:47 +02:00
// }