일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- View
- CommandList
- swapchain
- c
- 다이렉트 초기화
- CPU
- 게임수학
- DESC
- 다이렉트X 튜토리얼
- C언어
- engine
- DirectXTK
- Input Assembler
- vertex
- DirectX12
- 다이렉트X
- 코딩
- 전처리문
- GPU
- RenderTargetView
- Direct3D Init
- Direct3D
- C++
- 다중표본화
- 동기화
- UE4
- 프로그래밍
- DirectX
- Direct Init
- 세팅
- Today
- Total
목록DirectX12 (42)
비타Cpp
GPU가 정점 배열에 접근하려면, 그 정점들을 버퍼라는 GPU 자원(ID3D12Resource)에 넣어 두어야 한다. 정점들을 저장하는 버퍼를 정점 버퍼(Vertex Buffer)라고 부른다. 버퍼는 텍스처보다 단순한 자원이다. 버퍼는 다차원이 아니며, 밉맵이나 필터, 다중 표본화 기능이 없다. 응용 프로그램에서 정점 같은 자료 원소들의 배열을 GPU에 제공해야 할 때에는 항상 버퍼를 사용한다. 정점 버퍼를 생성하려면 D3D12_RESOURCE_DESC를 채우고 ID3D12Device::CreateCommittedResource 메서드를 호출해서 ID3D12Resource객체를 생성한다. Direct3D 12는 D3D12_RESOURCE_DESC를 상속해서 편의용 생성자들과 메서들을 추가한 C++ 래퍼 ..
Direct3D에서는 정점(Vertex)에 공간적인 좌표값과 다른 추가적인 데이터를 부여할 수 있다. 원하는 데이터(특성)를 커스텀 정점 형식(Vertex Format)을 만들려면 우선 그러한 자료를 담을 구조체를 정의해야 한다. 다음은 서로 다른 두 가지 정점 형식의 예이다. Vertex1 구조체 struct Vertex1 { XMFLOAT3 Pos; XMFLOAT4 Color; } Vertex2 구조체 struct Vectex2 { XMFLOAT3 Pos; XMFLOAT3 Normal; XMFLOAT2 Tex0; XMFLOAT2 Tex1; } 정점 구조체를 정의한 다음에는 정점 구조체의 각 필드, 즉 정점의 각 성분으로 무엇을 해야 하는지를 Direct3D에게 알려 주어야 한다. 그러한 정보를 Dir..
지금 까지 만들어진 응용 프로그램 프레임워크를 이용하여 간단한 예제프로그램을 만들어 보자. 이 프로그램의 주된 기능은 부모 클래스인 D3DApp이 대부분 담당하기 때문에 이 예제만의 특별한 코드는 거의 없다. #include "../../_Common/d3dApp.h" class InitDirect3DApp : public D3DApp { public: InitDirect3DApp(HINSTANCE hInstance); ~InitDirect3DApp(); virtual bool Initialize()override; private: virtual void OnResize()override; virtual void Update(const GameTimer& gt)override; virtual void D..
대체로 게임 응용프로그램들은 Win32 메시지를 그리 많이 다루지 않는다. 응용 프로그램 코드의 핵심부는 Win32의 메시지 처리부의 유휴상태(Idle) 처리 도중에 실행된다.(즉, Window 메시지가 없을때.) 그래도 필수적으로 처리해야 할 주요 메시지들이 있긴하다. 예를 들면 게임을 하다가 ALT+Tab을 하여 포커스를 응용프로램이 아닌 다른 프로그램으로 전환할때 게임들이 일시정지된는 경우가 있다. 다음은 예제 프로그램에 있는 메시지 처리부 부분이다. LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { // WM_ACTIVATE는 창이 활성화되거나 비활성화 될때 보내집니다. // 창이 비..
카메라의 이동 회전 방식 중에 중심점으로부터 일정 거리를 반지름으로 하여 구를 그리며 이동하는 방식이 있다. 여기서 카메라가 바라보는 방향은 쉽게 중심점 - 카메라 위치의 단위 벡터를 이용하면 된다. 하지만 카메라의 위치는 조금 생각을 해봐야 한다. 여기서 필요한것은 y축에서의 회전량 phi, x축의 회전량 theta, 마지막으로 반지름(중심점과 카메라의 거리) radius(r)이다. 이 세가지 요소를 이용하여 구하는 카메라의 좌표는 다음과 같다. $$x' = r\times\sin(phi)\times\cos(theta)\\ y' = r\times\cos(phi)\\ z' = r\times\sin(phi)\times\sin(theta)$$ 이러한 공식이 나오는 풀이과정은 아래 그림을 보면 알 수 있다.
게임이나 그래픽 응용 프로그램은 흔히 초당 프레임 수(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를 포함..