본문 바로가기

분류 전체보기

(308)
[DX12] Depth Stencil View Depth Stencil View는 원근감 있는 3차원 공간을 표현할 때 뒤에 있는 물체가 앞에 있는 물체를 가리지 않게 하기 위해 필요하다. 원리는 우리가 보는 화면이 3차원 공간을 찍고 있다고 하면 화면에서 광선을 쏴서 가장 먼저 부딪히는 거리를 값으로 저장한다. 최소 0에서 최대 1이고 값이 1이라면 그 자리에 아무것도 없다고 볼 수 있다. Depth에 대해 알아봤는데 그렇다면 Stencil은 무엇일까? Stencil은 글자나 그림 모양을 오려내고 그 구멍에 물감을 넣어 그림을 찍어내는 기법인데, 깊이 정보 이외에 추가적인 정보를 설정해서 그 정보에 따라 작업을 할 수 있다. void DepthStencilBuffer::Init(const WindowInfo& window, DXGI_FORMAT d..
[DX12] Texture Mapping ComPtr textureUploadHeap; hr = DEVICE->CreateCommittedResource( &heapProperty, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(textureUploadHeap.GetAddressOf())); if (FAILED(hr)) assert(nullptr); ::UpdateSubresources(RESOURCE_CMD_LIST.Get(), _tex2D.Get(), textureUploadHeap.Get(), 0, 0, static_cast(subResources.size()), subResources.data()); GEngine->GetCmdQu..
[DX12] Index Buffer Vertex로 삼각형을 그릴 수 있었는데, 사각형은 어떻게 그릴까? 삼각형 두개를 이어 붙이면 된다. 하지만 그러면 정점 6개를 사용하게 되고 정점이 중복되어 데이터 낭비가 일어난다. 그래서 사용하는 것이 Index Buffer을 섞어 사용하는 것이다. Index Buffer은 중복되지 않은 정점만 뽑고 정점이 연결되는 순서 (indices) 를 저장한다. 예시에서 2나 0이 중복되긴 하지만 많은 데이터를 가지고 있는 정점이 중복되지 않고 정수 1개씩만 중복될 뿐이므로 데이터 낭비가 훨씬 덜하다. vector indexVec; { indexVec.push_back(0); indexVec.push_back(1); indexVec.push_back(2); } { indexVec.push_back(0); in..
[DX12] Root Signature Root Signature 안에 많은 데이터를 담아야할 경우 Table을 담을 수 있다. CD3DX12_DESCRIPTOR_RANGE ranges[] = { CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, CBV_REGISTER_COUNT, 0), // b0~b4 }; CD3DX12_ROOT_PARAMETER param[1]; param[0].InitAsDescriptorTable(_countof(ranges), ranges); 테이블의 형식을 정의하고 (CBV형식을 REGISTER_COUNT만큼 사용하겠다) InitAsDescriptorTable로 테이블 데이터를 RootSignature에 서명한다. // TODO // 1) Buffer에다가 데이..
[DX12] Constant Buffer CPU와 GPU 메모리 계층도이다. Core와 FP에 가까이 있는 메모리일수록 처리 속도가 빠르고 용량이 작다. 그래서 중요한 정보는 레지스터에서 처리하고 우선순위에서 떨어지는 데이터는 램부분에서 처리한다. 레지스터에서 데이터를 처리할 경우 중요한 데이터인만큼 미리 이 공간을 활용하겠다는 Root Signature을 필요로 한다. Root Signature에는 그림과 같이 여러가지 값, 테이블, CBV(Constant Buffer View) 등을 넣을 수 있다. CD3DX12_ROOT_PARAMETER param[2]; param[0].InitAsConstantBufferView(0); // 0번 -> b0 -> CBV param[1].InitAsConstantBufferView(1); // 1번 -> ..
[백준] 7576번 - BFS 토마토 전이 for (int i = 0; i < sero; i++) { for (int j = 0; j < garo; j++) { if (danji[i][j] == 1)//danji: 토마토 박스 { pos = { j,i }; q.push(pos); } } } 익은 모든 토마토들이 전이를 동시에 시작하므로 큐에 익은 토마토들을 넣어준다. void nSearch() { while (q.empty() == false) { pos = q.front(); q.pop(); discovered[pos.y][pos.x] = true; for (int i = 0; i < 4; i++) { Pos next = pos + front[i]; if (!CanGo(next)) continue; if (discovered[next.y][ne..
[알고리즘] 최소 스패닝 트리 - 크루스칼(Kruskal) 알고리즘 스패닝 트리 간선의 수를 최소화 해서 모든 정점을 이용하는 트리이다. N개의 정점이면 최소 N-1개의 간선으로 이루어져 있고 사이클이 발생하면 안된다. 간선의 수 뿐만 아니라 비용까지 계산해서 최단거리를 구하는 것이 최소 스패닝 트리이다. 크루스칼(Kruskal) 알고리즘 지금 이 순간 최선의 답을 선택해 결과를 도출한다. 탐욕적(Greedy) 방법 간선을 간선의 비용이 적은 순서대로 정점개수 - 1 개가 될 때까지 선택한다. 간선을 선택하는 중 사이클이 되면 선택하지 않으며 사이클을 유니온 - 파인드를 이용해 감지한다. https://chanhuiseok.github.io/posts/algo-33/ 알고리즘 - 크루스칼 알고리즘(Kruskal Algorithm), 최소 신장 트리(MST) ## chan..
[알고리즘] 상호 배타적 집합 (Disjoint set), 유니온 파인드 (Union find) 상호 배타적 집합이란 서로 다른 특성을 가지고 공통 원소가 서로 존재하지 않는 집합이다. 집합들끼리 팀을 이룬다고 생각하면 된다. 유니온 파인드라고도 한다. 공통 원소가 존재하는지 확인하는 방법은 각 원소가 포함된 트리의 루트 노드가 같은지 비교하는 것이다. for (int i = 0; i < n; i++) { parent[i] = i; rank[i] = 1; } 먼저 배열을 하나 만들고 자기 자신을 부모로 설정한다. 루트 노드가 자신이고 높이가 1인 트리 n+1개가 만들어진다. int Find(int u) { if (u == parent[u]) return u; return Find(parent[u]); } Find함수는 재귀적으로 루트노드를 반환하는 함수이다. 그런데 함수의 문제점이 있는데 한쪽 방향..