Lambertian과 Oren Nayar 알아보기

2020-02-24

preview 두 Diffuse 모델에 대해서 알아봅시다!

이 글은 제가 공부한 것을 정리한 글입니다. 따라서 잘못된 사실이 있거나 모호한 부분이 있다면 언제든지 댓글이나 메일을 보내주시면 감사하겠습니다.

Lambertian

Lambertian Diffuse 방향에 관계없이 반사가 일정하다

Lambertian은 이전 PBR에서 표면은 Microfacet들의 집합이라는 이야기와는 상관 없습니다. 단지 관찰자의 방향과 관계없이 모든 방향에서 같은 복사량을 가지게되죠. 그래서 Lambertian을 계산할때는 단지 Albedo만 필요한 간단한 모델입니다.

코드로 작성하면 다음과 같습니다.

vec3 LambertianDiffuse(vec3 albedo)
{
	return albedo / PI;
}

Oren Nayar

앞선 Lambertian과 달리 Oren Nayar 모델은 거칠기에 따라 달라지는 표면에서의 Diffuse를 표현하기 위한 반사 모델입니다. 따라서 관찰자나 빛의 방향 그리고 거칠기 등을 파라미터로 받는 복잡한 함수가 됩니다.

여기까지는 위키를 보아도 알 수 있으니 구현상에서 살펴보아야 할 점을 알아봅시다.

우선 는 다음과 같이 구할 수 있습니다.

그럼 이제 를 구할 수 있습니다. 그리고 마지막으로 를 구하는 방법을 알아봅시다.

구하기

Lambertian Diffuse 이 노말인 표면에 Projection

를 직접 구하는 것은 비용이 크니 을 표면에 Projection 시킨 두 벡터를 대상으로 내적을 시킵니다.

그럼 모든 항을 구할 수 있습니다. 구현을 살펴봅시다.

vec3 OrenNayarDiffuse(vec3 albedo, vec3 normal, vec3 viewDir, vec3 lightDir, float roughness)
{
	float sigma2 = roughness * roughness;
	float NdotL = saturate(dot(normal, lightDir));
	float NdotV = saturate(dot(normal, viewDir));

	vec3 lambert = albedo / PI;
	float A = 1.0 - (sigma2 / (sigma2 + 0.33)) * 0.5;
	float B = 0.45 * sigma2 / (sigma2 + 0.09);
	float alpha = max(acos(NdotL), acos(NdotV));
	float beta = min(acos(NdotL), acos(NdotV));
	float gamma = max(0, dot(viewDir - normal * NdotV, lightDir - normal * NdotL));

	return lambert * (A + B * gamma * sin(alpha) * tan(beta));
}

Lambertian vs Oren Nayar

Lambertian vs Oren Nayar 거칠기가 증가할수록 점점 더 어두워진다

다음은 Lambertian과 Oren Nayar의 차이를 보여주는 이미지 입니다. Oren Nayar에서 이면 , 이므로 Lambertian 모델과 같아집니다. 따라서 위 이미지에서도 Roughness가 0인 Oren-Nayar와 Lambertian이 같은 밝기를 가지고 있습니다.

Lambertian vs Oren Nayar Vase Lambertian과 Oren Nayar 비교 - wikipedia

위 이미지는 Lambertian과 Oren Nayar중에 어느 모델이 실제 이미지와 비슷한지 보여줍니다. 저도 Oren Nayar 모델을 공부하기 전 까지는 Lambertian이 좀 더 현실과 맞다고 생각했지만, 이렇게 비교하니 Oren Nayar 모델이 더 현실감 있다는 것을 알게 되었습니다.

Lambertian vs Oren Nayar Measurement Brightness 차이 - wikipedia

위 그래프는 바로 앞의 이미지에서 밝기를 추출한 그래프 입니다. 이때 Measurements는 실제 이미지의 측정값인데, 그래프에서도 볼 수 있듯이 Oren Nayar가 실제 측정값과 거의 유사합니다. 정면에서는 밝았다가 노말이 뷰에 거의 90도가 가까워지면서 급격하게 0이 되는 것을 알 수 있습니다.

유용한 링크

코드 (Git Repository)

wikipedia Oren–Nayar_reflectance_model

PBR Online Book