주어진 확산 경로가 표면을 두 번 통과한다는 의미에서 두 프레 넬 항을 사용하는 것이 정확합니다. 다시 튀어 나올 때까지 매체를 통과하는 경로를 추적하여 확산을 해결하는 경우 표면과 상호 작용할 때 해당 경로에 대해 두 개 이상의 프레 넬 항을 얻게됩니다.
그러나 이것이 확산 BRDF로 수행하는 것은 아닙니다. 확산 BRDF는 가능한 모든 확산 경로의 평균을 나타 내기위한 것입니다. Lambertian의 경우 평균은 균일 한 반사와 확산 동안 내부 에너지 손실을 측정하는 단일 알베도 값으로 모델링되지만 더 복잡한 모델이 가능합니다. 결정적으로 : 확산 BRDF는 이미 일부 경로가 매체로 다시 반사되어 추가로 확산되고 일부는 즉시 빠져 나가는 효과를 포함합니다. 가 BRDF¹에 이미 "구워 져"있으며 다시 고려할 필요가 없습니다.1 - FO U t
램버 시안 용어에 포함되지 않은 것은 빛이 확산 매체로 들어가기 전에 반사되어 손실되는 에너지 부분입니다. 이것은보기에 따라 다르지만 그 위의 정확한 광택 엽에 달려 있습니다. A (비금속)에서 더 에너지 손실 당신이 실제로 원하는 것은 즉, 모든 발신 방향을 통해 표면에서의 총 에너지 손실을 통합하는 것을 의미 굴절됩니다 반영되지 않습니다 모든 때문에 표면 인터페이스가 없습니다 .1 − ∫glossy_bsdf ( 에서 , 밖으로 )D 밖으로
특정 BRDF에 대한 근사값에 대한 근사값을 사전 계산할 수 있습니다. 최종 결과는 일반적으로 시야 방향, 재료 거칠기 및 IOR에 따라 달라집니다. 첫 번째 근사치로, 광택 엽이 완벽하게 반사되는 반사판이라고 가정 할 수 있습니다. 이는 의 가중치를 부여합니다 이것은 정확히 당신이 처음 제안한 것입니다.1 − ∫광택거라고 아웃 =1- F나는 n
또한 Lambertian BRDF는 로 나눈 알베도 이며 코사인 항은 들어오는 빛이 표면에서 얼마나 감쇠되는지를 나타내는 척도입니다. 광택 및 확산 반사에 모두 적용됩니다.π
대략적으로 :
// Assuming for example:
// diffuse = albedo / PI;
// specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
// fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
// total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);
¹ 가능한 모든 입사 내부 확산 출구 경로에 대해 의 적분은 바깥 방향으로 이어지지 만 난탈합니다.에프