짱민영
'Direct X' 카테고리의 글 목록

Direct X

Direct X

[DX12] 정육면체의 정점을 묶고 렌더링해보자!

오늘은~~ 알록달록 정육면체를 렌더링하는 날이었다. 처음으로 메쉬를 렌더링하는 날이니 세팅할 게 정말 많았다. 그래도 이론으로 배운 렌더링 파이프라인의 단계들을 하나 하나 구현한다는 마음으로 수업을 들으니 훨씬 감이 잘 왔다. 오늘은 정육면체를 그리기 위해 입력 조립기 단계, 정점 셰이더 단계, 래스터화기 단계, 픽셀 쎼이더 단계와 출력 병합기 단계를 거칠 것이다! 입력 배치 세팅 우선, 알록달록 정육면체를 그리려면 무엇이 필요할까? 각 정점의 위치와 색상이 필요하다. 위치와 색상을 담은 간단한 구조체 하나를 만들어주었다. struct Vertex { XMFLOAT3 pos; XMFLOAT4 color; }; 이 상태의 데이터를 GPU가 받는다면 각 성분이 어떤 용도인지, 무슨 자료형인지 등등... 하나..

Direct X

[DX12] 로컬 > 월드 > 뷰 > 투영 이론

Local Space => World Space 물체는 모두 자신만의 Local Space를 가지고 있다. 이를 월드상에 적절하게 배치하려면 자표 변경 변환을 수행해야 한다. 이것을 World Transform이라고 부르고 해당 변환 행렬을 World Matrix라고 부른다고 한다. 각 물체를 WorldSpace 기준으로 변환하고 나면, 모든 좌표가 동일한 좌표계를 기준으로 한다. 어떻게 로컬 좌표에서 월드 좌표로 변환할 수 있을까? 월드 좌표 정점 = 로컬 좌표 * 월드 변환 행렬 (Scale * Rotation * Transform) 변환 행렬을 곱해 월드 좌표로 변환할 수 있다. 1학기 때는 이 부분에서 머리를 싸매고 들어도 잘 모르겠어서... 선생님께서 이번엔 간소화해서 가르쳐주셨다. Scale ..

Direct X

[DX12] 렌더링 파이프라인에 대해 알아보자!

수업에서 사각뿔이나 정육면체를 출력하기 전, 렌더링 파이프라인의 각 단계에 대해서 이론적으로 간단히 배우고 코드로 넘어갔다. 이 포스팅에서는 수업에서 배운 렌더링 파이프라인의 각 단계에 대해서 자세히 알아볼 예정이다. 다음 포스팅에서는 오브젝트 그리고, 정육면체 묶어보고, 조명, 그림자맵, 애니메이션... 으악 할 게 너무 많아!!! 렌더링 파이프라인의 개요 렌더링 파이프라인은 카메라에 비친 3차원의 장면을 2차원의 이미지로 생성하는데 필요한 일련의 단계이다. 입력 조립기 단계부터 래스터라이저, 출력 병합기까지 거치면 3차원의 공간을 2차원의 이미지로 표현할 수 있게 된다. 여기서 헐 셰이더, 테셀레이터는 생략이 가능하다고 한다. 나는 렌더링할 때 정점 셰이더, 픽셀 셰이더를 만들어서 도형을 렌더링했다...

Direct X

[DX12] 빈 화면을 렌더링해보자!

드디어 장치 초기화를 끝내고~~ 이제 알록달록... 은 무리라도 단색 화면을 출력할 수 있는 바로 직전 단계까지 왔다! 사실 오늘 포스팅의 궁극적인 목적은 단색 화면 렌더링이 아닌, 렌더링 세팅이다! 매 프레임마다 순서대로 호출되는 DrawBegin, Draw, DrawEnd 함수가 있다. 오늘은 Draw Begin과 Draw End에서 Command List의 명령들을 Queue로 보내고 초기화하며 렌더링할 것이다. 렌더링 전 (Draw Begin) mDirectCmdListAlloc->Reset(); mCommandList->Reset(mDirectCmdListAlloc.Get(), nullptr); 먼저, 할당자를 리셋해주는데 GPU가 할당된 명령을 모두 끝낸 경우에만 리셋할 수 있다. Comman..

Direct X

[DX12] 장치를 초기화 해보자! (3) (RTV, DSV, Viewport)

오늘은 6단계부터 쭉~ 장치 초기화를 끝낼 것이다. Descriptor Heap 이론부터 복습하고 가자. Descriptor Heap 이론 Descriptor 리소스를 설명하기 위한 자료구조이다. 셰이더 혹은 GPU에 리소스를 연결할 경우, 이 리소스가 무엇인지 설명해주어야 한다. 앞서 만든 Command Queue나 SwapChain도 이 때문에 Descriptor를 설정해준 것이다. 실제로 GPU나 셰이더는 Descriptor를 받기 때문에, 여기에는 실제 리소스의 위치도 들어있고 접근 가능하다. Descriptor Heap DX12는 모든 Descriptor에 대해서 테이블을 만든다고 한다. 이를 서술자 힙, 즉 Descriptor Heap이라고 한다. 이 테이블 안에는 Descriptor들이 있다..

Direct X

[DX12] 장치를 초기화 해보자! (2) (Command Object, Swap Chain)

시간이 정말 많이 지나버렸지만... 4번부터 다시 복습해볼 예정이다. Command~ 그리는 명령들을 담고 있는 CPU의 Command List, 그 리스트를 제출할 GPU의 Command Queue를 만들어볼 것이다. 일단~ 만들기 전 다시 복습해보는 Command Queue와 Command List. Command~ 이론 복습 Command Queue 이름 ID3D12CommandQueue 역할 CmdList에서 받아온 명령을 GPU에 제출 생성 ID3D12Device->CreateCommandQueue 작업 완료 전까지 작업에서 참조하는 D3D리소스들이 해제되어서는 안 된다. Command Allocator 이름 ID3D12CommandAllocator 역할 명령리스트에 추가된 명령들을 메모리에 저..

Direct X

[DX12] 장치를 초기화 해보자! (1) (Device, Fence, Desc Size, MSAA)

8일에 수업 받고 13일에 쓰는 DX12 정리. 정말 여전히 머리가 빙빙 돌지만... 2학년 2학기, 처음 배웠을 때는 아무 생각 없이 코드를 따라 쳤다면, 이제는 대충 이게 뭔지는 이해하고 코드를 치는 것 같다. 근데 이게 코드를 이해했다기보다는, DX12의 전체적인 흐름을 이해했다고 보는 게 빠르겠다. 코드는 아직도... 이해가 안 된다. 수업에서 장치 초기화는 이러한 순서로 이루어졌다. 오늘 복습해볼 내용들이다. Device 생성 이름 ID3D12Device 의미 그래픽 카드를 추상화한 객체 사용 Cmd List, Cmd Queue, Committed Resource, Swap Chain 등을 만들 때 사용된다. 생성 D3D12CreateDevice 함수 왜 굳이 D3D와 DXGI를 구분한 건지 필..

Direct X

[DX12] DX12 프로그래밍 전 알아야 하는 것들

아니 이게 말이 돼!?!?!?!?! 수업을 들으면서 울뻔했다. DX12의 기본적인 이론들만 가지고 왔다고 말씀하시는 선생님의 고운 목소리가... 밉게만 들렸다... 내 인생도 이렇게 복잡하진 않으렷다... 다 죽었어 DX12... 이번 겨울방학 특강으로 널 꾸깃꾸깃하게 해주지... 선생님의 PPT를 기반으로 간단하게만 정리해보았다. COM 인터페이스 작년에 ComPtr을 거짓말 안 치고 100번은 친 것 같다는 생각이 들었다. 그만큼 익숙한 이름인데, 정작 정확한 개념은 모르는 친구였다. COM(Component Object Model) 인터페이스는 C++ 클래스로 보아도 무방하다. IUnknown 인터페이스를 상속받고 있다. new와 delete를 사용하여 생성, 삭제할 수 없고 별도의 API 함수를 ..