DirectX11 8

Tiled Resources (2)

텍스처를 타일형 리소스로 만들게 되면 void GetResourceTiling( [in] ID3D11Resource *pTiledResource,// 정보를 가져올 타일형 리소스 [out] UINT *pNumTilesForEntireResource, // 리소스에서 사용하는 총 타일의 수 [out] D3D11_PACKED_MIP_DESC *pPackedMipDesc, // Packed 된 밉맵 정보 [out] D3D11_TILE_SHAPE *pStandardTileShapeForNonPackedMips,// 타일의 텍셀 너비, 높이, 깊이 [in, out] UINT *pNumSubresourceTilings, // 하위 리소스의 타일 수 [in] UINT FirstSubresourceTilingToGet..

DirectX11 2023.07.11

Texture Compression(Block Compression)

블록 압축은 텍스처의 크기를 줄이기 위한 텍스처 손실 압축 기술이다. 상용 중인 엔진의 경우 대부분 텍스처를 임포트하게 되면 텍스처의 사용처에 따라 압축 알고리즘을 설정 할 수 있다. 텍스처의 사용처에 따른 다양한 압축 기법이 있기에, 언리얼의 경우 위와 같이 텍스처의 사용처에 따른 압축을 설정 할 수 있다. DirectX10까지 BC1부터 BC5까지 지원이 되었고 DirectX11로 오면서 BC6H와 BC7이 추가 되었다. 가장 일반적으로 사용되는 방법은 블록 압축 기법이다. 4x4 픽셀을 하나의 block으로 데이터를 압축하는데 그러기 때문에 BCn을 사용하기위 해서는 텍스처는 모든 차원 4의 배수로 생성이 되어야하며 파이프라인의 출력으로는 사용할 수 없다. 하드웨어에서 압축된 데이터를 자동으로 디코..

DirectX11 2023.06.27

GPU Instancing

하나의 매쉬를 그리기 위해서는 매쉬 구성요소와 위치등을 알아야한다. 그렇기에 만약 여러개의 매쉬를 그리게 된다면 매쉬의 위치 값를 매번 업데이트 해주어야 하며, 매번 드로우콜이 발생이 된다. 인스턴싱을 사용하게 되면 똑같은 머티리얼을 사용하는 똑같은 매쉬의 경우 한번의 드로우 콜로 줄이는게 가능해진다. Hardware Instancing 하드웨어 인스턴싱은 인스턴스 인풋 값을 사용하여 인스턴싱을 한다. 일단 정점 셰이더를 만들때 셰이더 리플렉션을 사용해서 인풋 레이 아웃을 만들때 Semantic을 읽어 Instance일 경우에는 인스턴스 인풋으로 만들도록 하였다. void DX11Shader::ReflectInputLayout(ID3D11Device* device, ID3D11ShaderReflectio..

DirectX11 2023.06.22

Voxel GI - Cone Tracing

이전 글에서 3D텍스처에 복셀들의 정보를 기록하는것까지 하였다. 이제 Voxel들로부터 전역 조명을 계산하기 위하여 다음과 같은 순서를 거친다. 1. 픽셀의 세계공간 위치에서 복셀 그리드 좌표로 계산 2. 법선 위의 반구에서 주위로 광선추적을 실행 3. 광선 행진을 할때마다 밉레벨을 증가시키며 복셀을 샘플링 4. 광선을 따라 복셀에 닿으면 샘플링된 값을 축적(알파값이 1에 도달할때까지) 5. 각 원뿔에 대해 이 작업을 수행후 누적된 결과를 광선 수로 나눔 원뿔 추적를 하기 위해서는 일단 세계 공간에서의 좌표를 구하고 주어진 Cone의 방향으로ConeTracing를 실행해주면된다. 계산할 Cone의 수가 많으면 많을 수록 좀더 좋은 품질이 나온다. Cone마다 계산된 값을 모두 더한 후에 평균 값을 구해준..

DirectX11 2023.05.25

Voxel GI - Voxelize

먼저 복셀화의 단계는 다음과 같다. 정점을 입력하고 VertexShader에서 각 정점을 세계공간으로 옮기고 Geometry Shader에 넘겨준다. Geometry Shader은 받은 정점을 복셀 공간으로 옮긴다음 XYZ축에 투영을 하였을 경우 가장큰 넓이를 가지는 축에 프리미티브를 투영한다. 픽셀 쉐이더에서 레스터화된 복셀들에 색과 같은 정보를 기록하여 버퍼에 저장한다. 그런 다음 버퍼에 기록된 데이터를 3D 텍스처에 옮겨 기록한다. https://www.gdcvault.com/play/1019252/PlayStation-Shading-Language-for 그럼 여기서 기하 세이더에서 왜 복셀화를 하기전에 XYZ 축중에 투영 시킬 경우 제일 큰 넓이를 가지는 축을 찾고 그 축에 투영을 하는지에대해 ..

DirectX11 2023.05.25

Cascade Shadow

Cascaded Shadow Maps - Win32 apps | Microsoft Learn Cascaded Shadow Maps - Win32 apps Cascaded shadow maps (CSMs) are the best way to combat one of the most prevalent errors with shadowing perspective aliasing. learn.microsoft.com MSDN에 적힌 이론대로 구현이 가능하다. 기본적으로 렌더링 할 장면을 기준으로 거리에 따라 Light Matrix를 다르게 주어 기하 셰이더를 통해 버텍스를 복사하여 여러장의 그림자 맵을 그리는 것이다. 그렇기에 한번 드로우 콜로 여러장의 그림자 맵을 얻을 수 있다. 그런데 여기서 거리가 멀 수록..

DirectX11 2023.02.16

Shadow Mapping

Shadow Mapping이란 빛의 시점으로 봤을때의 깊이 값과 카메라 시점으로 봤을때의 깊이 값의 차이를 이용하여 그림자를 표현하는 방법이다. 광원 시점으로 봤을 경우의 깊이 값 보다 카메라 시점으로 보았을때의 깊이 값이 클 경우 그림자 안에 있는 것이고 작거나 같을 경우에는 그림자 안에 있지 않는것이다. 그러기 위하여 빛의 시점으로 깊이 버퍼를 그려야한다. 빛을 기준으로 View Projection Matrix를 계산하여야한다. 문제는 Directional Light의 경우는 직교투영을 해주어야 하고 Spot Light와 Point Light의 경우 원근투영으로 Projection Matrix를 계산하여야 한다. // 직교 투영 m_viewTM = XMMatrixLookAtLH(m_LightPos, ..

DirectX11 2022.09.27