본문 바로가기
DirectX11/코드정리

[DirectX11] Skull, Waves 예제

by 마두식 2022. 11. 17.
반응형

※  아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.

 

 

Skull
  • 지금까지의 예제처럼 간단한 기하구조가 아닌 복잡한 기하구조를 사용해야 하는 경우가 있다.

-  유명한 3D 모형 제작 패키지로 만든 모형 파일로부터 3차원 메시를 적재하는 방법(나중에 배움)
-  이번에는 좀 더 단순한 형식의 텍스트 파일에 담긴 메시 자료를 불러오는 방법

 

  • 표준 C++ 파일 입출력 라이브러리를 이용해서 텍스트 파일에서 정점들과 색인들을 읽어 들여서 정점 버퍼와 색인 버퍼에 넣는 코드이다.

 

-  skull 파일은 오른쪽 사진과 같은 형태의 메모장 파일이다.

=>  해골의 각 모든 정점들과 색인들을 저장하고 있는 메모장 파일

 

-  메모장 파일을 읽어와서 필요한 값들만 변수에 담은 후, 정점 버퍼 색인 버퍼를 생성하면 된다.

-  이외 과정은 앞에서 나온 Box 예제와 일치하므로 여기서는 별다른 설명은 하지 않겠다.

-  Box 예제 참고 링크 : [DirectX11] Box 예제 (tistory.com)

 

 

 

Waves
  • 정적 버퍼의 내용은 초기화 시점에서 고정된다.

-  지금까지의 예제들은 모두 정적 버퍼를 사용했다.

 

  • 동적 버퍼의 내용은 실행 시점에서 얼마든지 변할 수 있다.
  • 파도 시뮬레이션에서는 함수 f(x, z, t)에 대한 파동 방정식을 푼다.

-  이 함수는 시간 t에서의 xz 평면의 각 점의 파도 높이를 나타낸다.

-  이 함수를 이용해 파도를 그린다면, 언덕(Hills) 예제에서 했던 것처럼 삼각형들로 구성된 격자 메시의 각 격자점에 f(x, z, t)를 적용해서 각 격자점의 파도 높이를 구하면 된다.
-  언덕 예제와는 달리 이 함수는 t에도 의존하며(파도 표면이 시간에 따라 변하므로), 매끄러운 애니메이션을 위해서는 격자점들에 이 함수를 짧은 시간 간격(ex: 매 1/30초마다)을 적용해야 한다.

 

  • 이처럼 시간의 흐름에 따라 갱신되는 메시를 표현하기 위해서는 동적 정점 버퍼가 필요하다.

-  동적 정점 버퍼가 필요한 또 다른 예는 복잡한 물리 계산과 충돌 검출을 수반하는 입자 시스템이다.

=>  이 경우 매 프레임마다 CPU에서 물리 계산과 충돌 검출을 수행해서 각 입자의 새 위치를 구해야 한다.
=>  입자의 위치가 매 프레임마다 변하므로, 바뀐 입자 위치들을 반영하기 위해서는 동적 정점 버퍼가 필요하다.

 

  • 버퍼를 동적으로 만들기 위해서는 버퍼의 용도를 반드시 D3D11_USAGE_DYNAMIC으로 지정해야 한다.

-  또한 CPU에서 버퍼에 자료를 기록해야 하므로 CPU 접근 플래그를 반드시 D3D11_ACCESS_WRITE로 지정해야 한다.

 

  • 동적 정점 버퍼를 갱신할 때에는 ID3D11DeviceContext::Map 함수로 버퍼의 메모리 블록의 시작을 가리키는 포인터를 얻어서 그 메모리 블록에 자료를 기록하면 된다(6.13절 292p)
  • 버퍼를 다 갱신한 후에는 반드시 ID3D11DeviceContext::Unmap 함수를 호출해야 한다.
  • 동적 버퍼를 사용하면 새 자료를 CPU 메모리에서 GPU 메모리로 전송해야 하므로 약간의 추가 부담이 생긴다.

-  정적 버퍼로도 가능한 일이라면 동적 버퍼보다는 정적 버퍼를 사용하는 것이 바람직하다.

 

  • Direct3D의 최근 버전들에는 동적 버퍼의 필요성을 줄여주는 새로운 기능들이 추가되었다.

1.  간단한 애니메이션은 정점 셰이더에서 수행할 수 있다.
2.  텍스처로의 렌더링 기능 또는 계산 셰이더, 정점 텍스처 조회 기능일 이용하면 앞에서 설명한 것 같은 파도 시뮬레이션을 전적으로 GPU에서 실행하는 것이 가능하다.
3.  기하 셰이더를 이용하면, 예전에는 CPU에서 수행해야 했던 기본도형의 생성 및 파괴 작업을 GPU에서 수행할 수 있다.

 

  • 색인 버퍼도 동적 버퍼로 만들 수 있다.

-  파도 예제의 경우 삼각형 위상구조는 변하지 않고 정점의 높이만 바뀌므로 정점 버퍼만 동적으로 두면 된다.

 

  • 이 예제의 중요한 점은 파도 시뮬레이션의 실제 알고리즘의 세부 사항이 아니라 동적 버퍼의 용법이다.

-  즉 CPU에서 시뮬레이션을 갱신하고 Map과 Unmap을 적절히 사용해서 정점 버퍼를 갱신하는 과정에 초점을 두어야 한다.

 

 

 


 

 

 

개인적으로 이해한 내용을 바탕으로 작성하였기 때문에 틀린 내용이 있을 수 있습니다. 참고하실 때 주의 해주세요.

틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.

감사합니다!

반응형

'DirectX11 > 코드정리' 카테고리의 다른 글

[Directx11] 6장 연습문제(2)  (0) 2022.11.22
[Directx11] 6장 연습문제(1)  (0) 2022.11.17
[DirectX11] Shapes 예제  (0) 2022.11.17
[DirectX11] Hills 예제  (0) 2022.11.17
[DirectX11] Box 예제  (0) 2022.11.17

댓글