일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래밍
- CommandList
- 전처리문
- DirectX
- GPU
- swapchain
- 세팅
- Direct Init
- engine
- Direct3D Init
- Input Assembler
- c
- RenderTargetView
- DESC
- 다이렉트X 튜토리얼
- 다이렉트 초기화
- 다이렉트X
- vertex
- 동기화
- 코딩
- Direct3D
- C언어
- View
- DirectX12
- UE4
- C++
- DirectXTK
- CPU
- 다중표본화
- 게임수학
- Today
- Total
목록DirectX12 (42)
비타Cpp
장치를 생성한 다음에는 CPU와 GPU의 동기화를 위한 Fence 객체를 생성한다. 또한, 이후에 필요한 서술자들의 크기도 미리 조회해서 설정해 둔다. 서술자 크기는 GPU마다 다를 수 있으므로, 이처럼 실행 시점에서 적절한 메서드를 호출해서 알아내야 한다. 나중에 서술자 크기가 필요할 때 바로 사용할 수 있도록, 크기들을 적절한 멤버 변수들에 저장해 둔다. ThrowIfFailed(md3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&mFence))); mRtvDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_RTV); mDsvDes..
Direct3D 초기화는 Direct3D 12 장치(ID3D12Device)를 생성하는 것으로 시작한다. 장치(device)는 디스플레이 어댑터를 나타내는 객체이다. 일반적으로는 물리적인 그래픽 하드웨어 장치이지만, 이를 흉내 내는 소프트웨어 디스플레이 어댑터(WARP)도 존재한다. Direct3D12 장치는 기능 지원 점검에 쓰이며, 자원이나 뷰, 명령 목록 등의 다른 모든 Direct3D 인터페이스 객체들의 생성에도 쓰인다. 장치를 생성할 때에는 다음과 같은 함수를 사용한다. HRESULT D3D12CreateDevice( IUnknown *pAdapter, D3D_FEATURE_LEVEL MinimumFeatureLevel, REFIID riid,//ID3D12Device에 해당하는 ID를 넣어야함..
Direct3D의 초기화 과정은 꽤 길지만, 응용 프로그램 실행 시 한 번만 해주면 된다. Direct3D의 초기화 과정은 다음과 같은 단계들로 구성된다. 1. D3D12CreateDevice 함수를 이용하여 ID3D12Device를 생성한다. 2. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다. 3. 4X MSAA품질 수준 지원 여부를 점검한다. 4. 명령 대기열과 명령 목록 할당자, 그리고 주 명령 목록을 생성한다. 5. 교환 사슬을 서술하고 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰를 생성한다. 8. 깊이·스텐실 버퍼를 생성하고, 그와 연관된 깊이·스텐실 뷰를 생성한다. 9. 뷰포트와 가위 판정..
흔히 쓰이는 렌더링 효과 중에는 한 단계에서 GPU가 자원 R에 자료를 기록하고, 다음 단계에서 그 자원 R의 자료를 읽어서 사용하는 식으로 구현하는 것들이 많다. 그런데 GPU가 자원에 자료를 다 기록하지 않았거나 기록을 아예 시작도 하지 않은 상태에서 자원의 자료를 읽으려 하면 문제가 생긴다. 이를 자원 위험 상황(Resurce Hazard)이라고 부른다. 이문제를 해결하기 위해 Direct3D는 자원들에 상태를 부여한다. 새로 생성된 자원은 기본 상태(Default State)로 시작한다. 임의의 상태 전이를 Direct3D에게 '보고'하는 것은 전적으로 응용 프로그램의 몫이다. 이 덕분에, GPU는 상태를 전이하고 자원 위험 상황을 방지하는 데 필요한 일들을 자유로이 진행할 수 있다. 예를 들어 ..
한 시스템에서 두 개의 처리 장치가 병렬로 실행되다 보니 여러 가지 동기화 문제가 발생한다. 이런 문제의 해결책 하나는 GPU가 명령 대기열의 명령들 중 특정 지점까지의 모든 명령을 다 처리할 때까지 CPU를 기다리게 하는 것이다. 대기열의 모든 명령을 처리하는 것을 가리켜 Flush(방출)이라고 한다. 이때 필요한 것이 Fence(울타리)라고 부르는 객체이다. Fence는 ID3D12Fence 인터페이스로 대표되며, GPU와 CPU의 동기화를 위한 수단으로 쓰인다. 다음은 Fence 객체를 생성하는 메서드이다. HRESULT CreateFence( UINT64 InitialValue, D3D11_FENCE_FLAG Flags, REFIID ReturnedInterface, void **ppFence )..
그래픽 프로그래밍에서는 두 가지 처리장치가 작동한다. 하나는 GPU이고 또 하나는 CPU이다. 이들은 병렬로 작동 하지만, 종종 동기화가 필요하다. 하지만 최적의 성능을 위해서는 동기화를 최소화하여야 한다. 동기화는 한 처리 장치가 작업을 마칠 때까지 다른 한 장치가 놀고 있어야 함을 의미하며, 성능에 바람직하지 않다. CPU에는 명령 대기열(Command Queue)가 하나 있다. CPU는 그리기 명령들이 담긴 명령 목록(Command List)을 Direct3D API를 통해서 그 대기열에 제출한다. 여기서 중요한 점은, 일단 Command List의 명령들을 제출했다고 해도, 그 명령들이 GPU에서 즉시 실행하는 것은 아니라는 점이다. GPU가 처리할 준비가 되어있어야 비로소 실행되기 시작한다. 즉..
"DirectX 12를 이용한 3D 게임 프로그래밍 입문" 도서의 연습문제 입니다. 1.다음 정점 구조체를 위한 D3D12_INPUT_ELEMENT_DESC 배열을 작성하라. struct Vertex2 { XMFLOAT3 Pos; XMFLOAT3 Tangent; XMFLOAT3 Normal; XMFLOAT2 Tex0; XMFLOAT2 Tex1; XMFLOAT4 Color;//본문에서는 XMCOLOR지만, 편의를 위해 XMFLOAT4로 변경(XMCOLOR=>ARGB, Direct::Color=>RGBA) }; 해답: mInputLayout = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_..
테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서(세분) 새로운 삼각형들을 만드는 과정을 말한다. 이렇게 세분화하면서 원래 메시에 없는 세부적인 특징을 만들어 낼 수 있다(아래 그림 참고). 테셀레이션은 여러가지의 장점이 있다. 1. 카메라와의 거리에 따라 디테일의 정도를 조절하는 세부 수준(Level-Of-Detail; LOD) 메커니즘을 구현 할수 있다. 이렇게 하면 관찰자가 가깝게 보는 부분만 세부묘사가 들어가 더 많은 삼각형을 효율적으로 사용 가능하다. 2. 메모리에는 저-다각형(Low-Poly) 메시를 담아둬서 메모리를 절약하고 필요할 때만 즉석으로 세분화하여 효율적으로 메모리를 관리할 수 있다. 3. 애니메이션이나 물리 처리 같은 연산들은 Low-Poly메시에서 수행하여 계산량을 줄이고, ..