Direct3D의 그리기 연산2

1 minute read

Direct3D의 그리기 연산2

프레임 자원

매 프레임 CPU가 수정해야 하는 자원을 말한다.

CPU와 GPU의 동기화로 인해 할일 없이 시간을 허비하는것을 막기 위해 프레임 자원을 순환 배열로 관리한다.

CPU는 GPU가 이전 프레임을 처리하는 동안 다음 프레임 자원을 갱신하여 GPU가 쉬지 않도록 만든다.

렌더 항목

하나의 완전한 그리기 호출 명령을 렌더링 파이프라인에 제출하는데 필요한 자료 집합(상수버퍼, 정점, 색인, geometry 등을 포함)

패스별 상수 버퍼

하나의 렌더링 패스전체에서 변하지 않는 상수 자료를 저장하는 버퍼

시점 위치, 시야행렬, 투영행렬, 화면 크기와 같은 정보를 저장한다.

여분의 자료 제공 비용이 낮기 때문에 지금 사용하지 않는 자료도 같이 담아두는 것이 편하다.

패스별 상수 버퍼에 자료를 담고 나면 물체별 상수 버퍼에는 해당 물체와 연관된 상수들만 담게된다.

갱신 빈도에 따라 버퍼를 구분하면 해당하는 자료들이 변경될때만 변경하면 된다.(불필요한 갱신을 줄일 수 있음)

도형 기하구조

타원체, 구, 원기둥, 원뿔을 GeomertyGenerator 클래스를 이용하여 편하게 생성할 수 있다.

MeshData라는 구조체를 가지고 있으며 이 구조체에 정점 목록과 색인 목록을 담을 수 있다.

원기둥은 옆면, 위 마개, 아래 마개로 이루어져있다.

원기둥의 옆면은 고리의 정점들을 생성하여 만든다.

위 마개와 아래 마개는 최상단, 최하단 고리의 정점들로 원을 근사하여 생성한다.

측지구 메시

도형 예제

여러가지의 도형 정보를 하나의 인덱스 버퍼와 정점 버퍼에 저장한다.

인덱스와 정점 각각 하나의 버퍼에 저장하기 위해 offset 변수를 만들어서 적절하게 저장한다.

같은 MeshGeometry를 공유한다.

프레임 자원이 3개이고 렌더 항목이 n개라고 하면, 전체적으로 물체별 상수 버퍼가 3n개, 패스별 상수 버퍼가 3개이다. 따라서 총 3(n+1)개의 상수 버퍼 뷰(CBV)가 필요하다.

루트 서명

루트 서명과 셰이더 프로그램의 조합이 유효한지는 PSO를 생성할 때 검증

CD3DX12_ROOT_PARAMETER

서술자테이블, 루트서술자, 루트 상수

예제 연습

연습 문제 3번 - 두개골 렌더링하기

두개골 모델의 정점과 인덱스가 적힌 텍스트 파일을 로드하여 두개골을 렌더링하였다.

예제에서 원기둥과 구를 그릴때 사용한 MeshGeometry가 아닌 새로운 MeshGeometry를 만들어 해골을 렌더링하였다.

skull