From b1c966b47df257d88579db395fba4fe9484bfdc8 Mon Sep 17 00:00:00 2001 From: Warwick Date: Fri, 29 Jul 2022 13:01:01 +0100 Subject: [PATCH] Adding a limit to the number of primitves exiting my geometry shader stops the shape from breaking... --- data/shaders/geometry.glsl | 41 +++++++++++++++++++++++++---------- data/shaders/pbrFragment.glsl | 34 ++++++++++++++++++++++------- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/data/shaders/geometry.glsl b/data/shaders/geometry.glsl index 49a76b0..44df27d 100644 --- a/data/shaders/geometry.glsl +++ b/data/shaders/geometry.glsl @@ -1,6 +1,6 @@ #version 330 core layout (triangles) in; -layout (triangle_strip) out; +layout (triangle_strip, max_vertices = 3) out; uniform mat4 Model; @@ -12,7 +12,16 @@ out vec2 texCoord; out vec3 normCoord; out vec3 WorldPos; -out mat3 TBN; +vec3 lightPosition = vec3(1, 1, 2); + +uniform vec3 CameraPos; + +out GS_OUT { + mat3 TBN; + vec3 tangentLightPos; + vec3 tangentViewPos; + vec3 tangentFragPos; +} gs_out; void main(void) { @@ -38,20 +47,24 @@ void main(void) // [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 invDet = 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); + vec3 tangent = vec3 (invDet * (duv2.y * edge1 - duv1.y * edge2)); + vec3 bitangent = vec3 (invDet * (-duv2.x * edge1 - duv1.x * edge2)); //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); + //mat3 normalMatrix = transpose(inverse(mat3(Model))); - TBN = mat3(T, B, N); + vec3 T = normalize(vec3(Model * vec4(tangent, 0.0f))); + vec3 B = normalize(vec3(Model * vec4(bitangent, 0.0f))); + vec3 N = normalize(vec3(Model * vec4(cross(edge2, edge1), 0.0f))); + + mat3 TBN = transpose(mat3(T, B, N)); + gs_out.TBN = TBN; + + gs_out.tangentLightPos = TBN * lightPosition; + gs_out.tangentViewPos = TBN * CameraPos; + gs_out.tangentFragPos = TBN * gWorldPos[0]; // send data to Fragment Shader gl_Position = gl_in[0].gl_Position; @@ -64,12 +77,16 @@ void main(void) texCoord = gtexCoord[1]; normCoord = gnormCoord[1]; WorldPos = gWorldPos[1]; + + gs_out.tangentFragPos = TBN * gWorldPos[1]; EmitVertex(); gl_Position = gl_in[2].gl_Position; texCoord = gtexCoord[2]; normCoord = gnormCoord[2]; WorldPos = gWorldPos[2]; + + gs_out.tangentFragPos = TBN * gWorldPos[2]; EmitVertex(); EndPrimitive(); }; diff --git a/data/shaders/pbrFragment.glsl b/data/shaders/pbrFragment.glsl index 2bb1f3b..ffd14bb 100644 --- a/data/shaders/pbrFragment.glsl +++ b/data/shaders/pbrFragment.glsl @@ -4,6 +4,14 @@ out vec4 FragColor; in vec2 texCoord; in vec3 normCoord; in vec3 WorldPos; + +in GS_OUT { + mat3 TBN; + vec3 tangentLightPos; + vec3 tangentViewPos; + vec3 tangentFragPos; +} from_gs; + in mat3 TBN; // TODO: make temporary hard coded world/camera pos dynamic @@ -71,27 +79,34 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) return ggx1 * ggx2; } -vec3 normal(){ +vec3 normalMapNormal(){ // load and invert normal - vec3 normal = texture(texture_normal1, texCoord).rgb * 2.0 - 1.0; - normal = normalize(TBN * normal); + vec3 normal = normalize(texture(texture_normal1, texCoord).rgb * 2.0 - 1.0); - return normal; + vec3 lightDir = normalize(from_gs.tangentLightPos - from_gs.tangentFragPos); + vec3 viewDir = normalize(from_gs.tangentViewPos - from_gs.tangentFragPos); + vec3 reflectDir = reflect(-lightDir, normal); + vec3 halfwayDir = normalize(lightDir + viewDir); + float spec = pow(max(dot(normal, halfwayDir), 0.0),32.0); + + vec3 normMapSpecular = vec3(0.2) * spec; + + return normMapSpecular; } vec3 PBR(vec3 albedo, float roughness, float metallic, float ao) { // Establish a temporary hard coded light position - vec3 lightPosition = vec3( 1, 1, 2); + vec3 lightPosition = vec3(1, 1, 2); //vec3 lightPosition = vec3( (sin(tick / 1000.0)*2), 1 + sin(tick / 600.0)*2, 2.0); //vec3 lightColor = vec3(1.0, 1.0, 1.0) - sin(tick / 90); vec3 lightColor = vec3(13.47, 11.31, 10.79); 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 + normalMapNormal()) / 2; + //N = normalMapNormal(); //For seeing if normal map tracks with light. vec3 F0 = vec3(0.04); F0 = mix(F0, albedo, metallic); @@ -140,5 +155,8 @@ void main() float ao = texture(texture_rma1, texCoord).b; //FragColor = vec4(PBR(albedo, roughness, metallic, ao), 1.0); - FragColor = vec4(normal(), 1.0); + FragColor = vec4(PBR(albedo, roughness, metallic, ao) + normalMapNormal(), 1.0); + //FragColor = vec4(normalMapNormal(), 1.0); + //FragColor = vec4(vec3(0.5) + normalMapNormal(), 1.0); + //FragColor = vec4(vec3(0.5), 1.0); }