최근에 오큘러스 리프트 잡고 개발한게 있다. (프로젝트는 망했지만) 개발하면서 일반 CG에서는 절대로 볼수없고 오직 오큘러스 리프트에서만 구경할수 있는 이상 렌더링 몇개 발견해서 스샷 찍어놓은걸 간단히 정리했다.
신개념 Z-fighting artifacts
이런 이상현상을 뭐라고 불러야 될지 잘 모르겠다. z-fighting이라고 써놨지만 기존의 CG에서 볼수있는 z-fighting하고는 다르다. 다음의 요소가 결합되어서 발생하는 버그로 추정된다.
- 2개의 스프라이트를 겹쳐서 배치하기
- 왼쪽눈/오른쪽눈으로 볼때 달라지는 거리
- 거리에 따라서 렌더링할 객체 순서를 엔진이 정렬
주의 : 아래의 설명은 irrlicht engine기준이다. 다른 엔진의 경우는 다를수 있다. 주의 : 파란색 선과 빨간색 선은 같은 깊이에 그려져있다.
오큘러스 리프트(정확히는 모든 3D라고 하는게 맞으려나..?)는 왼쪽눈/오른쪽눈을 따로 렌더링해야된다.
- 왼쪽눈으로 파란색 스프라이트를 볼떄의 거리는 1, 빨간색 스프라이트를 볼떄의 거리는 2이다. 깊이로 치면 파란색이 빨간색보다 앞에 있다.
- 오른쪽눈으로 파란색 스프라이트를 볼떄의 거리는 3, 빨간색 스프라이트를 볼때의 거리는 4이다. 깊이로 치면 빨간색이 파란색보다 앞에 있다.
덕분에 깊이순서대로 렌더링을 하면 양쪽눈을 결과가 다르다. -_-… 아마도 기존의 3D게임에서는 문제가 없엇겠지만 오큘러스에서는 이거조차 문제다.
이걸 고치려면 왼쪽눈과 오른쪽눈의 중심을 기준으로 깊이 정렬을 해서 그 결과를 양쪽눈이 공유해야될거같다. 아마도 엔진에서 렌더링 순서 정렬 관련된 부분을 고쳐야겟지…(하지만 이러면 진짜 z-fighting artifacts를 보게 될거같은데…)
사이클롭스의 비애
위의 이상현상처럼 긴 설명이 필요 없다. 카메라의 view vector 방향으로 두께가 0인 종이를 뒀다고 치자. 그러면 아마도 다음같이 보일것이다.
아무것도 안보인다. 이게 정상이다. 하지만 눈이 2개면 그걸 볼수있다.
역시 눈은 2개가 좋구나!