TECHARTNOMAD | TECHARTFLOWIO.COM

TECH.ART.FLOW.IO

[주석번역]ADVENTURES WITH DEFERRED TEXTURING IN HORIZON FORBIDDEN WEST 파트-2

jplee 2023. 12. 27. 15:21

엮 보기.
파트 1을 잊으셨다면 먼저 보고오세요.

[주석번역]ADVENTURES WITH DEFERRED TEXTURING IN HORIZON FORBIDDEN WEST 파트-1

역자의 말. 몇 년전 회사에서 경품으로 받은 PS5 를 최근에서야 설치하고 호라이즌 포비든 웨스트를 플레이하고 있습니다. 전작에 비해서 더 밀도 높은 식생처리와 지형의 이끼등을 포함하여 매

techartnomad.tistory.com

 
 

링 버퍼의 버텍스가 인코딩되는 방식에 대해 몇 마디 설명하겠습니다.

이것이 우리가 사용하는 형식입니다. 32바이트 길이입니다. HPOS의 경우 xy를 하프 플로트로 인코딩하지만 정확성을 위해 w는 플로트로 유지해야 하고, zw에서 쉽게 복구할 수 있으므로 전송할 필요가 없습니다. UV는 고정 소수점 16:16으로 저장하지만 일부 UV 래핑을 지원하기 위해 8로 축소합니다. 또한 모션 벡터를 구성할 수 있도록 버텍스 컬러, 노멀, 탄젠트 및 이전 HPOS에 공간이 있으며 16비트도 사용하지 않은 것을 볼 수 있습니다.

따라서 완전히 고정된 형식은 아니며, 일부 셰이더의 경우 특히 최적화를 위해 일부 픽셀 작업을 버텍스 셰이더로 이동하려는 경우 추가 보간이 필요합니다.우리는 UV버텍스 컬러에 애니메이션을 적용하지 않지만, 픽셀당 버퍼 읽기 횟수를 줄이기 위해 버텍스 프로그램에서 읽고 버텍스 포맷으로 배치하는 것이 일반적으로 더 효율적입니다.
그러나 추가 보간을 고려하기 위해 UV버텍스 색상을 수정 형식에서 빼내고 해당 데이터 버퍼를 직접 읽을 수 있도록 허용합니다.
그런 다음 추가 보간을 위해 해당 공간을 재사용합니다.이 방식을 사용하면 최대 5x16비트 추가 보간 슬롯을 지원할 수 있습니다.
현재 슬롯은 하프 플로트 또는 색상 값에 대한 2채널 제곱근 8비트 UNORM 으로 채울 수 있습니다.

지금까지 시스템의 핵심에 대한 정보는 여기까지입니다.이제 이 모든 것이 어떻게 작동하는지 어느 정도 이해하셨기를 바랍니다,제가 꽤 빠르게 진행했고 새로운 개념들을 많이 소개했다는 걸 알고 있습니다.너무 많다고 생각하신다면 저를 믿으셔도 됩니다.

..... 알아요! 저도 절반은 머릿속에 다 담을 수 없죠...

그러니 숲속에 있는 알로이와 함께 잠시 숨을 고르고 이 모든 것이 무엇인지 감상해 보세요 .... 모두 숨 좀 돌렸나요?

이제 시스템에서 성능을 조금 더 끌어올리기 위해 프로젝트 막바지에 추가한 가변 비율 셰이딩 지원에 대해 잠깐 이야기하겠습니다.

지금까지 설명한 방법도 꽤 효율적이지만, 더 빠르게 처리할 수 있는지 알아보고 싶었습니다. 렌더링하는 폴리지의 대부분은 다양한 녹색 음영으로 이루어져 있기 때문에 항상 전체 속도로 셰이딩하는 것은 유리하지는 않습니다.
ROP를 통하지 않고 픽셀 익스포트를 직접 관리하기 때문에 기본적으로 지원하지 않는 하드웨어에서도 가변 속도 셰이딩을 지원하도록 체계를 수정할 수 있었습니다.
마이크로 배치 오프셋에서 비저빌리티 버퍼의 상위 2비트를 훔쳐서 셰이딩 레이트를 인코딩하는 데 사용합니다. 이론적으로는 스크린 스페이스 셰이딩 레이트 텍스처를 통해 이를 구동할 수 있지만, 현재로서는 버텍스 셰이더에서 구동하는 방법을 선택했습니다.
모든 DirectX 티어 1 VRS 셰이딩 레이트를 지원합니다. PS4 베이스에서만 활성화하며, 이득은 장면에 따라 크게 달라질 수 있습니다.

여기에서 멋진 숲 속 장면을 볼 수 있습니다.

이 설정은 정지 상태일 때 VRS의 표준 설정으로, 거리에 따라 1x12x1에서 2x2블렌딩됩니다. 씬에서 디퍼드 텍스처링이 겹치지 않는 경우 약 0.2ms를 단축할 수 있습니다.

하지만 버텍스 셰이더에서 버텍스의 스크린 스페이스 속도를 사용하여 셰이딩 속도를 구동하기 때문에 속도가 빨라지면 모든 것이 2x2를 사용하는 방향으로 블렌딩되므로씬에서는 거의 0.5ms에 가까워지므로 시간이 훨씬 더 절약됩니다.

분류 출력 단계에서는 이 셰이딩 비율 정보를 읽고 QuadSwizzle을 사용하여 함께 셰이딩할 수 있는 픽셀을 빠르게 결정할 수 있습니다. 앞서 언급했듯이 128x128 타일에서 셰이딩할 특정 쿼드를 12비트로 식별하도록 픽셀 명령도 변경합니다.
그런 다음 명령의 상위 4비트를 사용하여 쿼드에서 브로드캐스트해야 하는 픽셀을 식별합니다.

머티리얼에 대한 출력을 수행하는 생성된 셰이더에서 웨이브의 모든 가변 속도 샘플에 대한 결과를 브로드캐스트해야 합니다. 각 스레드가 브로드캐스트해야 하는 샘플을 반복하도록 만들어 순진하게 이 작업을 수행할 수도 있지만, 이는 메모리 친화적이지 않고 성능이 좋지 않습니다.

대신 해야 할 일은 각 웨이브 내에서 작업을 확장하는 것입니다. 모든 샘플을 가져와서 LDS에서 확장된 픽셀 명령 목록을 작성합니다. 이 작업은 웨이브의 픽셀 명령 중 브로드캐스트가 필요한 경우 셰이더 시작 부분에서 수행됩니다. 그런 다음 G-Buffer의 각 UAV에 대한 셰이더 끝에서 이 확장된 작업 목록을 사용하여 브로드캐스트를 수행합니다.

출력을 단일 UAV브로드캐스트하는 코드는 다음과 같습니다.

음영 처리된 결과를 메모리의 최종 원시 형태로 수동으로 변환하고 결과를 LDS캐싱하는 것으로을 시작합니다. 그런 다음 확장된 명령 집합을 반복하여 디코딩하고 각 명령과 관련된 LDS에 저장된 결과를 가져옵니다.
마지막으로, 각 레인은 출력이 정확히 어디로 가야 하는지 파악하고 패킹된 이미지 스토어 내재화를 통해 출력할 수 있습니다.

다음은 생성된 셰이더의 맨 위에 삽입해야 하는 코드의 일부입니다.
LDS에서 이 확장된 픽셀 명령 목록을 생성하기 위해 웨이브의 어떤 차선이 브로드캐스트해야 하는 경우 이러한 확장된 명령을 생성해야 합니다.그런 다음 각 차선에 대해 쿼드의 왼쪽 상단 픽셀과 음영 샘플을 계산할 위치를 파악합니다.
또한 이 차선에 대한 명령이 LDS에서 어디서 시작해야 하는지 파악하고, 출력하고, 타일에서 쿼드의 상대적 위치를 기록합니다. 마지막으로 이 웨이브가 총 몇 개의 픽셀을 출력해야 하는지 계산합니다.

그런 다음 셰이더 끝에서 일반 출력을 위한 빠른 경로와 브로드캐스트 출력 경로 중 하나를 선택합니다.

VRS에 대한 시간은 여기까지입니다. 이제 전체 시스템이 어떻게 작동하는지 살펴보겠습니다.

프레젠테이션 시작 부분의 큰 섀도 캡이 있는 프레임을 살펴보겠습니다. 보시다시피, 이제 섀도와 겹치는 상당히 견고한 연산 작업 블록이 생겼습니다.
사실 이것은 버텍스를 링 버퍼로 변환한 다음 이를 사용하여 화면의 픽셀을 음영 처리하는 10개의 패스로 이루어진 것입니다.

섀도우와 겹치지 않고 그래픽스 파이프에서 픽셀 셰이딩 작업을 실행하면서 버텍스 셰이딩은 컴퓨트 파이프에서 계속 유지하면 모든 것이 멋지게 인터리빙되는 것을 볼 수 있습니다.
이 그림에서 녹색 파면은 픽셀 작업이고 회색 파면은 버텍스 작업입니다.
 

배치에 따라 색상을 지정하는 방식으로 전환하면 동일한 파이프의 모든 다른 배치가 어떻게 잘 섞이는지 확인할 수 있습니다.
 

다음은 몇 가지 씬에서 이 기능이 어떻게 작동하는지 알 수 있는 몇 가지 수치입니다. 먼저 숲 씬을 살펴봅시다. 4K에서 PS5에서 약 1.4ms의 합리적인 이득을 얻을 수 있음을 알 수 있지만, 여기서 진정한 승자는 PS4입니다. 섀도우와 겹치는 부분으로 인해 기본 PS4에서는 거의 2.5ms를 회복하여 꽤 유용하게 사용할 수 있습니다.
 

지오메트리 패스에서 폴리지 셰이딩을 위해 사용하던 작업을 분리하여 디퍼드 텍스처링으로 해결되고 섀도와 겹쳐진 후 프레임에서 해당 작업이 얼마나 효과적으로 시간을 차지하는지 살펴보면 꽤 많은 개선이 이루어지고 있음을 알 수 있습니다.
 

이 초원 씬에서도 숲만큼은 아니지만 좋은 이득을 얻고 있는 것을 볼 수 있습니다.
씬은 버텍스 작업이 너무 많고 컬링이 덜 효과적이기 때문에 PS4가 여전히 큰 승자이지만 PS5도 이득을 보고 있습니다.
 

지오메트리 패스에서 수행하던 디퍼드 텍스처링 작업의 유효 길이를 다시 한 번 살펴보면 여전히 상당한 성과를 거두고 있음을 알 수 있습니다.
 

마지막으로, 시스템이 픽셀 작업으로 오버쉐이딩을 얼마나 줄였는지 확인할 수 있습니다.
 

또한 버텍스 컬링이 얼마나 많은 작업을 잘라내고 있는지도 확인할 수 있습니다.
 

이제 제 이야기는 여기까지입니다. 여러분과 함께한 이 모험의 여정이 즐거웠기를 바랍니다.
새로운 시각으로 폴리지 셰이딩을 살펴본 결과, 픽셀은 처음 시작할 때와 거의 똑같아 보이지만 적어도 프레임 속도 측면에서는 잔디가 조금 더 푸르게 보인다는 점에 동의해 주셨으면 좋겠습니다.....
 

 다음은 버텍스 웨이브 명령을 생성하는 방법에 대한 간략한 설명입니다.버텍스 버퍼를 가져와서 64개의 버텍스 청크로 구성된 64개의 청크 집합인 우버 청크에 얼마나 많은 버텍스 청크가 표시되는지 합산합니다.
또한 어떤 청크가 설정되어 있는지 알려주는 우버 청크당 64비트 마스크를 뱉어냅니다.그런 다음 우버 청크 합계를 사용해 히스토그램 피라미드를 구성하면 작업 항목의 선형 인덱스에서 우버 청크와 그 안에 있는 하위 버텍스 청크의 하위 인덱스로 쉽게 매핑할 수 있습니다.
그런 다음, 우버 청크별로 구축한 64비트 마스크를 사용해 이 자식 버텍스 청크 인덱스를 다시 버텍스 청크의 전역 인덱스로 쉽게 변환할 수 있습니다.모든 마이크로 배치에 대해 디스패치를 수행하고, 마이크로 배치 정보 테이블을 읽고, 방금 설명한 매핑을 사용하여 각 패스에 필요한 버텍스 웨이브의 수를 파악합니다.
CPU에 설정한 마이크로 배치 순서 버퍼를 읽어 마이크로 배치를 처리할 순서를 설명합니다.이 버퍼는 버텍스 웨이브 명령 스트림에서 마이크로 배치 ID가 변경되는 각 위치에 마이크로 배치 ID의 델타를 원자적으로 작성하는 데 사용됩니다.
그런 다음 접두사 합을 사용하여 델타에서 실제 마이크로 배치 ID로 변환합니다.그런 다음 필요한 모든 버텍스 웨이브 명령에 대해 간접 디스패치를 수행하여 마무리합니다,히스토그램 피라미드와 마스크를 마이크로 배치 정보 테이블과 함께 읽고 각 웨이브 명령이 변환해야 하는 버텍스 청크를 찾아서 이 정보를 c에 추가합니다.

<이 슬라이드는 (어리석게도) 44번 슬라이드 바로 뒤에 있던 것을 잘라낸 것인데, 32개 제한으로 인해 이후 다이어그램에서 마스크/카운터 관련 내용을 이해할 수 있습니다>
각 패스에 대해 최대 32개의 배치 그룹을 지원합니다.
배치 그룹은 셰이더와 배치별 데이터는 동일하지만 인스턴스가 다른 배치 집합입니다. 이상적으로는 이 32개 제한이 없는 것이 좋지만 현재 가시성 버퍼 분류 작업의 일부 구조로 인해 발생한 결과물입니다.

셰이딩 작업은 그림자와 병렬로 실행될 것이며, 이상적으로는 컴퓨팅 작업이 실행되는 시간이 그림자가 걸리는 시간과 거의 일치하기를 원합니다. 이렇게 하면 두 워크로드가 최적으로 혼합될 수 있습니다. 어느 한쪽이 다른 쪽보다 훨씬 오래 실행되면 비효율적입니다.
이 이상적인 균형을 맞추기 위해 성능 카운터를 사용하여 마지막 프레임에서 각 작업이 걸린 시간을 파악합니다.

그런 다음 이를 통해 SetComputeShaderControl()의 파라미터를 점진적으로 조정하여 계산 작업의 웨이브 프론트가 생성되는 속도를 변경할 수 있습니다.
일반적으로 섀도 패스가 끝날 때 잘 겹치지 않는 경향이 있는 뎁스 압축 해제가 있기 때문에 계산 작업이 섀도 시간의 약 90%를 차지하도록 목표로 합니다.
또한 계산 작업이 가능한 모든 웨이브 프론트를 사용하지 않도록 조정했지만 오래 실행되는 상황을 피하고 싶습니다. 이는 일반적으로 그림자가 오래 실행되는 것보다 훨씬 더 나쁜 상황입니다.

내용의 끝.


PPT 한글 주석 변경본 링크.

Google Slides 로드 중

Google Slides에서 "AdventuresWithDeferred_McLaren_James.pptx" 파일을 엽니다. 몇 분 정도 소요될 수 있습니다.

docs.google.com

 
PPT 원본 다운로드 링크.
https://d3d3g8mu99pzk9.cloudfront.net/JamesMcLaren/AdventuresWithDeferred_McLaren_James.pptx