일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DESC
- engine
- C언어
- 동기화
- 다이렉트X 튜토리얼
- swapchain
- 세팅
- 다이렉트X
- 전처리문
- CPU
- C++
- vertex
- c
- CommandList
- 코딩
- UE4
- Direct Init
- 프로그래밍
- Direct3D
- Input Assembler
- DirectX12
- 다이렉트 초기화
- GPU
- DirectX
- Direct3D Init
- 게임수학
- View
- DirectXTK
- 다중표본화
- RenderTargetView
- Today
- Total
목록전체 글 (71)
비타Cpp
게임이나 그래픽 응용 프로그램은 흔히 초당 프레임 수(FPS: Frames Per Second)를 측정한다. 이를 계산하는 방법은 간단하다. 일정 기간 t동안 처리한 프레임 개수를 세어서 변수 n에 저장한다. 그것을 t로 나누면 평균 FPS가 된다. 여기서 t를 1로 지정해두면 사칙 연산중 오래 걸리는 나눗셈을 피해 계산이 가능하다. 다음은 예제로 만든 FPS측정 메서드이다. void D3DApp::CalculateFrameStats() { //해당 코드는 초당 프레임을 계산하고, 1프레임 렌더시 걸리는 시간의 평균을 계산한다. //해당 수치들은 창의 제목표시줄에 추가된다. static int frameCnt = 0; static float timeElapsed = 0.0f; frameCnt++; //1..
Direct3D초기화 Windows 메시지 처리, 응용 프로그램의 Main Window 생성, 메시지 루프실행을 위한 메서드를 제공하는 D3DApp이라는 Direct3D 응용 프로그램의 기반(Base) 클래스를 정의 한다. D3DApp.h #pragma once #if defined(DEBUG) || defined(_DEBUG) #define _CRTDBG_MAP_ALLOC #include #endif #include "d3dUtil.h" #include "GameTimer.h" //d3d12 라이브러리 연결 #pragma comment(lib,"d3dcompiler.lib") #pragma comment(lib, "D3D12.lib") #pragma comment(lib, "dxgi.lib") clas..
애니메이션, 물리 구현 등을 할 때 꼭 필요한 것이 있다. 바로 시간(Time)이다. 애니메이션은 각 프레임간에 경과한 시간(Elapsed Time), 다시 말해 애니메이션의 인접한 두 프레임 사이에 흐른 시간의 양을 측정할 수 있어야 한다. 물리 구현도 마찬가지로 가속도 같은 경우 경과한 시간에 따라 속도가 점점 증감하기 때문에 시간이 필수이다. 이런 시간 값은 프레임과 프레임 사이의 경과 시간을 계산해야 하므로 프레임률이 높은 경우 그에 따른 정밀도가 높은 타이머가 필요하다. 성능 타이머 정밀한 시간측정을 위해, Windows는 성능 타이머(Performance Timer)를 제공한다. 이를 성능 카운터(Performance Counter)라고도 한다. 이를 이용하기 위해서는 Windows.h를 포함..
가위 직사각형(Scissor Rectangle)은 특정 픽셀들을 선별(Culling)하는 용도로 쓰인다. 후면 버퍼를 기준으로 가위 직사각형을 정의, 설정하면, 렌더링 시 가위 직사각형의 바깥에 있는 픽셀들은 후면 버퍼에 래스터화 되지 않는다. 이러한 픽셀 선별은 일종의 최적화 기법이다. 예를 들어 다른 모든 것을 가리는 직사각형 UI 요소가 화면의 특정 영역에 있다면, 그 부분에 있는 3차원 세계의 픽셀들은 처리할 필요가 없다(어차피 그 UI 요소가 가릴 것이므로). 가위 직사각형은 D3D12_RECT라는 구조체로 서술한다. 사실 이 구조체는 가조체 RECT에 typedef를 이용해서 다른 이름을 붙인 것이다. typedef struct _RECT { LONG left; LONG top; LONG ri..
보통은 3차원 장면을 화면 전체에 해당하는 후면 버퍼 또는 창의 클라이언트 영역 전체에 해당하는 후면 버퍼 전체에 그리지만, 필요하다면 3차원 장면을 후면 버퍼의 일부를 차지하는 직사각형 영역에만 그리는 것도 가능하다. 장면을 그려 넣고자 하는 후면 버퍼의 부분 직사각형(Subrectangle) 영역을 뷰포트(Viewport)라고 부른다. 다음은 이 뷰포트를 서술하는데 쓰이는 구조체이다. typedef struct D3D12_VIEWPORT { FLOAT TopLeftX; FLOAT TopLeftY; FLOAT Width; FLOAT Height; FLOAT MinDepth; FLOAT MaxDepth; } D3D12_VIEWPORT; 이 구조체의 처음 네 멤버 변수는 뷰포트 직사각형의 크기를 결정한다...
깊이 버퍼는 그냥 가장 가까운 가시 물체들의 깊이 정보를(그리고 스텐실을 사용하는 경우에는 스텐실 정보도) 저장하는 2차원 텍스처이다. 텍스처는 GPU 자원의 하나이므로, 텍스처 자원을 서술하는 D3D12_RESOURCE_DESC 구조체를 채운 후 ID3D12Device::CreateCommittedResource를 호출하면 깊이·스텐실 버퍼를 생성할 수 있다. D3D12_RESOURCE_DESC구조체의 정의는 다음과 같다. typedef struct D3D12_RESOURCE_DESC { D3D12_RESOURCE_DIMENSION Dimension; UINT64 Alignment; UINT64 Width; UINT Height; UINT16 DepthOrArraySize; UINT16 MipLevel..
Direct3D는 자원 자체를 직접 파이프라인의 단계에 묶지 않는다. 대신 반드시 자원에 대한 뷰(서술자)를 생성해서 그 뷰를 파이프라인 단계에 묶어야 한다. 특히 후면 버퍼를 파이프라인의 출력 병합기(Output Merger) 단계에 묶으려면(그래야 Direct3D가 장면을 후면 버퍼에 렌더링 할 수 있다.) 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 한다. 우선 할 일은 교환 사슬에 저장되어 있는 버퍼 자원을 얻는 것인데, 이를 위해 다음과 같은 메서드를 사용한다. HRESULT IDXGISwapChain::GetBuffer( UINT Buffer, REFIID riid, void **ppSurface ); 1. Buffer: 얻고자 하는 특정 후면 버퍼를 식별하는 색인(교환 사슬에 버퍼가 여러 개 ..
다음으로, 응용 프로그램에 필요한 서술자/뷰들을 담을 서술자 힙을 만들어야 한다. 서술자 힙(Descriptor Heap)은 ID3D12DescrptorHeap 인터페이스로 대표된다. 힙을 생성하는 메서드는 ID3D12Device::CreateDescriptorHeap이다. SwapChainBufferCount에 설정된 개수만큼의 렌더 대상 뷰(Render Target View, RTV)들과 하나의 깊이·스텐실 뷰(Depth/Stencil View, DSV)가 필요하다. 렌더 대상 뷰는 교환 사슬에서 렌더링의 대상이 되는 버퍼 자원을 서술하고, 깊이·스텐실 뷰는 깊이 판정을 위한 버퍼자원을 서술한다. 서술자 힙은 서술자 종류마다 따로 만들어야 한다. 다음은 이 힙들을 생성하는 코드이다. //D3DApp...