diff --git a/data/shaders/geometry.glsl b/data/shaders/geometry.glsl index 593f9eb..49a76b0 100644 --- a/data/shaders/geometry.glsl +++ b/data/shaders/geometry.glsl @@ -2,6 +2,8 @@ layout (triangles) in; layout (triangle_strip) out; +uniform mat4 Model; + in vec2 gtexCoord[]; in vec3 gnormCoord[]; in vec3 gWorldPos[]; @@ -10,8 +12,48 @@ out vec2 texCoord; out vec3 normCoord; out vec3 WorldPos; -void main() +out mat3 TBN; + +void main(void) { + // Calculate Normal Map stuff + + // Real space triangle + vec3 p1 = gl_in[0].gl_Position.xyz; + vec3 p2 = gl_in[1].gl_Position.xyz; + vec3 p3 = gl_in[2].gl_Position.xyz; + + // Normal texture space triangle + vec2 uv1 = gtexCoord[0]; + vec2 uv2 = gtexCoord[1]; + vec2 uv3 = gtexCoord[2]; + + // Calculate edge translation vectors duv stands for delta uv + vec3 edge1 = p2 - p1; + vec3 edge2 = p3 - p1; + vec2 duv1 = uv2 - uv1; + vec2 duv2 = uv3 - uv1; + + // Calculation of tangents and bi tangents + // [ddTxBxTyByTzBz]=1ΔU1ΔV2−ΔU2ΔV1[ΔV2−ΔU2−ΔV1ΔU1][E1xE2xE1yE2yE1zE2z] + // https://learnopengl.com/Advanced-Lighting/Normal-Mapping + + float f = 1.0 / (duv1.x * duv2.y - duv2.x * duv1.y); + + float tx = f * (duv2.y * edge1.x - duv1.y * edge2.x); + float ty = f * (duv2.y * edge1.y - duv1.y * edge2.y); + float tz = f * (duv2.y * edge1.z - duv1.y * edge2.z); + + vec3 tangent = vec3(tx, ty, tz); + + //Calculate TBN + vec3 T = normalize(vec3(Model * vec4(tangent, 0.0))); + vec3 N = normalize(vec3(Model * vec4(gnormCoord[0], 0.0))); + vec3 B = cross(N, T); + + TBN = mat3(T, B, N); + + // send data to Fragment Shader gl_Position = gl_in[0].gl_Position; texCoord = gtexCoord[0]; normCoord = gnormCoord[0]; diff --git a/data/shaders/pbrFragment.glsl b/data/shaders/pbrFragment.glsl index 914e6f9..2bb1f3b 100644 --- a/data/shaders/pbrFragment.glsl +++ b/data/shaders/pbrFragment.glsl @@ -4,7 +4,7 @@ out vec4 FragColor; in vec2 texCoord; in vec3 normCoord; in vec3 WorldPos; -//in mat4 TBN; +in mat3 TBN; // TODO: make temporary hard coded world/camera pos dynamic //uniform vec3 WorldPos ; @@ -73,12 +73,8 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) vec3 normal(){ // load and invert normal - vec3 normal = normalize(texture(texture_normal1, texCoord).rgb * 2.0 - 1.0); - - //normal = (TBN * vec4(normal, 1.0)).xyz; - - //TODO: Make the normal vector match the matrix of the rest of the model by - //actually calculating the TBN + vec3 normal = texture(texture_normal1, texCoord).rgb * 2.0 - 1.0; + normal = normalize(TBN * normal); return normal; } @@ -94,8 +90,8 @@ vec3 PBR(vec3 albedo, float roughness, float metallic, float ao) vec3 N = normalize(normCoord); vec3 V = normalize(CameraPos - WorldPos); - N = (N + normal()) / 2; - //N = normal(); For seeing if normal map tracks with light. + //N = (N + normal()) / 2; + //N = normal(); //For seeing if normal map tracks with light. vec3 F0 = vec3(0.04); F0 = mix(F0, albedo, metallic); @@ -143,5 +139,6 @@ void main() float metallic = texture(texture_rma1, texCoord).g; float ao = texture(texture_rma1, texCoord).b; - FragColor = vec4(PBR(albedo, roughness, metallic, ao), 1.0); + //FragColor = vec4(PBR(albedo, roughness, metallic, ao), 1.0); + FragColor = vec4(normal(), 1.0); } diff --git a/data/shaders/pbrVertex.glsl b/data/shaders/pbrVertex.glsl index 5b9ccf0..5cf8bae 100644 --- a/data/shaders/pbrVertex.glsl +++ b/data/shaders/pbrVertex.glsl @@ -12,8 +12,6 @@ out vec3 gnormCoord; //Pbr out vec3 gWorldPos; -//Normals - void main() { gl_Position = MVP * Model * vec4(aPos, 1.0);