역자의 말.
2015년 5월 부터 2021년 까지 몇 번의 심리스 오픈월드 게임 제작에 참여 할 기회가 있었습니다.
작은 필드(패쇄형 레벨로서 포탈을 통해 레벨 단위로 점프 해서 가는 형식)형 소규모 알피지를 만들때와는 다르게 지형 처리와 풍경 그리고 레벨 전반에 대한 할 것들은 무척이나 많습니다. 특히 고품질, 고디테일을 유지 해야한다는 미션이 있다면 최신 그래픽스 프로그래밍 기술은 거의 다 구현해야 한다고 말 할 수 있겠습니다.
여전히 저는 이러한 개방형 오픈월드이며 Seam 이 없는 무한한 지형 필드에 관심이 많습니다. 심리스 오픈월드만이 AAA 의 필수조건이 되는 것은 아니지만 락스타의 레데리나 호라이즌 제로 던은 물론 완전한 센드박스 형식의 거대한 알피지 게임들을 만들어 보는 것은 모두의 꿈일것이라 믿습니다.
2018년 12월 부터 2년 반동안 개발 참여 했던 오픈월드 게임의 필드는 가로 세로 32키로 정도의 큰 섬 하나를 가지고 있습니다. 이때 엔진팀과 티에이팀은 많은 부분에서 기민하게 협력했습니다. 다시 그 때를 돌이켜보면서 시그라프 2023 에서 발표 된 이 피피티를 복기 합니다.
요약: 이 강연에서는 콜 오브 듀티에서 대규모 지형을 제작하고 렌더링하는 방법에 대해 설명합니다. 이 시스템은 GDC 2015에서 발표된 이전 작업에서 영감을 받아 구축되었습니다. 지형 텍스처를 넘어 가상화 개념을 어떻게 확장했는지에 대해 논의할 것입니다. 또한 저사양 모바일 기기에서 고사양 PC로 시스템을 확장한 방법에 대해서도 설명합니다.
Speaker Bio:
Stephan Etienne은 Activision 소유 스튜디오인 High Moon Studios의 공동 최고기술책임자(CTO)입니다. Stephane은 20년 전에 High Moon Studios에 입사하여 그 기간 동안 14개의 게임을 출시했습니다. 모든 분야에 능통한 스테판은 온라인과 UI를 제외한 툴과 파이프라인을 포함한 거의 모든 게임 시스템에서 일했습니다. 가장 최근에는 콜 오브 듀티 뱅가드부터 콜 오브 듀티에 사용된 가상 텍스처링 시스템을 개발했습니다.
안녕하세요, 저는 스테판 에티엔입니다. 저는 아름다운 샌디에이고에 위치한 액티비전 소유의 스튜디오인 하이문 스튜디오에서 일하고 있습니다.
대규모 지형을 렌더링하는 데 사용하는 터레인 기술을 소개하겠습니다.
현재 콜 오브 듀티에서 사용되는 지형 기술은 수년 전 트레이아크의 JT 후커와 제작진이 처음 구현한 것입니다.
JT는 GDC 2021 프레젠테이션 "부츠 온 더 그라운드"에서 콜 오브 듀티 콜드 워 당시의 슈퍼 지형 기술을 소개했습니다.
JT는 슈퍼 지형 제작에 대해 자세히 설명했습니다. 이 프레젠테이션에서 그의 이미지를 일부 차용하겠습니다.
하지만 슈퍼 지형 기술의 여러 측면, 특히 제작에 관한 내용은 자세히 설명하지 않겠습니다.
슈퍼 지형은 사실상 지형 표면의 모음입니다.
이 스크린샷에서 보라색 사각형은 각각 지형 표면입니다. 빨간색 섹션은 각각 관심 지점이며 자체 지형 표면이 있습니다.
지형 표면이 많은 이유 중 하나는 동일한 맵에서 동시에 개발할 수 있도록 하기 위해서입니다.
또 다른 이유는 다양한 디테일을 구현하기 위해서입니다.
지형 표면에는 몇 가지 제한 사항이 있습니다.
지형 표면은 크기를 조정하거나 회전할 수 없습니다. 또한 정사각형이어야 합니다. 이를 통해 코드를 더 간단하고 빠르게 작성할 수 있습니다.
빨간색으로 표시된 지형은 회전되고 정사각형이 아닌 것처럼 보입니다. 이는 나중에 다룰 컷아웃 볼륨을 사용하여 달성할 수 있습니다.
지형 기술에서는 쿼드 트리를 많이 사용합니다.
여러분 모두 쿼드 트리에 익숙하시리라 생각합니다.
각 지형 표면에는 쿼드 트리가 있습니다.
각 노드에는 노드를 렌더링하기 전에 로드해야 하는 버텍스 및 인덱스 버퍼가 저장됩니다.
렌더링할 필요가 없는 노드에는 버텍스 또는 인덱스 데이터가 로드되지 않습니다.
지형 표면에는 높이 맵과 쿼드 트리가 포함됩니다.
쿼드 트리의 각 노드에는 지형 패치가 있습니다.
가장 낮은 수준에서 지형 패치는 모든 정점이 규칙적인 그리드에 배치된 절차적 정점을 사용합니다.
분기에서는 메시 단순화기를 통해 메시를 실행합니다.
메시 간소화기는 버텍스당 2개의 플로트, 즉 X와 Y를 출력하고, 높이 맵을 샘플링하여 Z를 재구성합니다.
이를 통해 적은 수의 버텍스로도 상당한 양의 디테일을 유지할 수 있습니다. GPU는 작은 트라이앵글보다 큰 트라이앵글을 훨씬 선호하기 때문에 시각적 품질뿐만 아니라 성능도 향상됩니다.
지형 패치도 저해상도 메시를 참조합니다.
카메라가 메시에서 멀어질수록 버텍스는 저해상도 메시를 향해 보간됩니다.
카메라가 메시에서 충분히 멀어지고 모든 버텍스가 저해상도 메시로 축소되면 저해상도 메시로 전환합니다.
지형을 제작할 때 아티스트는 종종 컷아웃 볼륨을 사용하여 지형을 원하지 않는 월드 영역을 표시합니다.
저해상도 비스타 지형의 플레이 가능한 영역에 더 밀도가 높은 다른 지형을 위한 공간을 만들어야 할 때 이 방법을 사용하기도 합니다.
또한 동굴을 위해 지면에 구멍을 만들거나 지형 대신 건물을 배치할 때도 사용됩니다.
컷아웃 볼륨은 지형당 하나의 컷아웃 텍스처 맵으로 구워집니다.
컷아웃 텍스처 맵은 메모리 효율이 매우 높습니다. 버텍스당 1비트만 필요합니다.
1바이트는 4개의 버텍스가 2열로 구성된 8개의 버텍스의 가시성 상태를 인코딩합니다.
지형 표면은 지형 레이어라고 하는 머티리얼의 모음으로 만들어집니다.
일반적인 지형 레이어에는 잔디, 모래, 흙 등이 있습니다.
원래 지형 기술을 구현할 때는 각 지형 레이어에 알파 마스크를 사용했습니다.
지형 레이어는 32개만 지원했지만, 알파 마스크를 모두 로드해야 했기 때문에 여전히 엄청난 양의 메모리가 필요했습니다.
또한 셰이더 비용도 예측할 수 없었습니다. 대부분의 픽셀은 하나의 레이어만 사용했을 수도 있지만, 하나의 픽셀을 음영 처리하는 데 32개의 레이어가 모두 사용되는 것을 막을 수 있는 방법이 없었습니다.
게다가 32개는 너무 낮은 제한이어서 이를 늘려야 했습니다.
블랙 옵스 콜드 워에서 트레이아크는 레이어 마스크를 버텍스당 하나의 머티리얼, 줄여서 OMPV라고 부르는 새로운 기법으로 대체했습니다.
OMPV는 픽셀당 단일 바이트를 저장하는 인덱스 맵(빨간색으로 표시됨)과 픽셀당 단일 RGB 값을 저장하는 컬러 맵(인덱스 맵 왼쪽에 표시됨)을 사용합니다.
OMPV를 사용하면 레이어 마스크가 사라지고 색상이 BC1로 압축되므로 메모리를 크게 절약할 수 있습니다.
인덱스 맵은 각 픽셀에서 가장 눈에 띄는 레이어를 기록합니다. 컬러 맵은 사실상 해당 레이어에서 사용해야 하는 색조입니다.
OMPV를 사용하면 여기서 텍셀 T를 음영 처리하기 위해 셰이더 코드가 주변 4개의 버텍스에서 인덱스 및 색상을 수집합니다.
각 버텍스의 기여도를 정의하는 알파 값을 계산합니다.
텍셀 T가 버텍스에 가까울수록 해당 버텍스의 알파 값은 커집니다.
각 버텍스의 인덱스는 지형 레이어를 가리킵니다.
각 정점은 동일한 레이어를 참조할 가능성이 높으므로 알파를 합산하여 중복 레이어의 처리 속도를 높일 수 있습니다.
예를 들어 모든 버텍스가 동일한 레이어를 참조하는 경우, 실제로는 동일한 머티리얼을 4번 샘플링하는 대신 해당 머티리얼을 한 번만 샘플링하는 것이 일반적인 경우입니다.
JT가 GDC 프레젠테이션에서 자세히 설명한 정의되지 않은 조건으로 인해 알파에 2를 곱하고 0에서 1 범위로 클램프합니다.
그런 다음 아티스트가 블렌딩 프로세스를 제어할 수 있도록 아티스트가 작성한 노출 맵을 사용하여 모든 레이어를 블렌딩합니다.
모든 레이어가 동일하지는 않습니다. 레이어는 인덱스에 따라 정렬되며, 인덱스가 가장 낮은 레이어가 기본 레이어이며 절대 블렌딩되지 않습니다. 항상 알파는 1입니다.
하지만 OMPV에는 몇 가지 문제가 있습니다.
첫 번째 문제는 방금 설명한 내용을 구현할 때 발생하는 픽셀화된 모양과 관련이 있습니다.
여기 오른쪽 상단 이미지에서 명확하게 볼 수 있습니다.
이 문제를 해결하기 위해 여기에 표시된 글로벌 256x256 디스토션 맵을 사용하여 UV를 디스토션합니다.
아티스트는 레벨 단위로 디스토션의 진폭과 주파수를 제어할 수 있습니다.
인덱스 및 컬러 맵이 샘플링되기 전에 UV가 왜곡되기 때문에 맵 전체에 대한 설정입니다.
OMPV만의 문제는 아니지만, 지형 레이어가 맵의 넓은 영역에 사용될 경우 타일링 아티팩트가 눈에 띄게 됩니다.
이 문제를 해결하는 방법은 타일 숨김이라는 기술을 사용하는 것입니다.
모든 버텍스에서 해당 버텍스의 월드 위치를 기반으로 무작위 회전을 계산합니다.
이 회전은 0에서 15 범위의 정수이며, 라디안 단위의 각도로 해석됩니다.
타일 숨김은 타일링 아티팩트를 숨기는 데 매우 효과적이지만, 이렇게 추가된 회전으로 인해 중복된 지형 레이어는 동일한 랜덤 회전이 아닌 한 더 이상 병합할 수 없습니다.
위 그림에서 대부분의 버텍스가 잔디 머티리얼을 참조하기 때문에 픽셀을 음영 처리하려면 일반적으로 잔디 머티리얼을 한 번 샘플링해야 합니다.
하지만 타일 숨김 후에는 4개의 버텍스가 서로 다른 회전을 가질 가능성이 높기 때문에 픽셀을 음영 처리하려면 잔디 머티리얼을 4번 샘플링해야 하며, 매번 다른 Uv를 사용해야 합니다.
그래도 시각적 품질 향상은 그만한 가치가 있습니다.
맵의 넓은 영역에 동일한 텍스처를 사용할 때 발생하는 또 다른 문제는 결국 멀리서 볼 때 가장 높은 밉의 모든 디테일이 단일 색상으로 축소된다는 점입니다.
이 문제에 대한 해결책은 Vista Uvs입니다. (역자 주: 제가 자주 사용하는 기법 중의 하나 입니다. )
Vista Uv를 사용하면 샘플링 중인 텍스처를 확대하기 위해 스케일을 축소한 것을 제외하고는 원래 UV 세트와 매우 유사한 두 번째 UV 세트를 계산합니다. 매크로 기여도를 계산하기 위해 알베도 및 노멀을 다시 샘플링합니다.
카메라 거리를 사용하여 일반 기여도와 매크로 기여도를 비교하여 최종 기여도를 계산합니다.
바위와 같은 일부 유형의 콘텐츠에서 Vista Uvs는 멀리서 콘텐츠를 볼 때 흥미로운 디테일을 생성하는 데 효과적입니다.
OMPV의 또 다른 문제점은 한 재질에서 다른 재질로 전환할 때 급격한 전환이 발생한다는 점입니다.
여기에서는 흙에서 모래로 전환할 때 어떤 일이 발생하는지 보여줍니다.
지금까지 사용해온 솔루션은 아티스트가 트랜지션 머티리얼을 수동으로 제작하도록 하는 것이었습니다.
이 방법은 효과는 좋지만 수작업이 많이 필요한 프로세스입니다.
각 트랜지션은 완전히 새로운 텍스처 세트이기 때문에 텍스처 스트리밍 시스템에 부담을 주고 귀중한 메모리를 소모합니다.
우리는 현재 이 문제에 대한 해결책을 구현 중이며, 이를 멀티 레이어 터레인 머티리얼 또는 줄여서 MLTM이라고 부릅니다.
멀티 레이어 터레인 머티리얼은 두 개의 입력 터레인 머티리얼과 두 머티리얼을 블렌딩하는 데 사용되는 임계값이 필요합니다. 블렌딩을 완료하기 위해 대상 머티리얼의 리플레이 맵이 사용됩니다.
본질적으로 포토샵에서 트랜지션을 생성하는 것과 비슷하지만 메모리 비용이 들지 않습니다.
이 모든 작업은 런타임에 수행됩니다. 이렇게 하면 셰이더 비용이 증가하지만 트랜지션 머티리얼은 트랜지션 중에만 사용되므로 괜찮습니다.
가상 텍스처링은 런타임에 매우 큰 텍스처를 에뮬레이션하는 프로세스입니다.
가상 메모리가 실제 메모리보다 훨씬 더 많은 물리적 메모리를 가진 컴퓨터를 에뮬레이트하는 것과 유사하게 가상 텍스처링을 사용하면 다른 방법으로는 불가능한 훨씬 더 큰 텍스처를 에뮬레이트할 수 있습니다.
이 에뮬레이션의 핵심은 두 가지 텍스처입니다:
첫째, 매우 큰 텍스처의 페이지를 담는 물리적 텍스처가 있습니다.
페이지는 에뮬레이트된 텍스처의 작은 정사각형 섹션 또는 그 밉 중 하나입니다.
페이지는 일반적으로 256x256픽셀이지만 원하는 크기로 설정할 수 있습니다.
둘째, GPU가 실제 텍스처에 저장된 샘플 텍스처 데이터로 리디렉션할 수 있는 충분한 정보를 담고 있는 방향 텍스처가 있습니다.
방향 텍스처의 단일 픽셀은 물리적 텍스처의 한 페이지를 가리킵니다.
예를 들어 256x256 페이지의 4K*4K 물리적 텍스처에 2K*2K 방향 텍스처를 곱하면 512K*512K 텍스처를 에뮬레이트하는 데 사용할 수 있습니다.
에뮬레이트된 텍스처는 머티리얼 및 기타 드로잉 프리미티브의 절차적 구성의 결과이기 때문에 가상 텍스처를 절차적 가상 텍스처라고도 합니다.
이 프레젠테이션에서는 절차적이라는 표현을 생략했지만 에뮬레이트된 텍스처는 복잡한 블렌딩 프로세스의 결과이며 디스크에 존재하지 않는다는 점을 기억하는 것이 중요합니다.
가상 텍스처는 크기 때문에 GPU에 맞지 않는 큰 텍스처를 에뮬레이트하는 데 효과적입니다.
하지만 여전히 작아서 거대한 텍스처를 에뮬레이트하기에는 부족합니다.
예를 들어, 이전 슬라이드의 512K x 512K 가상 텍스처는 인치당 25픽셀의 해상도에서는 약 0.3 x 0.3마일만 커버할 수 있습니다.
훨씬 더 큰 가상 텍스처를 위해 Ubisoft의 Ka Chen은 GDC 2015 프레젠테이션에서 어댑티브 버추얼 텍스처링을 제안했습니다.
이제부터는 어댑티브 버추얼 텍스처링을 AVT로 줄여서 부르겠습니다.
AVT는 최대 24 밉으로 텍스처를 에뮬레이트할 수 있습니다.
인치당 25픽셀의 해상도에서는 10.6×10.6마일 영역을 커버하기에 충분합니다.
핵심적으로, 세계는 가로 210×세로 210피트 크기의 섹터로 분할됩니다.
각 섹터는 본질적으로 일반적인 가상 텍스처인 가상 이미지에 의해 관리됩니다.
이 가상 이미지의 크기는 동적입니다. 카메라 거리에 따라 달라집니다. 이것이 바로 적응형 가상 텍스처링이라고 불리는 이유입니다.
가상 이미지의 최대 밉은 16밉입니다.
16밉을 사용하면 인치당 25픽셀의 해상도로 210×210피트 면적을 커버할 수 있습니다.
카메라 주변의 섹터만 활성화됩니다. 최대 255개의 섹터만 지원합니다.
전 세계를 커버하는 기본 섹터도 있습니다.
기본 섹터는 항상 16밉스 가상 이미지를 사용합니다.
이 비디오에서는 가상 이미지가 생성되는 과정을 볼 수 있습니다.
화면 왼쪽 상단의 사각형은 방향성 텍스처를 표현한 것입니다. 가로 512×세로 512픽셀에 불과합니다.
옅은 녹색의 기본 섹터가 왼쪽 상단을 차지합니다.
가상 이미지는 이 방향 텍스처에서 스스로 공간을 할당합니다.
지형을 음영 처리하는 데도 동일한 색 구성표를 사용하여 어느 섹터가 제어하는 지형 영역을 확인할 수 있습니다.
섹터에 가까워지면 가상 이미지가 점점 커지는 것을 볼 수 있습니다. 섹터에서 멀어지면 가상 이미지가 축소됩니다.
가상 이미지 쿼드 트리는 GPU에서 사용할 수 있는 페이지를 추적하기 때문에 일반 쿼드 트리보다 더 복잡합니다.
쿼드 트리의 분기를 확장할 때 일부 자식 노드에는 자체 페이지가 없을 수 있습니다. 따라서 부모 페이지를 가리켜야 합니다.
이 그림이 이를 설명합니다.
예를 들어, 깊이 1에서 루트 페이지의 자식은 페이지가 있으므로 갈색의 자식을 만들어야 했기 때문에 확장되었습니다. 다른 3개의 자식은 단순히 부모 페이지를 참조합니다.
매 프레임마다 GPU가 사용할 수 있는 페이지가 준비되거나 그 반대의 경우 페이지를 사용할 수 없게 될 수 있습니다.
새 페이지가 합성되면 쿼드 트리는 다음 프레임까지 업데이트되지 않습니다. 이는 페이지가 합성되는 동안 GPU에 페이지 사용을 시작하라고 지시하는 위험을 감수할 수 없기 때문입니다.
페이지가 요청되지 않으면 캐시에서 노화됩니다. 쿼드 트리에서 제거되지만 최소 3프레임 동안은 페이지가 재활용되지 않도록 보장합니다. 이는 GPU가 재활용 중인 페이지를 사용하지 않도록 보장하기에 충분합니다.
쿼드 트리의 CPU 버전은 GPU가 그대로 사용하기에는 너무 복잡합니다.
그래서 대신 쿼드 트리를 방향성 텍스처로 구워냅니다.
매 프레임마다 게임은 이전 프레임 쿼드 트리와 현재 프레임 쿼드 트리 사이의 델타를 계산합니다.
이는 명령으로 변환되어 컴퓨트 셰이더에 의해 처리되고, 이 컴퓨트 셰이더가 방향 텍스처를 업데이트합니다.
여기 그림은 GPU의 관점에서 CPU 쿼드 트리가 어떻게 보이는지 보여줍니다.
카메라가 섹터에 가까워지면 게임에서 새 밉을 추가해야 한다고 판단할 수 있습니다.
먼저 메인 방향 텍스처에서 더 큰 서브 방향 텍스처를 할당합니다.
그런 다음 프레임별로 방향 텍스처를 업데이트하는 데 사용한 것과 동일한 프로세스를 사용하여 이를 채웁니다.
카메라가 더 멀리 이동하면 그 반대의 프로세스가 진행됩니다.
즉, 방향 텍스처에서 밉이 제거됩니다.
방향 텍셀은 물리적 페이지의 좌표를 제공하는 32비트 값입니다.
또한 페이지의 밉 레벨과 쿼드 트리 너비를 지정합니다.
이 모든 정보는 섹터 Uvs에서 물리적 페이지 Uvs로 전환하는 데 필요합니다.
여기 코드 스니펫은 섹터 Uvs를 물리적 페이지 Uvs로 변환하는 방법을 보여줍니다.
게임 내에서 방향성 텍스처를 디버깅하고 시각화하는 데 도움이 되는 툴이 있습니다.
그 모습은 다음과 같습니다.
지형의 각 사각형은 알베도 색상으로 해석된 32비트 방향성 픽셀입니다.
일반적으로 이 사각형은 실제 페이지로 채워집니다.
지형은 프리패스와 불투명 패스 중에 모두 렌더링됩니다.
프리패스 중에 지형은 뎁스 버퍼와 슈퍼 지형용으로 예약된 스텐실 비트에 기록됩니다. 또한 지오메트릭 노멀을 G 버퍼에 씁니다.
불투명 패스 동안 지형은 전체 화면 쿼드를 사용하여 지연 렌더링됩니다. 스텐실 비트가 설정된 모든 픽셀은 가상 텍스처에서 샘플링하여 현재 픽셀을 음영 처리합니다.
버추얼 텍스처링의 핵심적인 측면은 GPU에 의해 구동된다는 점입니다.
불투명 패스가 진행되는 동안 모든 픽셀에 음영을 입히면서 실제 페이지를 사용할 수 있었다면 사용했을 물리적 페이지도 계산합니다.
이 정보는 피드백 버퍼에 저장됩니다.
피드백 버퍼는 3프레임 후에 CPU에서 다시 읽습니다.
해상도는 240 x 136픽셀이지만 저사양 하드웨어에서 더 작은 해상도의 피드백 버퍼를 연구하고 있습니다.
성능상의 이유로 스레드 동기화가 없습니다.
각 지형 픽셀은 불투명 패스 중에 피드백 버퍼에 32비트 값을 씁니다.
사용하려는 가상 텍스처의 밉 레벨, 픽셀의 섹터 ID, 사용하려는 방향성 텍스처 쿼드 트리 노드의 쿼드 트리 좌표를 씁니다.
피드백 버퍼에서 가장 어려운 부분은 밉 레벨입니다. 밉 레벨은 UV 그레이디언트를 보고 계산합니다. 위의 코드 스니펫은 우리가 하는 일을 보여줍니다.
GPU가 피드백 버퍼에 쓰기를 완료하면 CPU가 이를 다시 읽습니다.
피드백 버퍼의 해상도가 240 x 136이므로 약 32000개의 값을 처리한다는 뜻입니다.
먼저 모든 고유 값을 계산합니다.
그런 다음 자식 수를 부모에게 전파합니다. 이는 자녀의 조회수가 충분하지 않은 경우 부모가 조회수를 채울 수 있도록 하기 위함입니다.
그런 다음 인기도를 기준으로 정렬합니다. 가장 많이 요청된 페이지가 먼저 합성되기를 원합니다.
섹터의 루트 페이지에 편향을 두어 한 섹터가 표시되는 경우 해당 섹터에 대한 페이지가 최소 1개 이상 표시되도록 합니다.
또한 카메라 속도에 따라 고해상도 페이지에 편향성을 부여합니다.
피드백 버퍼가 동기화되지 않은 스레드로 업데이트되면 노이즈가 발생할 수 있습니다. 저희는 페이지 합성을 하지 않는 임계값을 사용하여 이 문제를 해결합니다.
때때로 임계값에 가까운 페이지가 한 프레임에서는 임계값을 초과하고 다음 프레임에서는 임계값을 밑돌 수 있습니다. 따라서 이미 표시된 페이지는 시각적 아티팩트를 피하기 위해 구출합니다.
또한 이탈을 방지하기 위해 캐시에 있는 총 페이지 수의 1/3을 초과하여 요청하지 않습니다.
제가 설명한 모든 것에도 불구하고 때때로 저해상도 VT를 볼 수 있습니다.
예를 들어 카메라를 한 방향으로 향하게 한 후 옆으로 돌려서 화면에 요청된 콘텐츠로 캐시를 채운 다음 카메라가 180도 빠르게 회전하여 그 뒤에 무엇이 있는지 확인하면 새 페이지가 캐시에 추가되는 데 몇 프레임이 걸립니다. 이는 상당히 눈에 띄는 현상일 수 있습니다.
해결책은 각 섹터에서 가장 가까운 중간 해상도 페이지를 선택하여 요청된 페이지 목록에 추가하는 것입니다.
저희는 종종 카메라 텔레포트 또는 매우 빠른 카메라 전환(예: 플레이어가 장비를 고르는 하늘에서 플레이어가 실제로 스폰되는 지상으로 전환)을 수행합니다. 게임에서는 항상 카메라가 어디로 순간이동할지 알려주므로 대상 위치에 적합한 콘텐츠를 스트리밍할 수 있습니다.
AVT는 여기에 편승하여 중간 해상도 페이지도 생성합니다.
가상 텍스처링은 본질적으로 캐시입니다. 일반적으로 캐시는 최신 데이터로만 채우려고 합니다. VT가 페이지를 합성하려면 페이지가 합성되기 전에 해당 페이지에 필요한 모든 밉이 로드되었는지 확인해야 합니다.
안타깝게도 저장 장치가 느린 하드웨어에서는 필요한 밉을 로드하는 데 몇 초가 걸릴 수 있습니다.
이로 인해 카메라가 VT를 효과적으로 따라잡지 못하고 전체 지형이 PS1 게임처럼 보이는 버그가 발생할 수 있습니다.
요청이 있는 즉시 페이지를 합성하되 저해상도로 표시하는 것이 더 낫다는 것을 알게 되었습니다.
15프레임 후에도 여전히 완전히 준비되지 않은 경우 대역폭이 있다고 가정하고 다시 재합성합니다.
이 지연은 30프레임으로 두 배가 되고, 다시 한 번 재구성합니다.
페이지가 준비된 것으로 표시될 때까지 이 과정을 반복한 후 최종적으로 합성합니다.
매 프레임마다 한정된 수의 페이지만 합성합니다. 저사양 모바일 하드웨어에서는 4페이지를 넘지 않지만, 고사양 PC에서는 프레임당 최대 20페이지까지 합성됩니다.
캐시에 없는 인기 페이지가 먼저 합성됩니다.
공간이 남으면 저해상도 페이지를 재합성합니다. 저해상도 페이지는 우선순위가 정해져 있으므로 가장 필요한 페이지를 먼저 재구성합니다.
모든 페이지에는 연령이 있습니다. 요청된 페이지는 연령이 0으로 초기화되며, 요청되지 않은 페이지는 연령이 증가합니다.
최소 3프레임 동안 요청되지 않은 페이지는 재활용할 수 있습니다.
항상 가장 오래된 페이지부터 재활용됩니다.
데칼은 슈퍼 지형을 렌더링할 때 중요한 역할을 합니다.
데칼에는 3가지 종류가 있습니다.
지형 데칼은 하향식 직사각형 직교 투영입니다.
스플라인 데칼은 하향식 직교 투영이지만 베지어 곡선을 따릅니다.
볼륨 데칼은 하향식 투영에만 국한되지 않습니다. 지형을 포함한 모든 종류의 지형에서도 사용할 수 있습니다.
첫 번째 스크린샷은 지형 레이어만 있고 데칼이 없는 월드의 모습을 보여줍니다.
두 번째 스크린샷은 지형 레이어와 지형 데칼이 렌더링된 모습입니다.
세 번째 스크린샷은 지형 레이어와 스플라인 데칼이 렌더링된 모습입니다. 보시다시피 스플라인 데칼은 도로를 만드는 데 사용하는 것입니다.
마지막 스크린샷은 모든 것이 합쳐졌을 때의 모습을 보여줍니다.
일반적으로 카메라 위치에 따라 달라지는 디스크에서 에셋을 로드하는 게임 시스템을 스트리머라고 부릅니다.
예를 들어 스트리머는 씬을 최대 해상도로 렌더링하는 데 필요한 이미지 밉을 로드하는 역할을 합니다.
스트리머는 메시 레벨의 디테일, 사운드, 애니메이션 및 기타 다양한 종류의 데이터도 로드합니다.
슈퍼 지형은 디스크에서 스트리밍되는 많은 데이터를 사용합니다.
버텍스 및 인덱스 버퍼와 같은 메시 데이터는 카메라 거리에 따라 스트리밍됩니다.
데칼은 쿼드 트리에 저장되며 이 역시 스트리밍됩니다.
현재 카메라 위치가 주어지면 게임은 로드해야 하는 지형 레이어와 데칼에 대한 이미지 밉을 계산합니다.
페이지 합성 요청이 들어오면 게임에서 적절한 밉이 로드되었는지 확인합니다.
로드되지 않은 밉이 있으면 우선순위를 높여 가능한 한 빨리 스트리밍되도록 합니다.
누락된 밉이 있는 경우에도 페이지를 컴포지트하지만 저해상도로 표시합니다.
데칼 트리 노드 누락과 같이 중요한 데이터가 누락된 경우 해당 페이지를 준비되지 않은 것으로 표시합니다.
드로잉 프리미티브가 누락된 페이지를 렌더링하면 아티팩트가 튀어나올 수 있습니다.
누락된 것이 없으면 페이지가 준비된 것으로 표시합니다.
지형 구성은 스크래치 버퍼라고 하는 3개의 G-버퍼를 사용합니다.
첫 번째 버퍼는 알베도를 유지합니다.
두 번째는 노멀을 유지합니다.
세 번째는 메탈니스, 오클루전 및 광택을 각각 하나씩 보유합니다.
페이지를 합성할 때는 3개의 버퍼에 한 번에 모두 씁니다.
스크래치 버퍼는 압축되지 않은 렌더 타깃이므로 메모리 사용량이 상당히 높을 수 있습니다.
먼저 컴퓨트 셰이더를 사용하여 지형 레이어를 렌더링합니다.
그 다음 버텍스 및 픽셀 셰이더를 사용하여 스플라인 데칼을 렌더링합니다.
그 다음에는 버텍스 및 픽셀 셰이더를 사용하여 지형 데칼을 렌더링합니다.
마지막으로 컴퓨트 셰이더를 사용하여 렌더링되는 볼륨 데칼로 마무리합니다.
데칼은 서로 정렬할 수 있지만 볼륨 데칼이 지형 데칼보다 먼저 렌더링되는 것은 불가능합니다.
합성된 스크래치 페이지를 실제 텍스처에 복사하기 전에 압축해야 합니다.
이 작업은 우리가 작성한 컴퓨팅 셰이더를 사용하여 수행됩니다.
모바일에서는 ASTC 압축을 사용하고 다른 모든 플랫폼에서는 BC 압축을 사용합니다.
모바일을 제외한 모든 플랫폼에서 데이터는 2개의 BC3 텍스처 또는 3개의 BC1 텍스처로 압축될 수 있습니다.
이 단계에서 시각적 품질이 가장 크게 저하된다는 점에 유의하세요.
물리 텍스처에는 2 밉이 있습니다. 이는 이중 선형 텍스처 보간에 필요합니다.
실제 페이지에는 4픽셀 테두리가 있습니다. 이는 8배 이방성 필터링이 작동하는 데 필요합니다.
이는 페이지당 248 x 248 픽셀만 사용한다는 것을 의미합니다.
BC3 물리적 텍스처에는 8개의 채널이 있습니다.
첫 번째 텍스처는 알베도와 금속성을 인코딩하고, 두 번째 텍스처는 일반, 오클루전 및 광택을 인코딩합니다. X 컴포넌트는 녹색 채널에, Y 컴포넌트는 알파 채널에 들어갑니다.
BC1 모드에서는 9개의 채널을 사용할 수 있습니다.
첫 번째 텍스처는 알베도를 인코딩합니다.
두 번째 텍스처는 광택, 노멀의 x 컴포넌트 및 오클루전을 인코딩합니다.
세 번째 텍스처는 메탈니스와 노멀의 Y 컴포넌트를 인코딩합니다. 이제 원하는 모든 것을 위한 채널이 1개 남았습니다.
노멀 컴포넌트는 녹색 채널에 인코딩되는데, 녹색 채널은 다른 채널에 5비트가 아닌 6비트를 가지고 있기 때문입니다.
이론적으로는 2 BC3 모드가 더 나은 화질을 제공해야 하지만, 저는 그 차이를 구분할 수 없었습니다.
BC1 모드는 메모리가 1/3로 줄어들고 채널이 1개 추가되어 좋습니다.
GPU 테셀레이션 및 디스플레이스먼트가 활성화된 플랫폼에서는 가상 텍스처링을 사용하여 디스플레이스먼트를 저장합니다.
변위 물리적 페이지는 32×32, 1밉, 1픽셀 테두리를 가지며, 이는 버텍스의 변위에만 사용되기 때문에 이러한 버텍스의 밀도가 픽셀 밀도보다 훨씬 낮기 때문입니다.
또한 BC4 압축이므로 메모리 비용이 매우 적습니다.
변위는 콜리전에 영향을 미치지 않으므로 너무 크면 눈에 띄는 문제가 발생하므로 주의하세요.
지형 기술은 다양한 기기에서 실행되므로 플랫폼에 맞게 AVT를 조정할 수 있습니다:
5가지 품질 설정이 있습니다:
매우 낮음 설정에서는 물리적 텍스처가 13 x 13 페이지에 불과합니다. 방향 텍스처는 512 x 512입니다.
낮음 설정에서는 물리적 텍스처가 16 x 16 페이지입니다. 방향 텍스처도 512 x 512입니다.
중간 설정에서는 물리적 텍스처가 22 x 22 페이지입니다. 방향 텍스처는 여전히 512 x 512입니다.
높음 설정에서는 물리적 텍스처가 30 x 30 페이지입니다. 방향 텍스처는 1024 x 1024입니다.
울트라 설정에서는 물리적 텍스처가 42 x 42 페이지입니다. 방향 텍스처는 1024 x 1024입니다.
밉 체인의 상위 6개 레벨에 대한 VT 페이지는 오프라인으로 구워집니다. 일반적으로 이러한 페이지는 맵의 넓은 부분을 차지하기 때문에 비용이 상당히 많이 듭니다.
오프라인으로 베이크하면 GPU 부담을 크게 줄이고 시각적 품질도 크게 높일 수 있습니다.
오프라인으로 베이크된 페이지만 사용하여 렌더링된 월드를 볼 수 있습니다.
카메라에 가까이 있는 것은 분명히 너무 낮은 해상도이지만, 멀리 있는 것은 어쨌든 오프라인으로 구워진 페이지가 GPU가 사용하기를 원할 것입니다.
이러한 이미지를 스트리밍해야 하지만 충분히 멀리 있는 지형 표면의 경우 지형 레이어 및 데칼을 스트리밍할 필요가 없기 때문에 결국 메모리를 절약할 수 있습니다. 이렇게 하면 메모리가 절약되고 스트리머의 부담이 줄어듭니다.
3 BC1 모드를 사용하면 9개의 채널을 사용할 수 있습니다. AVT는 일반적으로 8개의 채널만 사용하므로 1개의 채널이 남는다는 뜻입니다.
지금까지 이 채널에 대해 4가지 용도를 생각해냈습니다.
산란은 이 사진에서 볼 수 있듯이 눈을 실제처럼 보이게 하기 위해 눈 위에서 자주 사용됩니다.
열은 야간 및 열화상 비전에 사용됩니다.
이미시브는 바닥에 앰버를 배치할 수 있습니다.
반짝임은 모래나 눈을 반짝이게 만드는 데 사용됩니다.
기능 활성화는 맵 수준에서 이루어집니다. 한 번에 하나의 기능만 지원할 수 있습니다.
각 지형 표면에 고유한 하이트맵이 있는 경우, 슈퍼 지형에서 어떤 지점의 높이를 파악하는 것은 정말 어렵습니다.
하지만 단일 하이트맵을 사용하여 전체 슈퍼 지형을 커버하면 이 문제는 간단해집니다.
모든 하이트맵이 하나의 맵으로 병합되기 때문에 이를 통합 하이트맵 또는 줄여서 UHM이라고 부릅니다.
UHM을 사용하면 아티스트들이 오랫동안 요청해왔던 스커트 구현이 가능해집니다.
일반적인 UHM은 32MB의 메모리를 사용하지만, 아티스트는 128MB 이상이면 더 선명한 화질을 얻을 수 있어 더 만족할 것입니다.
일부 플랫폼에서는 32MB는 많은 메모리입니다.
유니티는 UHM을 가상화하여 메모리 사용량을 크게 줄였습니다.
이를 가상 높이 맵 또는 줄여서 VHM이라고 부릅니다.
VHM은 144페이지로 구성되며, 각 페이지는 2픽셀 테두리를 제외하고 64x64입니다.
즉, 캐시는 1.3MB보다 약간 적습니다.
또한 VT에서 사용하는 방향 텍스처와 유사한 방향 테이블을 사용하지만 버퍼라는 점만 다릅니다. 가장 큰 맵의 경우 크기가 8KB에 불과합니다.
VHM의 페이지는 카메라와의 거리에 따라 우선순위가 정해집니다.
항상 캐시를 채웁니다.
캐시에 있는 페이지에는 히스테리시스가 있어 페이지가 빠져나가기 어렵게 만듭니다.
이 지도 렌더링에서 지형 타일의 해상도를 확인할 수 있습니다. 녹색 타일이 가장 높은 해상도이며 파란색, 보라색, 시안색 순으로 표시됩니다.
초기에는 전체 VHM을 메모리에 로드하되 압축된 상태로 유지할 수 있기를 바라며 여러 업샘플링 기술을 평가했습니다.
결과적으로 여전히 스트리밍을 해야 했지만, 그럼에도 불구하고 흥미로운 연구였습니다.
이 모든 연구는 미국 지질조사국 웹사이트에서 다운로드한 하이트맵을 사용하여 수행되었습니다.
이 슬라이드와 다음 슬라이드에서 P는 부모 텍셀이며, 코드는 4개의 자식 텍셀에서 높이를 예측해야 합니다.
P는 A, B, C, D에서 높이의 평균입니다.
항상 모든 A를 재구성한 다음 B, C, D를 재구성합니다.
가장 간단한 이미지 업샘플링 기법은 자식 높이가 부모 높이와 같다고 가정하는 것입니다. 이것이 C0 예측자입니다.
이제 A, B, C의 값을 알았으니 D에 대해 조금 더 복잡한 작업을 할 수 있습니다.
이 간단한 업샘플링 기법은 메모리를 소스의 60%까지 줄여줍니다.
C0 업샘플링 플러스는 As를 사용하여 B를 재구성한 다음 As & B를 사용하여 C를 재구성하는 방식으로 이전 기술을 개선합니다.
하지만 이렇게 해서 얻을 수 있는 이득은 1%에 불과합니다.
C1 업 샘플링은 이웃을 활용하고 메모리 사용량을 소스 데이터의 43%로 줄입니다.
다음은 AS를 재구성하는 방법입니다.
B의 경우 인접한 As의 평균을 구하면 됩니다.
C의 경우, 인접한 A와 B의 평균을 구합니다.
D의 경우 A, B, C를 평균합니다. C는 D 텍셀에서 더 멀리 떨어져 있기 때문에 더 낮은 기여도 가중치를 사용해야 하지만, 현재 구현에서는 그렇게 하지 않습니다.
또한 직선 대신 C2 연속 곡선을 재구성하기 위해 더 먼 이웃을 살펴본다는 점을 제외하면 본질적으로 C1 예측자와 같은 C2 예측자도 구현했습니다.
이 방법은 USGS 지도에서는 꽤 잘 작동했지만, 게임에서 사용하는 높이 지도에서는 그다지 많은 이득을 제공하지 못했습니다.
또한 간단한 신경망도 평가했는데, 최고의 C2 예측기보다 더 나은 성능을 보였지만 비용이 너무 많이 들었습니다.
결국 5x5 커널을 최적화하기 위해 경사 하강을 사용했습니다.
하지만 훈련이 필요하지 않아 현재 사용하고 있는 네빌 증분 예측기보다는 그다지 우수하지 않았습니다.
예측자의 목적은 다양한 텍셀에서 높이 값을 예측하는 것입니다.
하지만 재구성된 높이가 무손실이어야 합니다.
따라서 예측 값과 실제 값 사이의 델타를 오류 스트림에 저장합니다.
이 오류 스트림은 매우 희박한 경향이 있으므로 간단한 압축 기술을 사용하여 잘 압축됩니다.
지금까지의 모든 결과에는 이 압축이 포함되어 있습니다.
네빌 인크리멘탈을 사용하면 PS4에서 68x68 페이지의 압축을 푸는 데 약 1ms가 걸립니다. 이 부분은 확실히 재평가할 예정이며, 데이터에서 Neville 증분과 비슷한 성능을 발휘하고 훨씬 더 저렴할 것으로 예상되는 C1 예측기로만 전환할 가능성이 높습니다.
이제 UHM 또는 VHM을 사용하여 스커트를 구현할 수 있습니다. 스커트를 사용하면 메시가 지형과 매끄럽게 블렌딩됩니다.
스커트는 두 가지 기능을 동시에 수행합니다:
첫째, 버텍스 높이가 지형 높이와 일치하도록 변경됩니다.
아티스트는 모핑이 얼마나 위와 아래에서 일어나는지 제어합니다.
둘째, 메시를 셰이딩할 때 픽셀이 지형에 얼마나 가까운지에 따라 가상 텍스처에서 샘플링할 수 있습니다.
아래 그림에서 바위가 지형과 매끄럽게 어우러진 것을 볼 수 있습니다.
클러터 역시 스커트 기술을 활용합니다. 위 그림에서는 버텍스 모핑 및 컬러 블렌딩이 비활성화되어 있습니다. 잔디가 실제로 지형 위에 떠 있는 것을 볼 수 있습니다.
버텍스 모핑을 활성화하면 풀잎이 지형에 스냅됩니다.
잔디와 같은 잡동사니는 아래 지형과 매끄럽게 섞이도록 색을 칠할 수 있습니다.
컬러 틴팅을 할 때는 평균 색상을 얻기 위해 해상도가 낮은 VT를 사용합니다.
클러터 인스턴스당, 버텍스당 또는 픽셀당 컬러 틴트를 계산할 수 있습니다. 이는 콘텐츠 제작자의 재량에 따라 결정됩니다.
클러터 틴팅과 관련된 것이 메시 틴팅입니다. 특정 규칙에 따라 매우 낮은 해상도의 VT를 샘플링하면 동일한 메시를 고유하게 보이게 하고 환경에 더 잘 맞도록 만들 수 있습니다.
오른쪽의 절벽은 매우 낮은 해상도의 VT를 컬러 틴트로 사용하여 독특하게 보이도록 합니다.
현재 Unified Terrain Surface라는 새로운 기술을 개발 중에 있습니다
여러 개의 지형이 아닌 전 세계를 아우르는 하나의 지형이 있습니다.
꼭지점 밀도가 다른 두 지형면이 서로 인접해 있을 때 이전에 있었던 성가신 문제를 해결합니다
그로 인해 땅에 금이 가게 될 것이고 예술가들은 종종 그것을 숨기기 위해 그물을 쳐야 할 것입니다
UTS를 사용하면 더 이상 불가능합니다. 그래서 Unified Terrain Surface를 사용을 위해 Unified Index & Color Map도 함께 구현했습니다.
통합 프로세스가 끝나면 가상화 프로세스로 넘어갈 수 있습니다.
통합 맵을 가상화하면 통합의 가장 큰 단점인 메모리 공간을 줄일 수 있습니다.
인덱스 맵은 각 값이 말 그대로 지형 레이어 인덱스이므로 보간할 수 없으므로 포인트 샘플링을 사용하여 저해상도 밉을 생성합니다.
인덱스 맵의 픽셀은 컬러 맵의 해당 픽셀과만 작동하도록 되어 있으므로 컬러 맵도 포인트 샘플링합니다.
마지막으로 인덱스 맵과 컬러 맵의 해상도가 일치해야 합니다. 이는 인덱스 맵의 픽셀이 컬러 맵의 해당 픽셀과만 작동하도록 되어 있기 때문입니다.
가상 인덱스 맵은 현재 16비트이지만, 이를 10비트로 줄일 계획입니다. 가상 컬러 맵은 BC1 압축입니다.
인덱스 및 컬러 맵을 가상화하는 것 외에도 컷아웃 맵도 가상화합니다.
컷아웃 맵은 픽셀당 1비트에 불과하기 때문에 매우 간단합니다.
샘플을 잘라내거나 그렇지 않을 수 있습니다.
대부분의 페이지는 흰색이고, 일부 검은색 페이지가 있으며, 일부 페이지에는 컷아웃 픽셀과 비컷아웃 픽셀이 혼합되어 있습니다.
가상 컷아웃 맵은 다른 가상 맵과 마찬가지로 방향 테이블을 사용합니다.
흑백 페이지의 경우 특수 인덱스를 사용하여 흑백을 표시하기만 하면 됩니다. 컷아웃 픽셀과 비컷아웃 픽셀이 혼합된 페이지만 캐시에 넣습니다.
데이터가 너무 작기 때문에 다운 샘플링도 하지 않습니다.
이러한 페이지는 최대 254개까지만 사용할 수 있으므로 가상 컷아웃 맵의 최악의 경우 메모리 비용은 150KB입니다.
대형 맵에서 방향 테이블의 메모리 비용은 4KB에 불과합니다.
비스타 UV는 지형 레이어가 카메라에 가깝거나 멀리 떨어져 있을 때 모두 멋지게 보이도록 만드는 데 탁월합니다.
문제는 카메라 거리에 따라 달라진다는 점입니다. 카메라가 표면에서 멀어지면 매크로 디테일은 알파로 처리하고 마이크로 디테일은 알파로 처리합니다.
이렇게 하는 이유는 매크로 기여도가 멀리서 보면 좋아 보이지만 가까이서 보면 픽셀화되기 때문입니다.
버추얼 텍스처링에서는 카메라의 개념이 없기 때문에 카메라 거리를 사용하는 것이 문제가 됩니다.
밉 레벨을 카메라 거리로 변환하여 가짜를 만들어야 합니다. 예를 들어 밉 0은 최대 약 5피트 거리에서 보이는 것을 의미합니다. 밉 1은 그 거리를 두 배로 늘리고, 밉 2는 다시 두 배로 늘립니다.
이제 인접한 두 밉은 사실상 약간 다른 데이터를 가지게 되므로 VT 페이지의 밉 체인에 불연속성이 생깁니다.
실제로 많은 곳에서 이 문제를 해결할 수 있었지만 여전히 이 문제를 해결할 방법을 모색 중입니다.
빙판의 경우, 깊이 에뮬레이션에 적합한 저렴한 시차 매핑 기술을 사용하는 경우가 많습니다.
패럴랙스 매핑은 저희 지형 기술에서 지원되지 않지만, 지원하지 않을 이유가 없다고 생각합니다.
현재 4번째 BC1 텍스처를 추가하고 있습니다.
이렇게 되면 3개의 채널이 추가되어 총 4개의 선택적 채널로 플레이할 수 있습니다.
눈에는 스캐터링과 글린트가 자주 사용됩니다. 현재는 둘 중 하나를 선택할 수 있지만 둘 다 사용할 수는 없습니다.
마찬가지로 시차도 얼음에 자주 사용되므로 눈 레벨에 사용됩니다. 4번째 BC1 텍스처를 사용하면 스캐터링, 글린트, 패럴랙스를 동시에 가질 수 있습니다.
저희는 메모리 비용이 0인 데칼, 즉 절차적 데칼을 실험하고 있습니다. 지루할 수 있는 지형 레이어에 디테일을 추가하는 데 유용할 수 있습니다.
버추얼 텍스처링은 정적 캐시이지만 어느 정도 동적 요소를 넣을 수 있다고 생각합니다.
눈이나 모래 위 발자국을 좋은 예로 들 수 있습니다.
가상 텍스처링 영역을 자동으로 재계산할 수 있는 모든 기술은 이미 갖춰져 있습니다.
이제 시험해보고 얼마나 잘 작동하는지 확인하기만 하면 됩니다.
최근 대규모 이벤트를 트리거하여 맵의 일부 영역을 크게 변경하는 기능을 추가했습니다.
지형과 관련해서는 지리가 영향을 받기를 원합니다.
이 예에서는 비행기가 지상에 추락했습니다.
가상화된 맵을 사용하면 영향을 받는 페이지만 업데이트하면 되므로 이를 쉽고 저렴하게 구현할 수 있습니다.
이 책에 소개된 작품에는 많은 훌륭한 분들이 어떤 식으로든 참여해 주셨습니다. 이 모든 분들께 진심으로 감사드립니다.
'TECH.ART.FLOW.IO' 카테고리의 다른 글
TECHARTFLOW INTRODUCTION (0) | 2023.09.13 |
---|---|
[번역][역자각주]Nubis3: Methods (and madness) to model and render immersive real-time (0) | 2023.09.12 |
[번역][일부해설]HypeHype Mobile Rendering Architecture (0) | 2023.09.11 |
[번역][해설]What do we want from a Diffuse BRDF? (0) | 2023.09.10 |
[소개]SIGGRAPH 2023 Advances in Real-time Rendering in Games course.[번역] (0) | 2023.09.08 |