환경매핑

 

카메라 -> 주전자 방향의 벡터는 주전자의 법선벡터와 연산으로 반사벡터를 얻을 수 있다.

 

reflectionVec = reflect(카메라->주전자 벡터, 주전자 법선벡터);

 

반사벡터를 구하는 공식은 reflectionVec = p - 2(n(n · p)) 
p는 입사벡터 n은 노말벡터

 

슬라이딩벡터는 sVec = p - n(n · p) 

 

환경매핑은 반사벡터가 향하는 지점의 큐브맵에서 X, Y 좌표에 위치한 RGB색상값을 반사벡터의 시점 좌표의 픽셀에 대응시키는것

 

방법은 texCUBE 함수를 사용하는것

 

resultColor = texCUBE(큐브맵, 반사벡터);

 

이다.


 

 

여기서 문제가 되는 점이 있다. y축 방향이 0.8이 나오는데, 사실 uv 좌표는

 

위에서 아래로 내려간다. 아래에서 위로 가는게 아니라...

 

연산한 y값을 뒤집으면 제대로 된 값이 나오는 것 같은데, 이건 좀 더 알아봐야겠다.

큐브맵 좌표계 검색

https://www.slideshare.net/Mark_Kilgard/11texture

 

CS 354 Texture Mapping

CS 354 Computer Graphics; University of Texas, Austin; February 23, 2012

www.slideshare.net

uv 좌표가 아니다...!


스카이박스

 

카메라를 중심으로 한 큐브나, 스피어 모델을 만들고 거기에 환경맵의 텍스처 매핑을 하는 연산이다.

 

정점 셰이더에서 할 일은 박스 모델의 중심 위치를 항상 카메라의 위치와 동일하게끔 행렬 연산을 해주는 것이 전부다.

 

픽셀 셰이더에서 할 일은 정점의 좌표를 받아와서 값을 리턴해주는게 전부다.

 

렌더스테이트를 잘 설정해야 하는게 스카이박스의 주요 포인트라고 생각된다.

 

주의 -

스카이박스는 모니터 해상도만큼 픽셀 셰이더를 호출하는 나름 비용 드는 연산이다.

최적화를 위한다면 스카이박스 연산이 필요한 부분을 제외하고는 연산하지 않는 방법이 좋다.

그래서 스카이박스 패스를 맨 마지막으로 미뤄서 진행하라는 말도 있고 뭐, 그렇다

 

 

PASS a - 스카이박스

정점 셰이더

여기서 position3D는 투영공간의 좌표인데, texCUBE 함수는 월드 공간의 연산이다.

 

좀 더 정확히 하려면 월드 공간의 좌표를 넘겨줘야 하는듯 하다

픽셀 셰이더

texCUBE는 월드 공간 값으로 연산해줘야 한다!

렌더스테이트

PASS b - 환경매핑

mm5-gnap.tistory.com/244

 

8. 환경매핑

 

mm5-gnap.tistory.com

코드는 생략

렌더스테이트

 

 

근데 이거 색이 좀 이상하다

+ Recent posts