본문 바로가기

Library/Computer Graphics

Progressive PhotonMapping : 재작성

그동안 골치를 앓던 프로그레시브 포톤 매핑 렌더러 구현을 끝냈다. 물론, 렌더러 자체를 완전히 바닥부터 구현한 것은 아니다. 이번 일의 주 목적은 렌더러 독자 제작이 아니라, 블로그지기의 3D 그래픽스 라이브러리 테스트였기 때문이다. Toshiya의 PPM(progressive photonmapping) 렌더링 코드를 기반으로 테스트 렌더러를 작성했다. Toshiya의 코드는 glut로 작성되었으며, 레거시 렌더링 컨텍스트(GL rendering context)를 사용하며, OpenGL 3.0 이후의 표준이 아닌 ARB 확장(extensions)을 직접 사용하는 방식을 취하고 있다. Toshiya의 PPM 코드는 PPM 자체에만 중점을 두고 있기 때문에, 그 이외의 구조적인 부분은 땜빵식 코드가 대단히 많다.

애초에는 Native OpenGL 3.3 구현으로 재작성하려고 했지만, 원체 기반 코드가 ARB compatibility 기능을 많이 사용하고 있어서 어쩔 수 없이 레거시 렌더링 컨텍스트에 3.3 GL 함수셋만 사용하는 것으로 타협했다.




특히, Toshiya의 PPM 코드는 프레임버퍼 오브젝트(framebuffer object)와 같은 기술을 활용하고 있는데, 프레임버퍼 오브젝트는 OpenGL 3.0 이후에 표준에 포함된 것이다. 기반 코드는 glut 기반에 GL 확장(*EXT) 을 직접 얻어내어 사용하고 있는데, 새로 재작성한 렌더러는 glut에 의존하는 부분을 대체했으며, 이와 같은 부분을 가능한한 표준으로 대체했다. 즉, Toshiya의 PPM 코드를 재작성한 재작성해 본 것은 새 라이브러리를 테스트하는 성격이 더 컸다고 할 수 있다. 블로그지기의 라이브러리는 OpenGL 런타임에 접근하는 부분과 같은 것을 모두 단위 전략으로 관리하기 때문에, 렌더링 코드가 훨씬 깔끔하고 이식성이 매우 좋다.

씬(scene)은 코넬 박스(cornell box)와 비슷한 모델을 사용한 것이며, 실시간으로 얻은 영상은 아니다. Toshiya의 방법은 해쉬(hash)에 기반하고 있기 때문에 화질이 떨어지지만, 전역 조명 기술 답게 지역 조명 모델보다 훨씬 더 정교한 그림자가 생성되는 것을 볼 수 있다.