일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 동기화
- 다이렉트 초기화
- vertex
- DirectX12
- 게임수학
- DirectX
- engine
- Direct3D
- C언어
- RenderTargetView
- 다중표본화
- 세팅
- GPU
- c
- Direct3D Init
- CommandList
- Direct Init
- DESC
- View
- CPU
- UE4
- 다이렉트X
- C++
- DirectXTK
- Input Assembler
- 코딩
- swapchain
- 전처리문
- 프로그래밍
- 다이렉트X 튜토리얼
- Today
- Total
목록DirectX (18)
비타Cpp
대체로 게임 응용프로그램들은 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)$$ 이러한 공식이 나오는 풀이과정은 아래 그림을 보면 알 수 있다.
Direct3D의 초기화 과정은 꽤 길지만, 응용 프로그램 실행 시 한 번만 해주면 된다. Direct3D의 초기화 과정은 다음과 같은 단계들로 구성된다. 1. D3D12CreateDevice 함수를 이용하여 ID3D12Device를 생성한다. 2. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다. 3. 4X MSAA품질 수준 지원 여부를 점검한다. 4. 명령 대기열과 명령 목록 할당자, 그리고 주 명령 목록을 생성한다. 5. 교환 사슬을 서술하고 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰를 생성한다. 8. 깊이·스텐실 버퍼를 생성하고, 그와 연관된 깊이·스텐실 뷰를 생성한다. 9. 뷰포트와 가위 판정..
IA(Input Assembler) 단계에서는 메모리에서 기하 자료(정점과 색인)를 읽어 기하학적 기본 도형(primitive)을 조립한다.(색인은 정점들을 모아서 기본 도형을 형성하는 방식을 결정한다.) 정점(vertex)은 하나의 점을 의미한다. 하지만 Direct3D에서의 정점은 공간적 위치 이외의 정보를 담을 수 있다. 예를 들어 법선 벡터를 추가하거나, 텍스처 좌표를 추가할 수도 있다. 이를 통해 Direct3D에서는 좀 더 복잡한 효과를 유연하게 적용시킬 수 있다. 정점들은 정점 버퍼(vertex buffer)라고 하는 Direct3D 자료구조 안에 담겨서 렌더링 파이프 라인에 묶인다. 정점 버퍼는 그냥 정점들을 연속적인 메모리에 저장하는 자료구조이다. 정점 버퍼에서 기본도형들을 위한 정점의 ..
벡터 집합 {v0,v1, ... vn-1}의 n개의 모든 벡터가 단위 길이이고 서로 직교일때 그러한 벡터 집합을 정규직교(Orthonormal) 집합이라고 한다. 주어진 벡터 집합을 정규직교 벡터 집합으로 만드는 것을 직교화(Orthogonalization)라고 한다. 간단한 이해를 위해 2차원의 경우 부터 살펴보자. 위의 왼쪽 그림은 벡터 집합 {v0, v1}을 직교화 해서 정규 직교 집합 {w0, w1}을 얻는 과정이다. w0 = v0으로 시작해서, 벡터 v1이 w0과 직교가 되도록 w0의 방향으로 작용하는 부분을 v1에서 뺀다. w1 = v1 - projw0(v1) 이제 서로 직교인 벡터들의 집합 {w0, w1}이 만들어졌다. 마지막으로 w0과 w1을 정규화해서 단위 벡터로 만들면 정규직교 집합이 ..
점곱(dot product)이라고도 부르는 내적(inner product)은 스칼라값을 내는 벡터 곱셈의 일종이다. u = (ux, uy, uz)이고, v = (vx, vy, vz)라고 했을때, 내적은 다음과 같이 정의된다. u · v = uxvx + uyvy + uzvz 다른 말로하면 "내적은 대응되는 성분들의 곱들의 합" 이다. 내적의 기하학적 의미는 코사인 법칙을 적용해보면 알수 있다. u · v = ||u|| ||v|| cosθ θ는 두 벡터 u, v 사이의 0≤θ≤π를 만족하는 각도이다. 따라서 위 식은 두 벡터의 내적이 두 벡터 사이의 각도의 코사인을 벡터 크기로 비례한 것임을 뜻한다. 특히 u,v 둘다 단위 벡터일 때 경우 u · v는 두벡터 사이의 각도의 코사인이다. 이를 통해 내적의 유용..
복잡한 게임은 텍스처, 3차원 메시 등 많은 자원들을 사용한다. 그런데 그 자원들 중 항상 GPU에 상주해 있어야 하는것들은 많지 않다. 즉, 필요한 자원은 GPU의 메모리에 '입주' 시켜야 하고, 반대로 한동안 필요 없는 자원은 GPU의 메모리에서 '퇴거' 시킴으로써 자원의 상주성(Residency)를 관리할 필요가 있다. 예를들어, 게임에서 숲과 숲 속에 있는 큰 동굴이 있을때, 숲에서 동굴안을 표현하는 자원은 필요 없으며, 동굴 안에서도 숲의 자원이 필요 없을때 상주성 관리가 필요하다. 상주성 관리의 핵심은 응용 프로그램이 사용하는 GPU 메모리의 양을 최소화 하는데에 있다. 게임에서 사용되는 모든 자원이 메모리에 들어갈수 없을수도 있고, 다른 응용프로그램도 메모리를 사용 해야 할 수도 있기 때문에..
ID3D12Device::CheckFeatureSupport 메서드는 지원여부를 점검할 수 있는 메서드이다. 이 메서드의 서명은 다음과 같다. HRESULT CheckFeatureSupport( D3D12_FEATURE Feature, void *pFeatureSupportData, UINT FeatureSupportDataSize ); 1. Feature: 이 매개변수는 이 메서드로 지원 여부를 점검할 기능들의 종류를 나타낸다. D3D12_FEATURE 열거형의 다음과 같은 멤버 중 하나를 지정해야 한다. (a) D3D12_FEATURE_D3D12_OPTIONS : Direct3D 12의 여러 기능. (b) D3D12_FEATURE_ARCHITECTURE : 하드웨어 아키텍처 기능들. (c) D3D12..