일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- GPU
- 다중표본화
- engine
- vertex
- 세팅
- RenderTargetView
- CommandList
- 코딩
- CPU
- Direct3D
- 다이렉트 초기화
- DirectX12
- C언어
- DirectXTK
- 다이렉트X 튜토리얼
- 다이렉트X
- 프로그래밍
- 동기화
- 전처리문
- DESC
- DirectX
- View
- c
- Direct Init
- Direct3D Init
- Input Assembler
- UE4
- 게임수학
- swapchain
- C++
- Today
- Total
목록DirectX12/메모 (17)
비타Cpp
IA(Input Assembler) 단계에서는 메모리에서 기하 자료(정점과 색인)를 읽어 기하학적 기본 도형(primitive)을 조립한다.(색인은 정점들을 모아서 기본 도형을 형성하는 방식을 결정한다.) 정점(vertex)은 하나의 점을 의미한다. 하지만 Direct3D에서의 정점은 공간적 위치 이외의 정보를 담을 수 있다. 예를 들어 법선 벡터를 추가하거나, 텍스처 좌표를 추가할 수도 있다. 이를 통해 Direct3D에서는 좀 더 복잡한 효과를 유연하게 적용시킬 수 있다. 정점들은 정점 버퍼(vertex buffer)라고 하는 Direct3D 자료구조 안에 담겨서 렌더링 파이프 라인에 묶인다. 정점 버퍼는 그냥 정점들을 연속적인 메모리에 저장하는 자료구조이다. 정점 버퍼에서 기본도형들을 위한 정점의 ..
복잡한 게임은 텍스처, 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..
모니터의 픽셀들이 무한히 작지는 않기 때문에, 모니터에 임의의 선을 완벽하게 표현할 수는 없다. 흔히 '계단현상'이라고 하는 앨리어싱(Aliasing) 효과가 아래의 그림이다. 선을 픽셀들의 배열로 '근사'하다 보면 이런 현상이 생긴다. 삼각형의 변에서도 이와 비슷한 앨리어싱 효과가 나타난다. 이러한 계단현상을 바로잡을 수 있는 기법이 안티앨리어싱(Anti-Aliasing)기법이다. 이러한 기법의 하나가 초과 표본화(Supersampling)이다. 초과 표본화에서는 후면 버퍼와 깊이 버퍼를 화면 해상도보다 4배(가로, 세로 두 배씩) 크게 잡고, 3차원 장면을 4배 크기의 해상도에서 후면 버퍼에 렌더링 한다. 이미지를 화면에 제시할 때가 되면 후면 버퍼를 원래 크기의 버퍼로 환원(Resolving)한다...
렌더링 과정에서 GPU는 자원들에 자료를 기록하거나 자원들에서 자료를 읽어 들인다. Draw() 명령을 호출하기 전에, 먼저 참조할 자원들을 렌더링 파이프라인에 묶어야(Bind) 한다. 이를 가리켜 자원을 파이프라인에 "연결한다(link)" 또는 "바인딩한다"라고 말한다. 하지만 GPU자원들이 파이프 라인에 직접 묶이는 것은 아니다. 실제로 파이프라인에 묶이는 것은 해당 자원을 참조하는 서술자(Descriptor) 객체이다. 서술자 객체는자원을 GPU에게 서술해주는 경량의 자료구조라고 할 수 있다. 이는 하나의 간접층(level of indirection)이다. 이처럼 간접층을 두는 이유는, GPU자원이라는 것이 사실상 범용적이므로, 같은 자원을 렌더링 파이프라인의 다른 단계(Stage) 에서 사용할수 ..
깊이 버퍼(depth buffer)는 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0.0에서 1.0까지의 값으로 0.0은 시야 절두체(View Frustum) 안에서 관찰자에 최대한 가까운 물체에 해당하고 1.0은 시야 절두체 안에서 최대한 먼 물체에 해당한다. 깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대응된다(즉, 후면 버퍼의 i,j번째 원소는 깊이 버퍼의 i,j번째 원소에 대응). 예를 들어 후면 버퍼의 해상도가 1280X1024라면 깊이 버퍼는 1280X1024개의 원소들로 구성된다. 한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해, Direct3D는 깊이 버퍼링 또는 z-버퍼링이라는 기법을 사용한다. 여기서 중요한..
애니메이션이 껌뻑이는 현상을 피하려면 SwapChain을 이용하는 것이 최선이다. SwapChain은 애니메이션의 한 프레임 전체를 화면 바깥의(off-screen) 텍스처에 그린다. 이런 텍스처를 후면 버퍼(back buffer)라고 부른다. 주어진 한 프레임을 위해 장면 전체를 후면 버퍼에 그린다음에는, 그후면 버퍼를 하나의 완전한 프레임으로서 화면에 표시한다. 이렇게 하면 화면을 보는 사용자는 프레임이 그려지는 과정이 나타나지 않고 완성된 프레임만 보이게 된다. 이러한 기법을 이중 버퍼링이라고 부른다. 이중 버퍼링을 효율적으로 구현 하려면 하드웨어로 관리되는 두 개의 텍스처 버퍼가 필요한데, 하나는 전면 버퍼(front buffer)이고 다른 하나는 앞에서 말한 후면 버퍼이다. 화면에는 전면 버퍼에..
2차원 텍스처는 자료 원소들의 2차원 행렬이다. 2차원 텍스처의 용도 하나는 2차원 이미지 라료를 저장하는 것인데, 이때 텍스처의 각 원소는 픽셀 하나의 색상을 담는다. 그러나 이것이 텍스처의 유일한 용도는 아니다. 예를 들어 법선 매핑이라고 하는 고급 기법에서는 텍스처의 각 원소가 색상이 아니라 3차원 벡터를 담는다. 텍스처는 단순한 자료 배열인 것만은 아니다. 텍스처에 밉맵 수준(Mipmap Level)들이 존재할 수 있으며, GPU는 필터링, 다중표본화 등의 특별한 연산을 텍스처에 적용할 수 있다.더 나아가서, 텍스처에 아무 자료나 담을 수 있는 것은 아니다. 텍스처에는 특정 형식(Format)의 자료 원소들만 담을 수 있는데, 구체적인 형식은 DXGI_FORMAT이라는 열거형으로 지정한다. DXG..