#version 450 core uniform sampler2D texture_basecolor; uniform sampler2D texture_metallic_roughness; uniform sampler2D texture_normal; uniform bool texture_basecolor_available = false; uniform bool texture_metallic_roughness_available = false; uniform bool texture_normal_available = false; uniform vec3 baseColor; uniform vec2 metallicRoughness; layout (location = 0) out vec4 gBaseColor; layout (location = 1) out vec3 gNormal; layout (location = 2) out vec3 gPosition; layout (location = 3) out vec2 gMetallicRoughness; layout (location = 4) out vec4 gDebug; in vec2 TexCoords; in vec3 WorldPos; in vec3 Normal; vec3 getNormalFromMap() { vec3 tangentNormal = texture(texture_normal, TexCoords).xyz * 2.0 - 1.0; vec3 Q1 = dFdx(WorldPos); vec3 Q2 = dFdy(WorldPos); vec2 st1 = dFdx(TexCoords); vec2 st2 = dFdy(TexCoords); vec3 N = normalize(Normal); vec3 T = normalize(Q1*st2.t - Q2*st1.t); vec3 B = -normalize(cross(N, T)); mat3 TBN = mat3(T, B, N); return normalize(TBN * tangentNormal); } void main() { if(texture_basecolor_available) gBaseColor = texture(texture_basecolor, TexCoords); else gBaseColor = vec4(baseColor, 1); if(gBaseColor.a<0.4) discard; gPosition = WorldPos; if(texture_normal_available) gNormal = getNormalFromMap(); else gNormal = Normal; if(!gl_FrontFacing) gNormal = -gNormal; if(texture_metallic_roughness_available) gMetallicRoughness = texture(texture_metallic_roughness, TexCoords).bg; else gMetallicRoughness = metallicRoughness; gDebug = vec4(0); }