본문 바로가기

DirectX( 다이렉트 X)

난반사광(Diffuse Reflection)과 정반사광(Specluar Reflection)

 

https://en.wikipedia.org/wiki/Diffuse_reflection

빛의 반사는 대표적으로 2가지로 난반사 정반사를 볼 수 있다.

난반사는 빛이 표면에 닿을떄 여러 방향으로 퍼져나가는 빛을 말한다.

정반사는 입사-반사의 법칙에 의해 반사되는 한방향으로 반사하는 빛이다.

 

난반사는 물체의 표면에 닿은 빛의해 확산되고 산란된 빛에 의해 가시성이 높아진다.

난반사의 공식은  입사각과 표면의 법선벡터의 의해 결정되며

빛의 입사광 벡터과 법선벡터의 내적하는 cos을 구하면 난반사광의 양을 구할 수 있다.

 

 

http://math.hws.edu/graphicsbook/c7/s2.html

정반사는 거울반사 경면반사라고도 하며 빛의 물체에 닿았을때 빛이 일정하게 반사되는 형상이다.

정반사의 공식을 알기 위해선 일단 반사벡터(R)를 구해야한다.   (N은 법선벡터, *는 내적, L은 입사각벡터)

여기서 반사벡터의 최종공식은 반사벡터(R) = 2(L*N)N - L이다       (자세한 공식은 링크)

정반사광을 구하는 공식은 반사벡터와 관찰자의 코사인(내적)에 의해 결정된다.  최종공식 (R*V)^2

여기서  코사인을 제곱하는 이유는 코사인 그래프를 보면 알 수 있는데 (왼쪽부터 Cos, Cos^2, Cos^32)

위와 같이 그래프를 제곱할수록 그래프가 급격하게 증가하고 급격하게 떨어지는걸 볼 수 있다.

이를 통해 실제로 물체 상에 맺히는 정반사광을 뚜렷하게 표현 할 수 있다.

 

아래 각 라이트의 적용 예시를 통해 빛의 난반사 정반사에 대해 다이렉트11에서 구현된 모습을 보도록 하자

왼쪽- 빛이 아무것도 비치지 않을떄 / 오른쪽 - 빛이 비출때

 

왼쪽 - 정반사만 있을떄 / 오른쪽 - 난반사 적용

 

정반사난반사가 모두 적용된 물체

// 반사벡터 계산
float3 reflection = normalize(2 * lightIntensity * input.normal - lightDir); 

// 반사광의 양
specular = pow(saturate(dot(reflection, input.viewDirection)), specularPower);

일반적인 정반사공식을 사용한 HLSL (쉐이딩)코드