전체글 48

6.1 정점(Vertex)

앞에서 말했듯, D3D의 정점에 공간적 위치 이외의 추가적인 자료를 부여할 수 있다. 원하는 자료를 가진 커스텀 정점 형식(vertex format)을 만들려면 우선 그러한 자료를 담을 구조체를 정의해야 한다. struct Vertex1 { XMFLOAT3 Pos; XMFLOAT4 Color; }; 정점 구조체를 정의한 다음에는 정점 구조체의 각 필드, 즉 정점의 각 성부느올 무엇을 해야하는지 D3D에게 알려주어야 한다. 그러한 정보를 D3D에게 알려주는 수단으로 쓰이는 것이 입력 배치 서술(input layout description)이다. https://docs.microsoft.com/ko-kr/windows/win32/api/d3d12/ns-d3d12-d3d12_input_layout_desc?f..

DirectX 2021.12.24

6. 렌더링 파이프라인

3차원 장면의 기하학적 서술과 가상 카메라의 위치 및 방향이 주어졌을 때 현재 가상 카메라에 비친 3차원 장면의 모습에 근거하여 2차원 이미지를 생성하는 데 필요한 일련의 단계들을 렌더링 파이프라인 이라고 한다. 1. 입력 조립기 단계(input assembler, IA) 입력 조립기 단계는 메모리에서 기하 자료(정점과 색인)를 읽어 기하학적 기본도형(primitive)을 조립한다. 정점(vertex)은 기본적으로 두 변이 만나는 점으로 선분의 양 끝 점을 말한다. Direct3D의 정점은 공간적 위치 이외의 정보도 담을 수 있다. 정점들은 정점 버퍼(vertex buffer)라고 하는 특별한 D3D 자료구조 안에 담겨서 렌더링 파이프라인에 묶인다. 하지만 이 정점들로만은 어떤 구조인지(선인지 삼각형인지..

DirectX 2021.12.23

4. 타이머

시간 측정을 위해 이 예제에서는 Windows가 제공하는 성능 타이머(performance timer)를 사용한다. 이를 성능 카운터(performance counter)라고도 한다. 성능 타이머 시간 측정 단위는 '지나간 클럭 틱 수'이다. 성능 타이머로부터 틱 수 단위의 현재 시간을 얻을 때에는 QueryPerformanceCounter()를 사용한다. __int64 currTime; QueryPerformanceCounter((LARGE_INTEGER*)&currTime)); 지나간 틱 수를 얻었으니 초당 틱 수를 얻어야 한다. QueryPerformanceFrequency()를 이용한다. __int64 countsPerSec; QueryPerformanceFrequency((LARGE_INTEGE..

DirectX 2021.12.20

3. Direct3D의 초기화

D3D 초기화 과정은 다음과 같은 단계들로 구성된다. 1. D3D12CreateDevice()를 이용해서 ID3D12Device를 생성한다. 2. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다. 3. 4X MSAA 품질 수준 지원 여부를 점검한다. 4. 명령 큐와 명령 할당자, 주 명령 리스트를 생성한다. 5. 교환 사슬을 서술하고 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 버퍼 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰를 생성한다. 8. 깊이 · 스텐실 버퍼를 생성하고, 그와 연관된 깊이 · 스텐실 뷰를 생성한다. 9. 뷰 포트와 가위 판정용 사각형들을 설정한다. 1. D3D12CreateDevice()를 이용해서 ID3D12Device를 생성한다..

DirectX 2021.12.19

1. 자원 상태 전이

자원에 자료를 다 기록하지 않았거나 기록을 아예 시작하지도 않은 상태에서 자원의 자료를 읽으려 하면 문제가 생기는데 이것을 자원 위험 상황(resource hazard)이라고 부르기로 한다. 이 문제를 해결하기 위해 D3D는 자원들에게 상태를 부여한다. 새로 생성된 자원은 기본 상태(default state)로 시작한다. 이 상태들을 다른 상태로 전환하는 것이 자원 상태 전이다. 자원 상태 전이는 전이 자원 장벽(transition resource barrier)들의 배열을 설정해서 지정한다. 배열을 사용하는 덕분에, 한 번의 API 호출로 여러 개의 자원을 전이할 수 있다. 자원 장벽은 D3D12_RESOURCE_BARRIER_DESC 구조체로 서술된다. CD3D12_RESOURCE_BARRIER ht..

DirectX 2021.12.19

2. CPU와 GPU의 상호작용

그래픽 프로그래밍은 CPU와 GPU를 굴린다. 이들은 병렬로 작동하는데 최대한 본전을 뽑아먹으려면 동기화를 최소화 해야한다. 동기화란 한 처리 장치가 작업을 마칠 때 까지 다른 처리 장치가 놀고있어야 함을 의미하며, 따라서 성능에 바람직하지 않다. 1. 명령 대기열(Command Queue)과 명령 목록(Command List) GPU에는 명령 대기열이 하나 있다. CPU는 그리기 명령들이 담긴 명령 목록을 제출한다. 중요한 점은 명령 목록을 제출했다고 바로 실행되는 것이 아니라는 것이다. 앞선 명령들을 GPU가 처리해야만 그 다음 명령 목록을 처리하기 시작하는다 이 명령을 처리하는 동안 CPU는 놀게된다. 그 반대로 명령 대기열이 비어있으면 GPU는 놀게된다. 용납할 수 없다. CPU고 GPU고 최대한..

DirectX 2021.12.17