12
17

<본 포스팅은 강좌가 아닙니다.>

 

- 난반사광

위는 입사광과 법선이 이루는 각도 그림이다.

해가 저물어 감에 따라 표면도 점점 어두워진다.

범위는 0~1로 0은 깜깜한 것 1은 가장 밝을때이다.

 

람베르트 모델을 적용하면 코사인 함수로 난반사광을 구할 수 있다.

1일때 가장 밝고, 0일때 어둡게 어두워지는 속도를 연산해준다.

하지만 코사인 연산은 매번 호출하기엔 무거워서

내적 연산으로 대체한다. -1 다른방향 , 0 직각 , 1 같은 방향

 

내적공식으로 코사인 값은

둘의 내적값에 두 벡터의 길이를 곱한 결과를 나누면 코사인 값이 나온다.

 

법선 벡터와 입사광 벡터에 이를 적용하면 된다.

 

법선벡터는 보통 각 정점에 저장되어 있다. 쉐이더에서 이를 받아와야한다.

 

 

노말이 법선 벡터를 담은 float3 변수이다. 그리고

광원의 위치를 담은 gWorldLightPos변수를 만든다.

 

vs_main에서 변수 공간 일치를 위해, 정점의 위치는 지역공간에 있기때문에

월드공간을 연산한 다음에 광원의 위치를 뺀다. 그리고 정규화로 길이를 1로 만듬

(정규화 : 각 성분을 벡터의 길이로 나눔)

 

법선도 월드 공간으로 변환해주고 정규화해준다.

 

그리고 내적으로 각도를 구해준다. 여기서 -lightDir인데

방향을 바꿔서 화살표의 밑동이 서로 만나야 해서이다.

 

PS 

픽셀셰이더에서는 saturate함수로 -1~1인 내적값을

-1를 0으로 바꿔주는 hlsl 내장함수를 씀.

 

결과

 

- 정반사광

정반사광은 한 방향으로만 반사되는 빛이다.

김포프선생님은 퐁모델을 가르쳐주셨다.

 

퐁모델 : 반사광카메라벡터 각도의 코사인 값을 구하고, 그 결과를 여러번 거듭제곱함.

 

거듭제곱하는 이유는 난반사는 퍼지는 느낌이고 정반사는 한 방향으로 반사되기 때문에 

타이트한 빛을 만들 수 있다.

 

 

카메라 위치 변수에 시멘틱은 viewposition로 해준다.

아래는 버텍스셰이더이다.

 

 

위에 난반사와 유사하다. 변수만들고.. 월드공간에서 뷰방향 만들어주고..

중요한건 Hlsl내장함수 reflect으로 입사광의 방향텍터와 반사면의 법선을 받아 정반사광을 만들어준다.

 

PS

픽셀셰이더에서 정규화를 한번 더 해준다. 

보간기를 거치면서 값이 흐트러진다.

if문은 난반사, 빛이 들어와야 정반사가 있기에 0보다 커야 실행한다.

반사광과 카메라벡터 각도의 코사인 값을 구하고 그것을

거듭제곱 POW함수를 실행한다. 20번 실행되게 했다.

 

결과

 

책에 써놓으신 요약부분이 좋아서 남겨본다..

람베르트 모델은 난반사광 계산할때 코사인씀

퐁 모델은 정반사광 계산할때 코사인 거듭제곱함

벡터 정규화하면 내적으로 코사인 함수 대체가능함

픽셸셰이더보다는 정점셰이더가 계산양 대체적으로 적음

COMMENT