스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
MetalFX Upscaling을 통한 성능 향상
Metal 응용 프로그램에 플랫폼에 최적화된 그래픽 효과를 제공하는 새로운 API인 MetalFX에 대해 알아보세요. MetalFX Upscaling을 사용하면 이제 응용 프로그램에서 렌더링 품질 저하 없이 더 낮은 해상도로 프레임을 렌더링하고 렌더링 시간을 줄일 수 있습니다. 또한 상당한 성능 향상을 얻을 수 있는 공간 업스케일링과, 최고 품질의 렌더링을 제공하는 시간적 AA 및 업스케일링이라는 두 가지 효과의 사용 방법과 사용 시기를 보여드립니다.
리소스
관련 비디오
Tech Talks
WWDC23
WWDC22
-
다운로드
♪♪ MetalFX 업스케일링을 통한 성능 향상 안녕하세요, 환영합니다 저는 Apple GPU 소프트웨어팀 Kelvin Chiu라고 합니다 오늘은 MetalFX 업스케일링을 통해 Metal 응용 프로그램의 성능을 향상시키는 방법에 대해 알아보겠습니다 MetalFX는 새로운 API로 플랫폼에 최적화된 그래픽 효과를 Metal 응용 프로그램에 제공합니다 이는 고성능 업스케일링을 가능하게 하는데 응용 프로그램의 성능을 향상시키면서도 렌더링 품질을 유지합니다 고해상도로 프레임을 렌더링하려면 GPU 시간이 소요됩니다 이 시간을 줄이기 위해 낮은 해상도로 렌더링하면 성공적으로 마칠 수 있죠 하지만 렌더링 품질은 더 낮아질 수밖에 없습니다 MetalFX 업스케일링을 활용하면 여러분의 응용 프로그램이 낮은 해상도로 프레임을 렌더링할 수 있어 시간은 단축되지만 렌더링 품질은 낮추지 않아도 됩니다 MetalFX 업스케일링은 Apple 기기에 최적화되어 있습니다 여러분이 즐기는 게임에도 쉽게 적용할 수 있죠 MetalFX는 두 가지 업스케일링 효과를 제공합니다 이에 대해 자세히 살펴보도록 하죠 공간 업스케일링은 사용법이 간단하며 성능을 크게 향상시켜 줍니다 탬퍼럴 안티 앨리어싱 (TTA)와 업스케일링은 여러 프레임의 정보를 통합해 더 높은 품질로 출력해 줍니다
다음으로는 이 효과를 사용한 모범 사례에 대해 말씀드리겠습니다 마지막으로 세션을 마무리하면서는 실제로 실행하는 모습을 보여드리겠습니다
공간 업스케일링부터 시작해 보죠 MetalFX 공간 업스케일링은 입력된 공간 정보를 분석해 새로운 업스케일링 샘플을 생성합니다 공간 업스케일링 정보를 통합하는 건 간단합니다 공간적으로 업스케일링된 색상을 출력하기 위해서는 안티 앨리어스 인풋 색상이 필요합니다 일반적인 게임 렌더링 파이프라인에는 안티 앨리어스 렌더링을 포함한 다양한 렌더링 패스와 다양한 후처리 효과가 있습니다 게임의 톤 매핑 프로세스가 완료된 후에 MetalFX 공간 업스케일링을 추가해야 합니다 이 기능은 톤 매핑이 되어 있고 색이 잘 인지되는 영역에서 가장 잘 실행됩니다 MetalFX 공간 업스케일링을 적용해 보죠
이 체스 신은 고품질 레퍼런스 렌더러로 제작됐으며 해상도는 4K입니다 복잡한 그래픽 효과가 들어간 패스 트레이싱으로 반사나 그림자 같은 광선을 추적하죠 두 화면을 나란히 두고 비교해 보겠습니다 왼쪽 화면은 해상도가 540p입니다
MetalFX 공간 업스케일링을 이용해 오른쪽 화면은 1080p로 출력합니다
퀸을 확대해 보면 왼쪽 화면에 있는 퀸은 이미지가 분명하지 않고 해상도가 낮습니다 오른쪽 화면은 공간 업스케일링을 적용한 신으로 반사도 뚜렷하고 모서리도 더 정교합니다
이제 MetalFX 공간 업스케일링 구현 방법에 대해 말씀드리죠
Metal에서는 보통 명령 인코더를 생성해서 명령을 명령 버퍼로 인코딩합니다 그리고 효과를 위한 인풋을 만들어 내죠 마찬가지로 여러분도 MetalFX 효과 객체를 생성해서 명령을 명령 버퍼로 인코딩하고 효과를 수행할 수 있습니다 마지막으로 세 번째 명령 인코더를 만들어서 MetalFX 출력에 사용할 명령을 인코딩합니다 여러분이 응용 프로그램을 처음 시작할 때나 디스플레이에서 해상도를 전환할 때만 새로운 공간 스케일러 객체를 생성해야 합니다 생성 비용이 많이 들기 때문이죠
우선, MTLFXSpatialScalerDescriptor를 만들고 설정을 해 줍니다 그리고 makeSpacialScaler 메서드를 호출해 스케일러 객체를 만듭니다 초기화 코드에서는 기술자로 시작합니다 인풋과 아웃풋 텍스처의 폭과 높이를 모두 입력합니다 그다음 나중에 스케일러 객체에서 설정할 텍스처 형식을 설정합니다 색 처리 모드를 설정합니다 인풋과 아웃풋이 어떤 색 영역에서 이루어지는지 API에 알려 주는 거죠 인지 모드, 선형 모드 또는 HDR 색 공간으로 값을 설정할 수 있습니다 기술자가 채워지면 스케일러 객체를 생성합니다
스케일러 객체가 생성되면 객체의 프로퍼티를 원하는 빈도로 수정할 수 있습니다 인코드 메서드를 호출하여 업스케일링 프로세스를 시작합니다 프레임 드로우 코드에서 스케일러 객체에 인풋과 아웃풋 텍스처가 올바르게 설정됐는지 확인해야 합니다 스케일링 효과를 명령 버퍼로 인코딩하기 전에 말이죠 공간 업스케일링으로 간단하게 성능을 향상시킬 수 있습니다
만약 더 높은 품질의 렌더링을 원한다면 MetalFX의 TAA와 업스케일링 기술을 사용하면 됩니다 TAA와 업스케일링은 이전 프레임의 데이터를 사용해 고품질 업스케일 출력을 생성하는 기술입니다 이전 프레임에서 업스케일링된 출력이 현재 프레임 업스케일링의 인풋 중 하나로 사용된단 뜻이죠
TAA와 업스케일링에 이전 프레임 데이터가 필요한 이유를 더 잘 이해하기 위해 먼저 슈퍼샘플링 개념을 설명해 드리겠습니다
슈퍼샘플링에서는 여러 개의 샘플이 각 픽셀로 계산됩니다 그다음 단일 픽셀값으로 통합되는 거죠 픽셀당 더 많은 샘플을 통합할수록 더 나은 결과가 나옵니다 하지만 한 프레임에서 픽셀당 여러 개의 샘플을 계산하려면 비용이 아주 많이 듭니다 단일 프레임에서 픽셀당 여러 위치를 샘플링하는 대신에 탬퍼럴 샘플링을 할 수 있습니다 탬퍼럴 샘플링은 주어진 프레임에 있는 모든 픽셀에 대해 다른 샘플 위치를 렌더링하는 개념입니다 이렇게 하면 훨씬 저렴한 비용으로 여러 프레임에 슈퍼샘플링 품질을 충족시킬 수 있습니다 여러 프레임에서 샘플을 축적하고 샘플 위치를 고려하면 TAA와 업스케일링은 목표 해상도 픽셀에 맞게 적절히 통합할 수 있으며 고품질의 안티 앨리어스 업스케일 아웃풋을 제공하게 됩니다 하지만 프레임 사이 내용이 자주 바뀌기 때문에 이런 변화를 감지하려면 더 많은 데이터가 필요합니다 이전 프레임의 아웃풋 정보 외에도 TAA 및 업스케일링에는 지터된 색상 인풋값은 물론이고 모션뿐 아니라 신의 자세한 데이터도 필요합니다 그 요소들이 왜 필요한지 하나하나 살펴보도록 하죠
지터된 색상 인풋값부터 시작하겠습니다
이건 지터 없이 렌더링된 빨간색 삼각형입니다 밝은 흰색 윤곽선은 삼각형이 렌더링 중이란 뜻이죠 작은 정사각형은 각각 픽셀을 나타냅니다 그리고 가운데의 회색 점은 픽셀이 샘플링되는 부분이죠 이것은 작은 지터로 렌더링했을 때 출력되는 동일한 삼각형입니다 회색 점은 주어진 픽셀에 대한 샘플링 위치를 나타내죠 원하는 수의 샘플을 온전히 수집하려면 지터 오프셋이 설정된 프레임 수에 고유한 값을 가져야 합니다 지터 시퀀스에 대해서는 나중에 자세히 다루도록 하죠
다음은 신의 모션 정보입니다 신의 모션 데이터는 물체가 이전 프레임에서 어느 정도 어느 방향으로 이동했는지 나타냅니다 TAA 및 업스케일링은 맞는 샘플을 수집하기 위해 모션 정보를 역추적한 다음 이전 프레임에서 해당 위치를 찾습니다
또 다른 인풋은 신의 상세한 정보입니다 신의 상세한 정보는 신의 전경과 배경에 있는 것들을 나타냅니다 이는 전경 에지 안티 앨리어싱의 우선순위를 지정할 때 중요합니다 그리고 이전 프레임에서 샘플을 수집할 때 새로 노출될 수 있는 다른 객체에 대한 단서도 제공하죠 인풋 데이터의 마지막 조각은 이전 프레임의 아웃풋입니다
이전 프레임의 아웃풋은 이전에 통합된 샘플의 모든 것을 포함합니다 그게 현재 프레임의 지터된 색상 인풋과 혼합되어 픽셀당 샘플 수를 늘리는 겁니다 현재 프레임과 이전 프레임의 정보를 결합하여 결과 이미지에 더 자세한 정보가 표시되죠 MetalFX는 업스케일링된 출력을 추적합니다 그래서 여러분은 색깔과 모션 현재 렌더링된 프레임의 상세 정보만 넘기면 됩니다 일반적인 게임의 렌더링 파이프라인으로 돌아가 보죠 MetalFX TAA 및 업스케일링은 후처리 효과 전에 실행해야 합니다 이런 효과들이 업스케일링의 결과를 방해하기 때문이죠
다시 한번 체스 렌더링 화면을 보죠 이번에는 MetalFX TAA와 업스케일링을 사용합니다 화면을 나란히 두고 비교해 보면 왼쪽 해상도는 1080p 오른쪽에 업스케일링된 화면의 해상도는 4K입니다
퀸을 가까이 확대해 보죠 왼쪽은 저해상도 인풋에 앨리어스가 적용된 겁니다 반면 오른쪽 업스케일링된 화면은 고해상도로 출력되어 윤곽이 매끄럽고 반사 부분이 더 미세하게 처리됐죠
공간 스케일러와 마찬가지로 새로운 임시 스케일러 생성에는 비용이 많이 들기 때문에 응용 프로그램을 처음 시작할 때나 디스플레이에서 해상도를 전환할 때만 생성해야 합니다 우선 a MTLFXTemporalScalerDescriptor를 할당하고 값을 채운 다음에 makeTemporalScaler method를 호출해 스케일러 객체를 만듭니다
초기 설정 코드는 기술자로 시작합니다 인풋 및 아웃풋 텍스처의 폭과 높이를 모두 입력합니다 그다음 지터 색상과 깊이 및 모션 텍스처 형식을 설정합니다 나중에 스케일러 객체에 인풋으로 바인딩될 텍스처죠
마지막으로 MetalFX가 업스케일한 아웃풋을 저장할 아웃풋 텍스처의 형식을 설정합니다 기술자가 채워지면 스케일러 객체를 생성합니다 스케일러 객체에서 모션 스케일 프로퍼티를 설정합니다 이를 통해 앱의 모션 데이터를 API의 기대 수준으로 확장할 수 있죠 MetalFX는 렌더링 해상도 픽셀 영역에서의 모션 데이터를 요구합니다 현재 프레임 위치에서 이전 프레임의 위치로 이동하는 방향을 포함하는 데이터죠 예를 들어 볼게요 렌더링 해상도를 1080p로 설정하겠습니다 클립 공간 좌표 (-0.75, -0.75)에서부터 이동하는 객체가 있다고 가정해 보죠 이게 (0.25, 0.25)로 이동하는 겁니다 모션 데이터는 (1, 1)로 저장되죠
motionVectorScale 프로퍼티를 (-960, 540)로 설정해서 MetalFX가 게임의 모션 데이터를 올바르게 해석할 수 있도록 합니다
여러분이 원하는 만큼 스케일러 객체의 프로퍼티를 수정할 수 있습니다 그리고 인코드 메서드를 호출해 확장 프로세스를 시작합니다
프레임당 드로우 코드의 경우 resetHistory 프로퍼티를 먼저 설정합니다 응용 프로그램에 신 컷이 있거나 첫 프레임을 로딩할 때 이 값을 true로 설정합니다 그리고 효과에 대한 인풋 텍스처를 설정한 다음 아웃풋 텍스처도 설정합니다 그다음 reversedDepth 프로퍼티를 설정해 깊이 값이 Z의 역방향 매핑인지 표시합니다
스케일링 효과를 인코딩하기 전에 마지막으로 설정할 프로퍼티는 현재 지터 오프셋입니다
지터 오프셋을 올바로 설정하는 게 아웃풋 품질에 필수입니다 지터 오프셋을 설정하는 방법을 간단히 살펴보죠
예시의 왼쪽에 있는 건 지터로 렌더링된 삼각형입니다
오른쪽은 픽셀 단위로 확대한 화면이죠 샘플의 좌표는 (0.625, 0.78)입니다 픽셀 중심은 주황색 점으로 표시됩니다 중심은 (0.5, 0.5)에 위치합니다
이 예시에서는 지터 오프셋이 (-0.125, -0.28)입니다 지터 오프셋은 항상 -0.5와 0.5 사이에 위치합니다 여러분이 올바른 지터 오프셋을 제공하는지 확인하려면 다양한 지터 오프셋을 사용해서 카메라와 물체의 움직임 없이 신을 렌더링해 보세요 왼쪽의 예시는 지터 오프셋이 잘못 지정된 경우입니다 고정된 물체가 움직이기도 하고 가는 선들은 흐릿하게 보이죠 오른쪽 화면은 지터 오프셋이 올바르게 설정된 경우입니다 물체는 제자리에 있고 가는 선은 점차 뚜렷해지죠 MetalFX의 'TAA와 업스케일링' 기술은 응용 프로그램의 성능을 향상시키고 기존 목표 해상도 렌더링에 버금가는 업스케일링 품질을 제공합니다 두 가지 업스케일링 기술을 모두 사용해 최적의 품질과 성능을 얻기 위한 모범 사례를 보여 드리겠습니다
공간 업스케일링부터 시작해 보죠 최고의 공간 업스케일링 품질을 얻기 위해서 색상 인풋은 안티 앨리어스에 노이즈가 없어야 합니다 이는 잡음 효과 때문인데 앨리어스된 이미지는 깔끔한 모서리 측정을 방해해 공간 업스케일링의 품질을 악화시킬 겁니다 최고의 성능을 위해서 인지 색상 처리 모드를 사용합니다 이건 인풋 색상이 톤 매핑 처리되어 sRGB 색 영역에서 0-1 사이의 값을 지니게 해 주죠 마지막으로 텍스처의 디테일을 높이기 위해 mip bias 값을 마이너스로 설정합니다 공간 업스케일링에 권장되는 mip bias 값은 렌더링 해상도 너비에 log2를 적용한 다음 목표 해상도 너비로 나누는 겁니다
예를 들어, 각 렌더링 해상도 수치를 조정할 때 2를 곱하면 mip bias 값이 -1이 나옵니다 각 수치에 1.5를 곱하면 -0.58 mip bias가 나오죠 mip 레벨이 낮아지면 고주파 패턴을 가진 텍스처가 깜박일 수 있습니다 이런 아티팩트를 발견한 경우에는 특정 텍스처에 대해 mip bias를 조정해야 합니다 다음으로는 TAA와 업스케일링의 모범 사례를 말씀드리겠습니다 TAA와 업스케일링에서 최고의 품질을 얻기 위해서는 좋은 지터 시퀀스를 선택하는 것이 중요합니다 지터 시퀀스를 찾을 때는 업스케일된 목표 해상도에서 샘플의 분포도가 좋고 모든 픽셀에 걸쳐 있는 시퀀스여야 합니다 일반적으로 아웃풋 픽셀당 8개의 지터 샘플이 있어야 고품질의 안티 앨리어스 업스케일 아웃풋을 생성합니다 2배로 업스케일링 한 경우엔 다음을 사용할 것을 권장합니다 32개의 지터가 있는 Halton (2,3) 시퀀스를 사용해 지터된 색 인풋을 생성하세요 여기 보이는 건 Halton (2,3) 시퀀스의 첫 32개 샘플 위치에 대한 플롯으로 아웃풋 픽셀당 약 8개의 샘플을 생성합니다 마지막으로 더 높은 텍스처 디테일을 위해 mip bias 값을 마이너스로 설정하는 게 중요합니다 TAA와 업스케일링에 권장되는 mip bias 값은 렌더링 해상도 너비에 log2를 적용한 다음 목표 해상도 너비로 나눠서 1을 뺀 값입니다 예를 들어, 각 렌더링 해상도 수치를 조정할 때 2를 곱하면 mip bias 값이 -2가 나옵니다 각 수치에 1.5를 곱하면 -1.58 mip bias가 나오죠 이제 mip bias가 여러 상황에서 아웃풋에 미치는 영향에 대한 예시를 보여 드릴게요 지금 보이는 건 동일한 신에 MetalFX TAA와 업스케일링 적용한 아웃풋입니다 mip bias 0, -1, -2를 적용했죠
mip bias -2를 적용한 결과물이 가장 선명하고 뚜렷합니다 반면에 mip bias 0을 적용한 결과물은 은은하고 흐릿하게 출력되죠
지금 보이는 건 임시 업스케일 효과를 사용한 회로판의 세 가지 렌더링 화면입니다 위에서 아래로 적용된 mip bias 값은 샘플링 텍스처가 0일 때와 -1일 때 -2일 때입니다 회로 기판의 텍스처는 고주파 패턴을 지녔습니다 아주 작은 트레이스 와이어처럼 말이죠 mip bias -2에서는 깜박거림이 발생하고 모아레 현상이 생깁니다 하지만 mip bias -1에서는 이런 현상들이 크게 감소합니다 mip bias 0에서는 그런 현상이 완전히 사라지죠 일반적으로 mip bias가 낮을수록 세세한 부분이 더 많이 보입니다 저희는 mip bias 제안을 출발점으로 삼되 고주파 패턴의 텍스처를 가진 mip bias에 대해서는 선택할 때 유의해야 합니다 Metal FX TAA와 업스케일링에서 안티 앨리어스 고품질 업스케일 아웃풋을 보장하기 위해서는 이 예시를 따르면 됩니다
마지막으로 MetalFX 업스케일링 사용 시 성능 부분에서의 모범 사례를 말씀드리겠습니다 MetalFX 업스케일링으로 최상의 성능을 얻으려면 두 개의 비의존성 렌더링 또는 산출된 패스에서 동일한 리소스를 바인딩하거나 기록 및 판독하지 않도록 주의해야 합니다 이렇게 하는 경우 잘못된 의존성이 생성됩니다 Metal에서는 잘못된 의존성을 피하는 게 좋습니다 MetalFX 업스케일링에서는 특히 중요한데요 이어서 설명해 드리겠습니다 이 예시에는 두 개의 프레임이 있습니다 그림자 후처리 패스는 전혀 관련이 없으며 리소스 의존성도 없습니다 Metal은 다음 프레임의 섀도 패스와 현재 프레임의 후처리 패스를 겹칩니다
하지만 후처리 패스가 Metal 버퍼에 입력되고 동일한 버퍼에서 섀도 패스는 읽히는 경우에 Metal은 GPU가 이 두 개의 패스를 동시에 실행하지 못하게 해서 동시에 동일한 리소스에 기록하고 판독하는 잠재적 위험을 예방합니다 프레임 간의 잘못된 의존성은 MetalFX 업스케일링 성능에 부정적인 영향을 미칠 수 있습니다 만약에 프레임 사이에 잘못된 의존성이 없다면 이전 프레임의 MetalFX 업스케일링이 다음 프레임의 섀도 패스와 겹쳤을 수도 있습니다 하지만 프레임 사이 잘못된 의존성으로 인해 생기는 성능 저하에는 MetalFX 업스케일링이 프로세스를 완료하는 데 걸리는 시간도 포함됩니다 이상적인 건, 여러분이 서로 다른 프레임 사이 작업이 겹치게 되는 잘못된 의존성이 발생하지 않도록 해서 MetalFX 업스케일링 사용 시 최적의 성능을 보장하는 겁니다 후처리와 섀도 패스를 위한 버퍼를 따로 생성할 수 있습니다 잘못된 의존성을 막기 위함이죠 그리고 독립적인 패스를 동시에 실행할 수 있습니다
MetalFX 업스케일링을 적용할 때는 잘못된 의존성을 피하는 것을 늘 염두에 둬야 합니다 두 가지 중 어떤 효과를 선택할지 결정할 때 여러분이 명심해야 할 몇 가지가 있습니다 셰이딩 비용과 픽셀 수가 계속 증가함에 따라 'TAA 및 업스케일링'은 계속 사용될 겁니다 픽셀을 일시적으로 분할하면 시각적 충실도가 올라가고 성능도 향상됩니다 만약 여러분에게 TAA 솔루션은 아직 없지만 지터된 색상이나 모션 깊이 버퍼를 렌더링할 수 있다면 MetalFX TAA 및 업스케일링이 플랫폼에 최적화된 솔루션을 제공하고 있으니 이 기능을 고려해 봐야 합니다 필요한 인풋이 없거나 또는 이미 잘 조정된 TAA 솔루션이 있는 경우 MetalFX 공간 업스케일링을 사용하는 걸 고려해 보세요 어떤 업스케일링 효과를 선택해야 할지 두 가지 기능을 통해 더 잘 이해할 수 있습니다 이제 Metal 응용 프로그램에서 이 두 가지 효과를 사용하는 법을 보여 드리겠습니다 'Bistro' 신을 나란히 비교해 보겠습니다 'Metal을 사용한 모던 렌더링' 샘플 코드에서 가져온 신으로 실시간 렌더링 알고리즘이 특징인데 앰비언트 오클루젼이나 볼류메트릭 포그 같은 기능이 있죠 왼쪽은 1080p로 기본 렌더링한 화면이고 오른쪽은 4K 출력으로 MetalFX 공간 업스케일링을 사용한 신입니다 MetalFX 공간 업스케일링의 인풋으로 사용하는 자체 TAA 솔루션이 이 샘플에 적용됐습니다
스쿠터를 확대해 보도록 하죠
왼쪽 이미지는 약간 흐릿하지만 오른쪽은 공간 업스케일링을 적용한 아웃풋으로 가장자리가 더 깨끗하고 선명합니다 손잡이의 직선은 안티 앨리어스 처리가 잘 돼 있죠
본체의 곡선도 훨씬 매끄럽습니다 성능 비교를 해 보도록 하죠 왼쪽은 기본 렌더링으로 출력한 4K 화면이고 오른쪽은 MetalFX 공간 업스케일링으로 출력한 4K 화면입니다
카메라가 움직이면 왼쪽의 기본 렌더링 신은 프레임 속도가 불안정합니다 반면, 공간 업스케일링으로 출력한 오른쪽 신은 훨씬 더 매끄럽게 움직이죠
다음은 반사되는 부분과 그림자가 많은 레이 트레이스 신을 나란히 비교해 보겠습니다 왼쪽은 기본 렌더링으로 출력한 1080p 신입니다 오른쪽은 4K 신으로 MetalFX TAA와 업스케일링 기능으로 출력했죠
샹들리에를 확대해 보죠
왼쪽의 기본적으로 출력한 신은 거친 모습인 데 비해 오른쪽에 업스케일링으로 출력한 신은 모서리가 더 깔끔하고 세세한 부분이 더 잘 보입니다 그림자도 흐릿하지 않고 확실하게 보입니다 샹들리에의 미세한 부분까지도 알아볼 수 있죠
MetalFX TAA와 업스케일링 기능을 사용하면 성능이 향상된 부분도 분명히 보입니다 왼쪽은 기본 렌더링으로 출력한 4K 신이고 오른쪽은 4K 신으로 MetalFX TAA와 공간 업스케일링으로 출력한 거죠 카메라가 움직이면 기본 렌더링으로 출력한 왼쪽 신은 프레임 속도가 아주 느립니다 반면 업스케일링으로 출력한 오른쪽 신은 훨씬 더 부드럽게 움직이죠
MetalFX 업스케일링을 기대하고 있던 손에 꼽히는 주요 게임 개발자들이 '그리드 레전드'와 '레지던트 이블 빌리지'를 출시할 예정이며 '노 맨즈 스카이'는 올해 말 Mac에 공개될 예정입니다 다음은 프레임워크를 사용한 초기 작업을 보여 드릴게요
이 신에서는 '노 맨즈 스카이'의 놀라운 영상미와 게임이 유동적으로 진행되는 걸 볼 수 있는데요 MetalFX TAA와 업스케일링을 적용한 결과물입니다
요약해 보죠 MetalFX는 업스케일링에 초점을 맞춘 새로운 API입니다 공간 업스케일링은 쉽게 적용할 수 있으며 놀라운 성능 향상을 경험할 수 있습니다 그리고 여러분은 TAA와 업스케일링을 사용해 더 높은 품질의 렌더링을 제공할 수 있죠 앞서 말씀드린 모범 사례를 따르면 MetalFX 업스케일링을 최대한 활용할 수 있습니다 시청해 주셔서 감사합니다
-
-
3:39 - Spatial upscaling (initialization)
// Spatial upscaling (initialization) let desc = MTLFXSpatialScalerDescriptor() desc.inputWidth = 1280 desc.inputHeight = 720 desc.outputWidth = 2560 desc.outputHeight = 1440 desc.colorTextureFormat = .bgra8Unorm_srgb desc.outputTextureFormat = .bgra8Unorm_srgb desc.colorProcessingMode = .perceptual spatialScaler = desc.makeSpatialScaler(device: mtlDevice)
-
9:16 - Spatial upscaling (per frame)
// Spatial upscaling (per frame) // Encode Metal commands to draw game frame here... // Begin setting per frame properties for effect spatialScaler.colorTexture = currentFrameColor spatialScaler.outputTexture = currentFrameUpscaledColor // Encode scaling effect into command buffer spatialScaler.encode(commandBuffer: cmdBuffer) // Encode Metal commands for particle/noise effects and game UI drawing for frame here...
-
9:16 - Temporal antialiasing and upscaling (initialization)
// Temporal antialiasing and upscaling (initialization) let desc = MTLFXTemporalScalerDescriptor() desc.inputWidth = 1280 desc.inputHeight = 720 desc.outputWidth = 2560 desc.outputHeight = 1440 desc.colorTextureFormat = .rgba16Float desc.depthTextureFormat = .depth32Float desc.motionTextureFormat = .rg16Float desc.outputTextureFormat = .rgba16Float temporalScaler = desc.makeTemporalScaler(device: mtlDevice) temporalScaler.motionVectorScale = CGPoint(x: 1280, y: 720)
-
10:35 - Temporal antialiasing and upscaling (per frame)
// Temporal antialiasing and upscaling (per frame) // Encode Metal commands to draw game frame here... // Setup per frame effect properties temporalScaler.resetHistory = firstFrameOrSceneCut temporalScaler.colorTexture = currentFrameColor temporalScaler.depthTexture = currentFrameDepth temporalScaler.motionTexture = currentFrameMotion temporalScaler.outputTexture = currentFrameUpscaledColor temporalScaler.reversedDepth = reversedDepth temporalScaler.jitterOffset = currentFrameJitterOffset // Encode scaling effect into commandBuffer temporalScaler.encode(commandBuffer: cmdBuffer) // Encode Metal commands for post processing/game UI drawing for frame here...
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.