2017-03-03 4 views
3

J'essaie de déterminer si mon approche BRDF est correcte ou non.Rendu physique: rôle de la lumière ambiante dans BRDF

// Calculate sun BRDF color 
vec3 sunBrdf = brdf(tsLightSourceDir, tsEyeDir, 
        tsNormal, vtsTangent, vtsBinormal, 
        albedo.rgb, 
        NdotL, NdotV, 
        tRoughness, tMetallic, specular); 

// brdf multiplied by incoming sun radiance -> color 
vec3 irradiance = sunAmbientRadiance + sunDiffuseRadiance * NdotL; 
vec3 brdfColor = sunBrdf * irradiance; 

// Add base ambient color 
vec3 ambientColor = albedo.rgb * sunAmbientRadiance; 
resultColor = ambientColor; 

resultColor += brdfColor; 

// Interpolate by shadow 
resultColor = mix(ambientColor, 
        resultColor, 
        shadowAmount); 

Ma question: J'ajoute la lumière ambiante 2x. 1x lors du calcul de la couleur ambiante et 1x en l'ajoutant à la quantité de lumière entrant dans la BRDF.

Je ne peux pas comprendre si c'est correct ou pas, puisque la BRDF a besoin de la lumière ambiante à mon avis car c'est une partie de l'éclairage qui arrive sur la surface. Mais d'un autre côté, il est déjà calculé en le multipliant avec la couleur albédo et ajouté comme couleur de base ...

Toute aide est très appréciée!

Répondre

0

La bonne formule va comme ceci (à mon avis):

vec3 irradiance = sunDiffuseRadiance * NdotL;