분류 전체보기 (308) 썸네일형 리스트형 [그래픽스] Depth Map Depth Map은 우리가 보는 시점으로부터 물체로부터 거리를 가지는 Texture다. 안개나 그림자같은 효과를 표현하기 위해 Depth Map이 필요하다. // Depth 전용 desc.Format = DXGI_FORMAT_R32_TYPELESS; desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; ThrowIfFailed(m_device->CreateTexture2D(&desc, NULL, m_depthOnlyBuffer.GetAddressOf())); Depth Map은 다른 shader에 넣어 효과를 표현하기 위함이므로 s.. [그래픽스] 렌더링 엔진 구조 변경 DX12에서는 렌더링할 때 필요한 쉐이더, State들을 PSO(Pipeline State Object)에 담아서 관리한다. DX11에서도 그 방식을 따라 구조를 변경해보도록 하자. class GraphicsPSO { public: void operator=(const GraphicsPSO &pso); void SetBlendFactor(const float blendFactor[4]); public: ComPtr m_vertexShader; ComPtr m_pixelShader; ComPtr m_hullShader; ComPtr m_domainShader; ComPtr m_geometryShader; ComPtr m_inputLayout; ComPtr m_blendState; ComPtr m_depth.. [그래픽스] HDR 파이프라인 PBR을 사용할 때 중요한 요소는 환경맵을 HDRI로 사용하는 것이다. 그말은 조명을 HDR로 사용하겠다는 것이고 결과적으로 전체적인 렌더링을 HDR로 해야 한다. 그러면 렌더링 파이프라인 자체를 HDR로 업그레이드 해줘야 한다. Scene을 래스터라이징을 통해 렌더링을 해서 MSAA Render Target을 만든다. MSAA는 한 픽셀의 여러 샘플을 가지고 있으므로 Resolve를 해서 한 픽셀당 하나의 샘플을 가지고 있는 일반적인 Texture로 만든다. 그런데 이제 UNORM이 아닌 FP (Floating Point) 형태이다. 이걸 가지고 Post Process (이미지 처리) 를 할 수 있다. 그리고 ToneMap을 해서 SDR로 바꿔준다. SDR은 LDR(Low Dynamic Range)과 .. [그래픽스] HDRI(High Dynamic Range Image) HDRI는 일반적으로 허용하는 범위보다 더 넓은 범위를 처리할 수 있는 이미지이다. 기존 이미지의 픽셀 포맷은 R8G8B8A8_UNORM을 사용해서 0~1 사이의 실수로 표현했다. HDRI의 픽셀 포맷은 R16G16B16A16_FLOAT이다. UNORM처럼 0~1 사이의 범위로 제한되지 않고 더 넓은 범위로 표현이 가능하다. 그래서 High Dynamic Range인 것이다. HDRI를 렌더링하기 위해 SwapChain의 픽셀포맷을 R16G16B16A16_FLOAT로 하고 SwapChain과 백버퍼의 픽셀 포맷이 동일하므로 백버퍼를 ResolveSubResource할 때 포맷을 맞춰줘야 한다. 그리고 HDRI를 읽을 때 기존의 32비트짜리 float이 아닌 16비트짜리 float을 사용한다. 이것을 ha.. [그래픽스] Height Map Normal Map을 통해 빛에 따라 텍스쳐가 더 사실적으로 표현할 수 있었는데 Height Map을 이용하면 Vertex 자체에 굴곡을 넣을 수 있다. float height = g_heightTexture.SampleLevel(g_sampler, input.texcoord, 0).r; height = height * 2.0 - 1.0; pos += float4(output.normalWorld * height * heightScale, 0.0); Vertex Shader에서 SampleLevel로 HeightMap의 r값을 가져오면(흑백 텍스쳐이기 때문에 rgb 어떤 값도 가능) height를 구할 수 있다. NormalMap처럼 0~1 범위를 -1~1범위로 바꿔주고 정점의 위치를 normalWorl.. [그래픽스] Normal Mapping Normal Mapping은 PBR에서 필수적으로 사용되는 기술이다. Normal Mapping을 사용하지 않으면 빛에 따라 음영이 지긴 하지만 Texture가 평면이라는 느낌이 든다. 하지만 Normal Mapping을 사용한다면 빛에 따라 훨씬 더 사실적인 질감을 Texture가 가지게 된다. 기존 Texture는 픽셀들이 Interpolation되어 Vertex 4개와 모두 같은 Normal을 가지고 있는데 Normal Mapping된 Texture는 픽셀들이 모두 자신만의 Normal Vector을 가지고 있다. Normal Mapping은 Texture로부터 Normal Vector을 샘플링해오는 것이다. Normal Mapping을 할 때 주의해야 할점은 텍스쳐 좌표계와 렌더링하는 월드 좌표계.. [그래픽스] Mipmap, LOD Mipmap은 레벨에 따라 다른 해상도의 이미지를 사용한다. 샘플러의 Filter에서 MIN, MAG, MIP 을 설정할 수 있다. MIP을 POINT로 설정하면 여러가지 해상도의 이미지 중 하나를 선택해서 레벨에 따라 계단식으로 이미지의 디테일이 결정되고 LINEAR로 하면 그 사이가 선형으로 보간되어 레벨에 따라 더 자연스럽게 이미지의 디테일이 변한다. MAG는 이미지를 크게 표현할 때, MIN은 이미지를 작게 표현할 때 사용하는 필터를 결정하는 것이다. Texture2DArray를 이용해 Texture 여러개를 받을 수 있었다. 그 Texture 각각 Mipmap을 생성할 수 있고, Texture 하나의 Mipmap들을 Array Slice라고 부른다. 그리고 같은 레벨의 Mipmap들끼리 묶는 것.. [그래픽스] Hull Shader, Tessellation, Domain Shader Tessellation은 도형을 더 잘게 나누어 상세도를 높여준다. 반대로 도형을 나누는 개수를 줄여 단순하게 표현할 수 있다. 실제로 거리에 따라 가까워지면 도형을 더 잘게 나누어 표현하고 멀면 단순하게 표현하는 기법이 있는데 이것을 LOD(Level Of Detail)라고 한다. 저번에 본 그림인데, Tessellation을 진행할 때 Hull Shader과 Domain Shader을 같이 진행한다. 도형을 잘게 나눌 때 그 작은 도형들을 하나하나 다 그리기는 어려우므로 Control Point라는 것을 이용한다. 위 그림에서 작은 도형 위에 듬성듬성 있는 점들이 Control Point고 그것들로 이루어진 한 면을 patch라고 한다. patch들이 모여 곡면을 이루게 되는데 이 선박껍데기 같은 곡.. 이전 1 ··· 3 4 5 6 7 8 9 ··· 39 다음