전체 글 17

Bloom

Bloom의 다양한 문제점 화면 전체의 밝기에 따라 임계값의 올바르지 못하면 Bloom Flower와 같은 너무 과도하게 밝아지는 현상이 생긴다.Bloom Disasters - The Quixotic Engineer (gangles.ca) Bloom Disasters - The Quixotic EngineerBloom is a shader effect used to simulate the real appearance of very bright light. While it was once considered too hardware intensive for real-time gaming, modern systems with HDR rendering make frequent use of it. So frequ..

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

데이터 읽고 쓰기

도형들을 복셀화한다음 복셀정보를 텍스처에 기록하던 도중 다음과 같이 하고있었다. 그런데 UAV에 데이터를 읽고 쓰기하는 작업이 오버헤드가 읽어날 경우 많이 느린것을 깨달았다. [numthreads(4, 4, 4)] void main(uint3 DTid : SV_DispatchThreadID) { uint3 _id = DTid * 2; [unroll(8)] for (uint i = 0; i > 1; _temp.z = (i && 4u) >> 2; uint3 _wirtePos = _id + _temp; uint _id = Flatten3D(_wirtePos, v..

Programing 공부 2023.05.26

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