저는 음란물을 사용하지 않고 물리적 기반 Deferred Renderer에 필요한 모든 정보를 G-Buffer에 압축하는 방법을 연구하고 있습니다. 렌더 타겟의 양입니다.
지금까지 제가 가지고있는 것은 3 개의 3 파트 벡터 4 개입니다.
- Albedo / Diffuse
- Normal
- 접선
- 위치
및 4 개의 단일 구성 요소
- 금속
- 거칠기
- 높이
- 앰비언트 오 클루 전
순진한 접근 방식은 단일 구성 요소 중 하나를 세 부분 벡터 중 하나를 사용하여 알파 (네 번째) 채널로 묶는 것입니다. 이것이 제가 현재 조사하고있는 부분입니다. 그러나 4 개의 4 채널 완전 정밀도 부동 소수점 렌더 타겟이 “작지 않다는 점을 감안할 때 메모리를 더 많이 인식하기 위해 절반 정밀도와 더 작은 표현을 사용하는 것이 일반적입니다.”
제가 묻고있는 것은 품질을 잃지 않고 얼마나 안전하게 정밀도를 낮출 수있는 부품은 무엇입니까?
답변
우선, G- 버퍼에서 위치가 전혀 필요하지 않습니다. 픽셀의 위치는 카메라 설정과 픽셀의 화면 공간 xy 위치를 알고 깊이 버퍼에서 재구성 할 수 있습니다. 따라서 제거 할 수 있습니다. 그 전체 버퍼.
또한 일반적으로 G 버퍼에 탄젠트 벡터가 필요하지 않습니다. 접선 공간에서 노멀 맵을 변환하고 패럴 랙스 매핑에만 필요합니다. 이는 G 버퍼 채우기 패스 (렌더링하는 메시에서 접선이있을 때) 중에 수행되며 G 버퍼는 표준을 월드 또는 뷰 공간에 저장합니다.
색상, 거칠기 및 금속과 같은 재질 속성은 8 비트 텍스처에서 가져 오기 때문에 일반적으로 G- 버퍼에서 8 비트 값에 불과합니다. AO.
높이도 G 버퍼에 필요하지 않습니다. “높이에 의존하는 일종의 다중 패스 블렌딩을 수행하지 않는 한, 8 비트는 아마도 그것도 충분합니다.
Normal은 8 비트가 아닌 16 비트 값으로 저장되는 것이 좋습니다. Half-float는 괜찮지 만 16 비트 고정 소수점은 모든 방향에서보다 균일 한 정밀도를 제공하므로 훨씬 더 좋습니다 (half-float는 축 근처에서 더 정확하고 축에서 약간의 정밀도를 잃습니다). 또한 팔면체 매핑 을 사용하여 3 개 구성 요소에서 2 개 구성 요소로 줄일 수 있습니다.
그래서 하루가 끝나면 최소한의 G 버퍼는 다음과 같을 수 있습니다.
- 머티리얼 색상 + 메탈릭 : RGBA8
- 팔면체 세계 공간 법선 + 거칠기 + AO : RGBA16
그게 전부입니다! 픽셀 당 12 바이트 만 가능합니다.
또는 법선에 RG16 버퍼를 사용하고 Roughness + AO를 별도의 8 비트 버퍼로 이동할 수 있습니다. 결국 8 비트 또는 16 비트 크기의 G 버퍼 구성 요소가 더 필요할 경우 확장 할 여지가 있습니다.
댓글
- 또한 금속성 이진 값인 경우가 많으며 (정밀도 감소의 영향을 확인하기 위해) 거칠기 그라데이션을 사용하지 않는다고 가정하면 금속성 및 거칠기를 단일 8 비트 채널에 저장할 수 있습니다 (금속성은 1 비트, 거칠기는 7).