일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- UE4
- 전처리문
- DirectX12
- CPU
- CommandList
- DirectXTK
- 게임수학
- Direct3D
- c
- DirectX
- swapchain
- 다이렉트X 튜토리얼
- 다이렉트 초기화
- Direct Init
- 다중표본화
- DESC
- engine
- 세팅
- vertex
- 다이렉트X
- GPU
- Direct3D Init
- Input Assembler
- View
- RenderTargetView
- C++
- C언어
- 프로그래밍
- 코딩
- 동기화
- Today
- Total
목록DirectX12/메모 (17)
비타Cpp
흔히 쓰이는 렌더링 효과 중에는 한 단계에서 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가 처리할 준비가 되어있어야 비로소 실행되기 시작한다. 즉..
테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서(세분) 새로운 삼각형들을 만드는 과정을 말한다. 이렇게 세분화하면서 원래 메시에 없는 세부적인 특징을 만들어 낼 수 있다(아래 그림 참고). 테셀레이션은 여러가지의 장점이 있다. 1. 카메라와의 거리에 따라 디테일의 정도를 조절하는 세부 수준(Level-Of-Detail; LOD) 메커니즘을 구현 할수 있다. 이렇게 하면 관찰자가 가깝게 보는 부분만 세부묘사가 들어가 더 많은 삼각형을 효율적으로 사용 가능하다. 2. 메모리에는 저-다각형(Low-Poly) 메시를 담아둬서 메모리를 절약하고 필요할 때만 즉석으로 세분화하여 효율적으로 메모리를 관리할 수 있다. 3. 애니메이션이나 물리 처리 같은 연산들은 Low-Poly메시에서 수행하여 계산량을 줄이고, ..
카메라의 요소에는 위치와 방향만 있는 것이 아니다. 바로 카메라에 보이는 공간, 바로 절 두체(Frustum; 각뿔대, 끝이 잘린 사각뿔)에 대해 정의해야 한다. 3차원 장면을 2차원의 이미지로 표현하려면, 절두체 안에 있는 3차원 기하구조를 2차원 투영 창으로 투영해야 한다. 이때 3차원의 요소를 2차원의 투영 이미지에서 표현하는 방법 중 하나는 바로 "원근감"이다. 원근감을 나타내기 위해서는 투영을 하나의 소실점을 만들어서 절두체 모양으로 해야 하는데, 이때의 투영을 원근 투영(Perspective Projection)이다. 원근 투영은 아래 그림처럼 표현된다. 3차원 기하구조의 한 정점에서 시점(Eye Point)으로의 직선을 정점의 투영선(line of projection)이라고 한다. 원근 투영..
3차원 장면의 2차원 이미지를 만들어 내려면 장면에 가상의 카메라를 배치해야 한다. 그 카메라는 World에서 관찰자에게 보이는 영역을 결정한다. 그 영역이 바로 응용 프로그램이 2차원 이미지로 만들어서 화면에 표시할 영역이다. 아래 그림에서 나온 것처럼 이런 가상 카메라에 local좌표계를 부여한다고 치자. 이 좌표계는 시점 공간(Eye Space)이나 카메라 공간(Camera Space)라고 부르는 시야 공간(View Space)을 정의한다. 카메라는 이 시야 공간의 Local 좌표의 원점에 놓여서 양의 z 축을 바라본다. x축은 카메라의 오른쪽, y는 카메라의 위쪽 방향이다. 렌더링 파이프라인 후반부 단계들에서는 장면의 정점들을 World 공간이 아니라 이 시야 공간을 기준으로 서술하는 것이 편한 ..
IA(Input Assembler) 단계에서 Primitive를 조립한 후 해당 Vertex들은 VS(Vertex Shader)단계로 넘겨진다. VS단계를 한 개의 Vertex를 받아서 한 개의 Vertex를 출력하는 단계라고 생각하면 된다. 이러한 작업을 화면에 그려지는 모든 Vertex에 대하여 수행이 된다. 개념적으로 아래와 같은 일이 벌어지는 것이다. for(UINT i = 0, i < numVerticesl i++) { outputVertex[i] = VertexShader(inputVertex[i]); } VertexShader함수의 내용은 프로그래머가 구현하여 GPU에 제출한다(HLSL : High-Level Shader Language). 이러한 함수는 각 정점에 대해 GPU에서 실행되기 ..
고형 3차원 물체(3D Primitive)의 기본 구축 요소는 삼각형이다. 예를 들어 삼각형 하나와 팔각형 하나를 Triangle List를 이용해서 구축한다고 할 때 다음은 이에 필요한 정점 배열이다. //사각형 Vertex Quad[6] = { v0, v1, v2,//삼각형1 v0, v2, v3//삼각형2 }; //팔각형 Vertex Octagon[24] = { v0, v1, v2,//삼각형1 v0, v2, v3,//삼각형2 v0, v3, v4,//삼각형3 v0, v4, v5,//삼각형4 v0, v5, v6,//삼각형5 v0, v6, v7,//삼각형6 v0, v7, v8,//삼각형7 v0, v8, v1,//삼각형8 }; 정점 배열과 위 그림을 봤을때, 각 삼각형을 이루는 정점들 중 중복되는 정점들이 ..