I think I'm close to inserting and using the TBN correctly.
This commit is contained in:
parent
5b1aba34df
commit
ecf7929152
3 changed files with 50 additions and 13 deletions
|
|
@ -2,6 +2,8 @@
|
||||||
layout (triangles) in;
|
layout (triangles) in;
|
||||||
layout (triangle_strip) out;
|
layout (triangle_strip) out;
|
||||||
|
|
||||||
|
uniform mat4 Model;
|
||||||
|
|
||||||
in vec2 gtexCoord[];
|
in vec2 gtexCoord[];
|
||||||
in vec3 gnormCoord[];
|
in vec3 gnormCoord[];
|
||||||
in vec3 gWorldPos[];
|
in vec3 gWorldPos[];
|
||||||
|
|
@ -10,8 +12,48 @@ out vec2 texCoord;
|
||||||
out vec3 normCoord;
|
out vec3 normCoord;
|
||||||
out vec3 WorldPos;
|
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;
|
gl_Position = gl_in[0].gl_Position;
|
||||||
texCoord = gtexCoord[0];
|
texCoord = gtexCoord[0];
|
||||||
normCoord = gnormCoord[0];
|
normCoord = gnormCoord[0];
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ out vec4 FragColor;
|
||||||
in vec2 texCoord;
|
in vec2 texCoord;
|
||||||
in vec3 normCoord;
|
in vec3 normCoord;
|
||||||
in vec3 WorldPos;
|
in vec3 WorldPos;
|
||||||
//in mat4 TBN;
|
in mat3 TBN;
|
||||||
|
|
||||||
// TODO: make temporary hard coded world/camera pos dynamic
|
// TODO: make temporary hard coded world/camera pos dynamic
|
||||||
//uniform vec3 WorldPos ;
|
//uniform vec3 WorldPos ;
|
||||||
|
|
@ -73,12 +73,8 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
|
|
||||||
vec3 normal(){
|
vec3 normal(){
|
||||||
// load and invert normal
|
// load and invert normal
|
||||||
vec3 normal = normalize(texture(texture_normal1, texCoord).rgb * 2.0 - 1.0);
|
vec3 normal = texture(texture_normal1, texCoord).rgb * 2.0 - 1.0;
|
||||||
|
normal = normalize(TBN * normal);
|
||||||
//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
|
|
||||||
|
|
||||||
return normal;
|
return normal;
|
||||||
}
|
}
|
||||||
|
|
@ -94,8 +90,8 @@ vec3 PBR(vec3 albedo, float roughness, float metallic, float ao)
|
||||||
|
|
||||||
vec3 N = normalize(normCoord);
|
vec3 N = normalize(normCoord);
|
||||||
vec3 V = normalize(CameraPos - WorldPos);
|
vec3 V = normalize(CameraPos - WorldPos);
|
||||||
N = (N + normal()) / 2;
|
//N = (N + normal()) / 2;
|
||||||
//N = normal(); For seeing if normal map tracks with light.
|
//N = normal(); //For seeing if normal map tracks with light.
|
||||||
|
|
||||||
vec3 F0 = vec3(0.04);
|
vec3 F0 = vec3(0.04);
|
||||||
F0 = mix(F0, albedo, metallic);
|
F0 = mix(F0, albedo, metallic);
|
||||||
|
|
@ -143,5 +139,6 @@ void main()
|
||||||
float metallic = texture(texture_rma1, texCoord).g;
|
float metallic = texture(texture_rma1, texCoord).g;
|
||||||
float ao = texture(texture_rma1, texCoord).b;
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,6 @@ out vec3 gnormCoord;
|
||||||
//Pbr
|
//Pbr
|
||||||
out vec3 gWorldPos;
|
out vec3 gWorldPos;
|
||||||
|
|
||||||
//Normals
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = MVP * Model * vec4(aPos, 1.0);
|
gl_Position = MVP * Model * vec4(aPos, 1.0);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue