환경매핑
카메라 -> 주전자 방향의 벡터는 주전자의 법선벡터와 연산으로 반사벡터를 얻을 수 있다.
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
uv 좌표가 아니다...!
스카이박스
카메라를 중심으로 한 큐브나, 스피어 모델을 만들고 거기에 환경맵의 텍스처 매핑을 하는 연산이다.
정점 셰이더에서 할 일은 박스 모델의 중심 위치를 항상 카메라의 위치와 동일하게끔 행렬 연산을 해주는 것이 전부다.
픽셀 셰이더에서 할 일은 정점의 좌표를 받아와서 값을 리턴해주는게 전부다.
렌더스테이트를 잘 설정해야 하는게 스카이박스의 주요 포인트라고 생각된다.
주의 -
스카이박스는 모니터 해상도만큼 픽셀 셰이더를 호출하는 나름 비용 드는 연산이다.
최적화를 위한다면 스카이박스 연산이 필요한 부분을 제외하고는 연산하지 않는 방법이 좋다.
그래서 스카이박스 패스를 맨 마지막으로 미뤄서 진행하라는 말도 있고 뭐, 그렇다
PASS a - 스카이박스
여기서 position3D는 투영공간의 좌표인데, texCUBE 함수는 월드 공간의 연산이다.
좀 더 정확히 하려면 월드 공간의 좌표를 넘겨줘야 하는듯 하다
texCUBE는 월드 공간 값으로 연산해줘야 한다!
PASS b - 환경매핑
코드는 생략
근데 이거 색이 좀 이상하다