전체 글 (308) 썸네일형 리스트형 [DX12] Tessellation Tessellation은 렌더링 파이프라인에서 아직 다뤄보지 않은 Hull Shader, Tesselator, Domain Shader의 과정을 의미한다. 카메라의 거리에 따라 LOD(Level Of Detail)를 통해 Mesh의 폴리곤 수를 늘렸다가 줄이는 것이다. 가장 많이 사용되는 예는 Terrain인데, 멀리 있는 지형도 가까이 있는 나무와 같이 표현한다면 많은 부하가 생길 것이기 때문에 카메라가 멀어지면 간략하게 표현하도록 동적 LOD를 이용한다. Hull Shader과 Domain Shader은 우리가 조작하지만 Tessleator Stage는 조작한 것에 따라 자동으로 생성되는 것이다. // Control Point HS [domain("tri")] // 패치의 종류 (tri, quad, .. [DX12] Shadow Mapping Shadow Mapping은 빛의 위치에 카메라를 두고 그 화면 기준 depth를 저장한다. 그러기 위해 물체들을 대상으로 WVPmatrix를 곱하면 ClipPos가 나오는데 w로 나누면 Projection 좌표계를 구할 수 있고 그 z값이 깊이 값이다. 그리고 장면을 찍는 카메라 기준으로 계산해야 하는데 viewPos에 viewInverseMatrix를 곱해 WorldPos를 구한다. 거기다 빛의 위치 카메라 기준 ViewProjMatrix를 곱하면 또 ClipPos가 나오고 w로 나눠주면 Projection 좌표가 나온다. 범위는 -1~1이므로 0~1인 uv좌표계로 바꿔준다. 첫번째는 Projection 좌표 기준 우리가 찍은 좌표에 대한 빛 위치의 카메라 기준 depth값이고 두번째 uv좌표계는 빛.. [DX12] Instancing Instancing은 똑같은 물체를 그릴 때 사용한다. 정확히는 Vertex, Index, Material, Shader 등이 모두 같을 경우 Instancing을 이용할 수 있다. Instancing을 이용하면 훨씬 빨리 여러개의 물체를 그릴 수 있다. struct InstancingParams { Matrix matWorld; Matrix matWV; Matrix matWVP; }; void InstancingBuffer::Init(uint32 maxCount) { _maxCount = maxCount; const int32 bufferSize = sizeof(InstancingParams) * maxCount; D3D12_HEAP_PROPERTIES heapProperty = CD3DX12_HEAP.. [DX12] Particle System Particle은 특수효과를 표현한다. 예를 들어 스파크가 튈 때 수많은 입자들이 사방으로 퍼지는 것을 표현해야 하는데 이것을 전부 우리가 Mesh를 표현했던 것처럼 Input , 여러 Shader, Rasterize 등을 거쳐서 표현하는 것은 굉장히 많은 연산을 필요로 할 것이다. 그래서 사용하는 것이 Instancing이다. void Mesh::Render() { GRAPHICS_CMD_LIST->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); GRAPHICS_CMD_LIST->IASetVertexBuffers(0, 1, &_vertexBufferView); // Slot: (0~15) GRAPHICS_CMD_LIST->IASetIndexB.. [DX12] Compute Shader Compute Shader은 지금까지 해왔던 Vertex , Index Buffer 입력, VS, Rasterize, PS 의 과정을 거치지 않고 독립적으로 실행된다. CPU의 부담을 덜기 위해 GPU에게 떠넘기는 것이다. CPU에서 RAM, GPU에서 VRAM 끼리 전달 속도는 빠르지만 CPU에서 GPU 속도는 느리기 때문에 GPU가 독립적으로 계산해서 자생하도록 하는 것이다. GPU에서 스레드는 하나의 일감을 의미한다. 그리고 여러개의 스레드들은 하나의 블록으로 관리하고 그 블록들이 또 여러개 모여있다. RWTexture2D g_rwtex_0 : register(u0); // 쓰레드 그룹당 쓰레드 개수 // max : 1024 (CS_5.0) // - 하나의 쓰레드 그룹은 하나의 다중처리기에서 실행 .. [DX12] Deferred Rendering Forward rendering은 모든 빛에 대하여 연산을 하게 되는데 범위가 닿지 않는 Point Light 에 대해서도 연산을 하기 때문에 불필요한 연산이 발생하고 느려질 수 있다. 하지만 Deferred Rendering은 반대로 빛을 연산할 때 물체를 찾아 연산을 한다. 빛의 범위를 Volume Mesh라고 하고 그 안에 물체가 있을 경우에만 빛 연산을 한다. Directional Light일 경우 범위가 따로 없기 때문에 화면 안에 보이는 영역이 Rectangle 형태의 Volume Mesh가 된다. // [Directional Light] // g_int_0 : Light index // g_tex_0 : Position RT // g_tex_1 : Normal RT // Mesh : Rect.. [DX12] Render Target float4 PS_Main(VS_OUT input) : SV_Target { float4 color = float4(1.f, 1.f, 1.f, 1.f); if (g_tex_on_0) color = g_tex_0.Sample(g_sam_0, input.uv); float3 viewNormal = input.viewNormal; if (g_tex_on_1) { // [0,255] 범위에서 [0,1]로 변환 float3 tangentSpaceNormal = g_tex_1.Sample(g_sam_0, input.uv).xyz; // [0,1] 범위에서 [-1,1]로 변환 tangentSpaceNormal = (tangentSpaceNormal - 0.5f) * 2.f; float3x3 matTBN = { inp.. [DX12] Orthographic Projection Orthographic Projection(직교 투영)은 고정된 UI를 만들 때 사용하는 방식이다. 그래서 크기는 사용자의 화면 만큼이 된다. 왼쪽은 스크린을 (-1,-1) ~ (1,1) 사이 그림으로 만들었을 때 x,y의 실제 좌표를 구하는 식이다. 실제 화면의 크기의 절반씩을 곱해주면 화면상 좌표를 알 수 있다. z값은 깊이를 나타내는데 z값에 n이 들어갈 경우 0, f가 들어갈 경우 1이 나온다. 오른쪽은 식을 행렬로 표현한 것이다. array _layerNames; map _layerIndex; 실제로 Orthographic을 사용할 때는 레이어를 만들어 Perspective 레이어와 Orthographic(UI) 레이어를 만들어 관리한다. gameobject마다 자신이 어떤 레이어에 있는지 설정.. 이전 1 ··· 16 17 18 19 20 21 22 ··· 39 다음