개발이야기

DirectX 9로 만든 데모: Nine Balls

하늘흐늘 2022. 8. 14. 21:56
반응형

 

DirectX 9로 만든 데모로 제목은 Nine Balls입니다. 특별한 의미는 없고 9개의 볼이 화면의 중심에 나오기에 제목을 그렇게 지었습니다. 오래 전에 취업용으로 P2P엔진 데모로 만들었던 것이 시작이었습니다.

이 글을 읽은 분들은 프로그래밍 공부 어떻게 하시나여?
이 데모는 간간히 3D 프로그래밍을 공부하면서 배운 것을 응용하여 적용하면서 확장된 데모입니다. 즉 3D 프로그래밍 학습용으로 만든 데모입니다. 서버 프로그래머여서 시간날 때 간간히 공부하다보니 다이렉트X가 9에서 11로 그리고 최근에는 12로 옮겨가는 추세여서 조금은 예전 프로그래밍을 한 거 같은 느낌도 듭니다. 하지만 3D를 공부하면서 느낀 점은 API에 집중하기보다는 관련 알고리즘이나 수학을 공부하는 것이 어떤 API를 사용하는가보다 중요한거 같아 새로운 다이렉트X 버전으로 갈아타기 보다는 그냥 다이렉트X 9를 좀 더 깊게 공부하였습니다. 실제로 이 데모는 과거 유명했던 두 용책(DirectX를 이용한 3D GAME 프로그래밍 입문, 3D 게임 프로그래밍)과 다이렉트X 9 MS 샘플을 공부하고 분석하면서 만든 것입니다. 물론 지금 시작한다면 다이렉트X 11나 12로 만들었을 것입니다. 

이 데모는 다이렉트X 9에 대한 공부를 정리하고 다이렉트X 11로 넘어가기 전에 기록용으로 남기는 것입니다.

데모는 조금 지루할 수 있지만 충실하게 아래와 같은 내용들이 구현되어 있습니다. 데모에서 보면 컵의 쉐이딩이 변경되는 것 같은 것은 구현된 내용과 관련 있습니다. 일부 기억이 나지 않는 것들은 적지 않았습니다.

기본
- 픽킹
- 카메라

메쉬 로더
- X 파일 로더 : 왼쪽 컵
- obj 파일 로더 : 오른쪽 컵

캐릭터
- 스키닝 적용 : 캐릭터 애니메이션(스킨드 메쉬)
- 멀티 애니메이션 : 여러 개의 동작 블렌딩
- 애니메이션에 따른 이벤트 처리 : 걷는 소리

쉐이더
- Simple : 컵의 쉐이딩 변경에서 보임, 쉐이딩이 적용되지 않은 모델 그 자체
- 고로 : 컵의 쉐이딩 변경에서 보임
- 퐁 : 컵의 쉐이딩 변경에서 보임
- HemiSphere : 컵의 쉐이딩 변경에서 보임
- 메탈 : 컵의 쉐이딩 변경에서 보임
- 2D 텍스처 아웃라인 처리 등등
- 메쉬 아웃 라인

쉐도우
- 스텐실을 활용하여 평면에 DX9의 기본 그림자 출력
- 쉐도우맵 구현

지형: 데모에서는 먼 거리의 산으로 표현했습니다.
- HeightMap 구현
- 병렬(멀티프로세싱)처리와 절두체를 이용한 QuardTree 기반의 LOD 적용
>> 데모에서 보면 지형이 거리에 따라 메쉬의 크기가 변경되는게 보입니다.

텍스처
- 멀티텍스처 구현: 고정 파이프라인, 쉐이더 2가지
- 노멀맵 구현: 데모에서 왼쪽 도로, 적용하고 나니 범프맵처럼 보이는 군요
- 텍스처 애니메이션: 데모에서 오른쪽 도로(조금 어색하지만 간단한 물 표현)

포스트 프로세싱
- 흑백
- HDR : MS 샘플을 보면서 만들었는데 화면 결과물이 만족스럽지 않아 동영상에서는 보여주지 않습니다.

오디오
- MS Media Foundation : MP3 디코딩에 사용합니다. 데모에 나오는 소리는 MP3입니다.
- XAudio2 : 소리 출력에 사용됩니다.

2D GUI : 데모 동영상 녹화에서는 보여주는 것을 놓쳤네요 ㅠ.ㅠ
- Dialog
- Button

기타
- 파티클 구현
- 빌보드 구현
- 메시에서 픽킹으로 교차 삼각형 선택
- 절두체 기반의 컬링: 지형, 화면상의 구의 개수 계산
- 3D 글자: 데모에서 회전하는 Nine Balls
- 2D 스프라이트: 데모에서 화면 커서
- FPS 계산
- AMD 기반 고정파이트 라인 스키닝 적용

반응형