Loading…

directx 12 예제

이전에는 CPU GPU 통신에 대해 이야기했습니다. 이제 우리는 GPU CPU 이야기에 관심이 있어요. 우리는 울타리로 그것을 할. 울타리는 정수 값에 지나지 않습니다. 명령 목록을 제출한 후 지정된 값으로 울타리를 설정하는 명령을 큐에 하나 더 추가할 수 있습니다. 우리가 남은 것은 우리의 울타리가 올바른 값을 가지고 있는지 여부를 확인하는 것입니다. 아주 간단하지 않습니까? 먼저 ID3D12Fence 자체 (#12)와 일부 울타리EventHandle (#13)을 만듭니다. 이 핸들은 directx의 일부가 아니라 winapi입니다. ID3D12CommandQueue::Signal() 메서드(#14)를 사용하여 gpu의 울타리에 값을 할당합니다. 첫 번째 매개 변수는 울타리 개체이며 두 번째 매개 변수는 명령 목록이 실행된 후 울타리 밖으로 원하는 값입니다. 다음으로 ID3D12Fence::SetEventOn완성() 방법(#15)을 사용하여 완료시 이벤트를 설정합니다. 울타리 값이 첫 번째 매개 변수와 같으면 이벤트(두 번째 매개변수)가 발생합니다.

WaitForSingleObject() (#16)에서 지정된 시간(경우에 10초)에 대해 이 일이 발생할 때까지 기다리고 있지만 무한할 수 있습니다. 울타리를 호출하는 순간에 이미 원하는 값을 가지고 있으면 WAIT_OBJECT_0이 즉시 반환됩니다. gpu가 상태 머신이라는 것을 아시다시피, 일단 설정되면 상태를 변경할 때까지 동일한 작업을 반복해서 수행합니다. directx 12에서는 전체 gpu 상태(일부 사소한 것 제외)가 ID3D12PipelineState 인터페이스로 표시됩니다. 즉, 와이어프레임및 솔리드에서 동일한 오브젝트를 렌더링하려면 채우기 모드에 따라 다른 2개의 오브젝트를 만들어야 합니다. 상태 만들기는 런타임에서 피해야 하는 무거운 작업입니다. 대신 장면에 필요한 모든 상태를 초기화의 일부로 만들어야 합니다. 명령 큐에 익숙해야 합니다. directx 11 이후로 스왑 체인 개념은 변경되지 않았으며, 스왑 체인 을 만드는 동안 명령 큐를 지정해야 한다는 것이 유일한 흥미로운 점입니다. 여기서 버퍼카운트 변수는 버퍼링된 프레임의 수입니다. 나는 전문가가 아니에요, 컴퓨터 그래픽은 내 취미입니다. 내가 directx 12를 배우기 시작했을 때 나는 이미 directx 11에 매우 편안했지만 전환하기가 여전히 어려웠습니다.

그리고 몇 달의 조사 후에도 나는 아직도 방금 표면을 긁었다는 느낌이 든다. 나는 끊임없이 배우고 있으며이 게시물은 내 생각의 동기화입니다. 나는 복잡한 것들을 설명하려는 시도가 이러한 것들을 더 잘 이해하게 한다는 것을 발견했다. 저에 의해 쓰여진 장인이 유용하다고 생각했습니다. 이제 화면에 아무 것도 표시되지 않을 것이라고 성공적으로 생각한 코드를 컴파일할 수 있습니다. directx를 사용한 프로그래밍의 단점 중 하나는 주전자에서 하나의 삼각형만 렌더링하거나 한 픽셀만 음영처리하는 것과 같은 중간 결과를 가질 수 없습니다. 우리는 단지 검은 화면이나 아티팩트를 찾기 위해 CPU와 gpu 모두에 대한 코드를 많이 작성해야합니다. 상수 버퍼는 모든 프레임마다 업데이트되므로 기본 유형으로 만들 필요가 없습니다. directx 12에서 상수 버퍼의 읽기는 256B로 정렬되어야 합니다.

16 * 4 = 64B가 필요한 float의 4×4 행렬이있는 경우 다음 행렬을 즉시 배치 할 수 없거나 정렬 규칙을 깨고 오류가 발생합니다.