X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=pbrfrag.glsl;h=16a9fa7a1ba6128257bff2175ee0b24a8868d407;hp=4421b99b6021a9e6a7da4953122bebf30bbf2499;hb=9e43c799021b7bcca324b988aae44e98b05d10b4;hpb=a03f2bc751bbd7f91cbc2f52d2f0f6e753d6f776 diff --git a/pbrfrag.glsl b/pbrfrag.glsl index 4421b99..16a9fa7 100644 --- a/pbrfrag.glsl +++ b/pbrfrag.glsl @@ -12,6 +12,7 @@ uniform sampler2D normalMap; uniform sampler2D metallicMap; uniform sampler2D roughnessMap; uniform sampler2D aoMap; +uniform samplerCube irradianceMap; out vec4 fragColor; @@ -24,6 +25,10 @@ vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.f - F0) * pow(1.f - cosTheta, 5.f); } +vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) { + return F0 + (max(vec3(1.f - roughness), F0) - F0) * pow(1.f - cosTheta, 5.f); +} + float distributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float NdotH = mdot(N, H); @@ -97,7 +102,9 @@ void main() { Lo += (kD * albedo / PI + specular) * radiance * mdot(N, L); } - vec3 ambient = vec3(0.03) * albedo * ao; + vec3 kD = 1.f - fresnelSchlickRoughness(mdot(N, V), F0, roughness); + vec3 diffuse = texture(irradianceMap, N).rgb * albedo; + vec3 ambient = (kD * diffuse) * ao; vec3 color = ambient + Lo; color = color / (color + vec3(1.f)); // map to HDR