Clipping Triangle for SW Occlusion Culling

2016_0801_clip_tri
어제 x:-1 – +1, y:-1 – +1, z:0 – +1 볼륨에 대해 삼각형 클리핑 코드를 완성했고 잘 작동함을 확인했다. 그런데 카메라 돌리다보면 삼각형이 사라지거나 원래 삼각형의 빗면과 같은 기울기로 엉뚱한 곳에 삼각형이 나타나는 현상이 발생함.
원인 찾느라 엄청 해맸다.
[원인]
커다란 삼각형의 점 일부가 카메라 뒷쪽으로 가는 경우, 프로젝션하고 보면 w값이 음수가 나옴.
이 경우 w로 나눠주면 프로젝션된 삼각형의 모양 자체가 완전히 다른게 나옴.
이걸 가지고 클리핑 해봐야 잘못된 결과만 나오지.
클리핑 코드도 그렇고 레스터라이즈 코드도 그렇고 w값이 음수인 경우엔 비정상적인 작동을 하게 된다.
[해결]
x,y,z를 w로 나눠서 화면좌표로 맵핑하는 시점에서 w값이 음수면 안됨. 그 전에 삼각형의 z값이 near – far사이에 위치하도록 클리핑되어있어야 함.
찾아보니 그래서 동차좌표계 상에서(w로 나누기 전에) 클리핑 하는 방법에 대한 문서들이 있음.
일단 뭔 소린지 이해가 잘 안되고 짜놓은 코드가 아까워서 클리핑을 두번에 나눠서 하기로.
view 변환 후 near- far에 대해 클리핑, projection후에 left-right, top-bottom에 대해서 클리핑.
-첫번째 클리핑
view-space에서 변환하고 near와 far 평면에 대해서 클리핑.
카메라 뒤에 있는 점이 있다면 여기서 클리핑 되어서 삼각형이 아닌 4각형이나 5각형이 됨. 이 시점에서 z값이 음수인 점은 존재하지 않음.
-두번째 클리핑
이 n각형을 projection 시킨후 각 점을 w로 나눠서 x : -1 – +1, y : -1 – +1, z : 0 – +1 사이로 정규화시킴.
이 상태에서 x : -1,+1 , y : -1,+1의 4개의 평면에 대해 클리핑.
[결과 및 고찰]
이렇게 해서 제대로 결과가 나온다.
동차좌표계 상에서 클리핑하는게 가장 깔끔한데…문서 봐도 이해가 안되고 시간도 없어서 포기.
처음부터 월드 스페이스에서 뷰프러스텀의 6개 면에 대해서 클리핑 하는 방법도 있는데 변환 과정에서 오차가 커질거 같아서 그냥 벡터*메트릭스 연산 한번 더 하기로. 삼각형 개수가 많은건 아니니까.
그래픽스를 제대로 배웠다면 금방 해결했을텐데.쩝쩝.
찾아보니 내가 만들고 있는 SW Occlusion Culling기법은 intel에서 라이브러리로 만들어서 github에 올려놨음. 받아서 돌려보니 샘플은 잘 돌아감. 물론 내가 만든것보다 100만배는 잘 만들었겠지. 하지만 남의 코드 붙이는 것도 일이라.. 일단 내 코드 완성 지어서 잘 돌아가게 만들어놓고 생각해보자.

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중