Cycles: ambient occlusion now takes per-BSDF normals into account.

This commit is contained in:
Brecht Van Lommel
2012-11-15 15:37:58 +00:00
parent 1c410ab6e7
commit 613cf7ae37
2 changed files with 34 additions and 21 deletions

View File

@@ -599,21 +599,35 @@ __device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
#endif
}
__device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd)
__device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N)
{
#ifdef __MULTI_CLOSURE__
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
*N = make_float3(0.0f, 0.0f, 0.0f);
for(int i = 0; i< sd->num_closure; i++) {
ShaderClosure *sc = &sd->closure[i];
if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type))
if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
eval += sc->weight*ao_factor;
*N += sc->N*average(sc->weight);
}
if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) {
eval += sc->weight;
*N += sd->N*average(sc->weight);
}
}
*N = normalize(*N);
return eval;
#else
if(CLOSURE_IS_AMBIENT_OCCLUSION(sd->closure.type))
*N = sd->N;
if(CLOSURE_IS_DIFFUSE(sd->closure.type))
return sd->closure.weight*ao_factor;
else if(CLOSURE_IS_AMBIENT_OCCLUSION(sd->closure.type))
return sd->closure.weight;
else
return make_float3(0.0f, 0.0f, 0.0f);