2012년 9월 17일 월요일

Spherical Coordinate system based Progressive Mesh loader


2012/09/24 Fully Optimized

2012/09/18

2012/09/17
2012. 9
Visual Studio(C++) 2008 Express Edition
DirectX SDK June 2010 (9.0c)
OpenMP

knot.x 1.68 MB (1,768,573 bytes)
knot.p3d(오리지널 바이너리)  510 KB (522,944 bytes)

샘플 코드는 별도로 공개하지 않겠습니다. 코드는 각 회사 지원시 제출할 예정입니다.
메쉬정보를 구면좌표계로 변환하여, 변환된 Theta, Phi값에 대해 최대값인 (+-)PI값을 심도별로 비트화후 직렬화, 읽어들인 바이트수만큼 표시 가능하게끔 메쉬를 구성합니다.

비트열은 최대값을 PI, 최소값을 -PI값으로 가정한 상태로, PI값으로부터 절반이 되는 값을 의미하는 비트를 채워나갑니다. 프로그램의 폭주를 방지하기 위해 비트수를 한정하도록 코드를 구성하였으며, 이 샘플코드에서는 최대 32비트까지 구성 가능하도록 설정하였고. 실제로 프로그램을 구동하였을때 knot.x의 경우 26비트의 정밀도로 재생이 가능했습니다.

프로그램 구동시 knot.p3d파일이 없을 경우 knot.x파일로부터 새로운 knot.p3d파일을 생성해 캐시합니다. 이후에는 별다른 조작이 없을경우 knot.p3d파일은 삭제되지 않으며, 파일이 유지되고 있을경우 별도 생성 작업을 거치지 않고 캐시된 파일을 사용합니다.

샘플 코드는 효율적인 DirectX환경의 랜더링 환경을 확보하기 위해 OptimizedMesh(DirectX 공식샘플)을 기반으로 작성되었으며, 로더를 포함하는 파서, 직렬화 코드는 모두 직접 작성되었습니다.

통상적으로 메쉬를 프로그레시브 로드가 가능하도록 구성할때는 인덱스의 구성에서 접근을 하는게 일반적인 방법론입니다만, 이 샘플에서는 vertex자체에 대해 프로그레시브 로드가 가능하게끔 만든것이 특징입니다. 인덱스값은 raw값을 사용하고 있기 때문에, 기존의 인덱스 프로그레시브 메쉬를 구성하려고 하였을 시에 별도 적용이 가능할것으로 생각되며, 심도별로 인덱스와 벡터비트를 나누어서 순차적으로 저장했을시 인덱스 및 벡터 데이터를 동시에 프로그레시브 로드가 가능할 것으로도 생각이 됩니다.

이 샘플에서는 벡터 프로그레시브 로더를 작성 했을때의 효과를 명확하게 하기위해 인덱스 프로그레시브 구성은 하지 않았습니다. 최대 26비트(표시상 25은 0~25의 25) 중 15비트에 도달한 시점에서는 최종형과 거의 차이를 느낄수 없는 것을 확인 할 수 있습니다. 모델링 시에 이 포맷을 염두하고 모델링을 하였을 시에 의도적으로 비트수를 줄여 용량의 조절도 가능 할거라 생각됩니다.

데이터의 로드는 18일 시점에서 더블 버퍼링을 적용 시켜 fps를 안정시켰고, 기본적으로 네트워크상에서 조금씩 자료를 읽어오는것으로 가정하여 0.1초 간격으로 10KB씩 읽어들이게끔 소스코드를 구성하였습니다.

내부적으로 Thread, OpenMP(안정성을 이유로 제거), DirectX 9.0c, DXUT등을 사용하고 있습니다.

촬영된 샘플 동영상은 아직 작업중인 화면으로, 최종제출물과는 그 성능이나 동작, 화면구성이 틀릴 수 있습니다.