Search Unity

셰이더 그래프를 활용한 실험: 적은 리소스로 더 많은 작업 수행하기

, 2월 25, 2021

물리적 기반 렌더링(PBR) 머티리얼 정보를 단일 텍스처 맵으로 압축한 후 컴팩트 셰이더에 레이어링하면 그래픽의 품질을 손상시키지 않고도 셰이더의 런타임 효율성을 개선할 수 있습니다. 아래의 실험을 확인해 보세요.

본 실험은 유니버설 렌더 파이프라인(URP)과 고해상도 렌더 파이프라인(HDRP)을 모두 지원하며, 최대의 학습 효과를 얻으려면 셰이더 그래프에 어느 정도 익숙해야 합니다. 셰이더 그래프를 처음 사용해본다면, 셰이더를 시각적으로 구현하는 방법을 소개하는 페이지세부 정보를 먼저 살펴보세요.

터레인과 유사한 환경에서 아트 에셋으로 작업하는 경우, 일반적으로 더 나은 블렌딩 결과물을 만들어 내기 위해 타일화 가능한 머티리얼의 다중 레이어가 선호됩니다. 그러나 다중 텍스처 샘플의 GPU 성능 비용과 레이어가 셰이더에 추가될 때마다 늘어나는 메모리 사용량은 일부 기기에서는 감당할 수 없는 수준이며, 일반적으로 비효율적입니다.

이 실험을 통해 목표하는 바는 다음과 같습니다.

  • 적은 리소스로 더 많은 작업 수행
  • 메모리 사용량 최소화 및 PBR 머티리얼을 표현하기 위한 텍스처 샘플링 축소
  • 셰이더 명령 최소화
  • 최소한의 스플랫맵/버텍스 컬러 채널로 레이어 블렌딩
  • 스플랫맵/버텍스 컬러의 기능을 확장

 

이 실험의 목표를 달성하는 과정에서 몇 가지 주의 사항이 요구됩니다. 각자 프로젝트의 요구 사항에 따라 더 중요한 것과 희생해도 괜찮은 부분을 결정해야 합니다.

 

1. 단일 텍스처로 압축된 PBR 머티리얼

레이어링하기 전에 PBR 머티리얼 압축에 관해 먼저 알아야 합니다. PBR 머티리얼에는 일반적으로 알베도(BaseColor), 평활도 마스크, 앰비언트 오클루전, 금속성, 노멀에 대한 파라미터가 정의되어 있습니다.

일반적으로 전체 다섯 가지 맵은 세 가지의 텍스처 맵으로 표현됩니다. 텍스처 사용량을 최소화하기 위해 이 실험에서는 금속성과 앰비언트 오클루전을 배제했습니다.


나머지 맵인 알베도, 평활도, 노멀 정의는 최소 두 가지의 텍스처 맵으로 나타내는 것이 일반적입니다. 이를 하나의 맵으로 줄이기 위해서는 채널별로 전처리가 필요합니다.


하나의 텍스처로 압축된 PBR 머티리얼의 최종 결과는 다음과 같습니다.

빨간색 = 노멀 정의#에 대한 dHdu(U 방향에서 derivative의 상대적 높이)
녹색 = 노멀 정의#에 대한 dHdv(V 방향에서 derivative의 상대적 높이)
파란색 = 알베도를 나타내는 선형 그레이스케일 셰이드(셰이더에서 색상 재구성)
알파 = 선형 평활도 맵(표준 평활도 맵)

참고: 텍스처는 sRGB가 선택 해제된 상태로 Unity에 임포트되며 BC7 형식으로 압축됩니다. 다른 플랫폼으로 이식할 경우에는 플랫폼에서 지원되는 4채널 텍스처 형식으로 전환하세요.

맵 프로세싱

알베도

알베도는 보통 RGB 텍스처로 정의되지만 바위, 모래, 진흙, 잔디와 같은 터레인 유형의 머티리얼은 컬러 팔레트가 제한적인 경우가 많습니다. 알베도를 그레이스케일 그레디언트로 저장한 다음 셰이더에서 컬러를 다시 매핑하는 방식으로 이 속성을 활용할 수 있습니다.

RGB 알베도를 그레이스케일 그레디언트로 변환하는 방법은 따로 정해진 것이 없습니다. 이 실험에서는 기존 알베도 맵 채널과 앰비언트 오클루전의 선택적 마스킹을 통해 그레이스케일 알베도를 만들었습니다. 셰이더 컬러를 재구성할 때 주요 색상을 일치시키려면 수동 조정을 고려해 보세요.

RampContrast, Highlight Color, DarkColor를 조절하여 알베도를 재구성합니다.


평활도

평활도는 PBR 머티리얼 정의에서 매우 중요한 요소로 평활도를 보다 정확하게 정의하기 위해 자체 채널이 마련되어 있습니다.

머티리얼의 배리에이션을 위해 간단한 멀티플라이어가 셰이더의 평활도에 추가되었습니다.
(평활도 멀티플라이어를 건너뛰면 셰이더 명령을 줄일 수 있습니다.)


노멀 정의

노멀 맵은 표면의 세부적인 특징을 보여주는 데 중요합니다. 일반적인 PBR 머티리얼은 탄젠트 공간 노멀 맵을 사용합니다. 이 실험에서는 아래와 같은 이유로 표면 그레디언트 프레임워크를 사용하여 사전 변환된 derivative 맵을 선택했습니다. (자세한 정보는 Morten Mikkelsen의 표면 그레디언트 프레임워크 참조).

탄젠트 공간 노멀 맵을 derivative로 사전 변환하려면 이 Photoshop 액션 파일을 사용하세요.

사전 변환된 derivative 맵을 사용하면 다음과 같은 여러 가지 이점이 있습니다.

  • 셰이더에서 derivative 변환을 필요로 하는 표준 탄젠트 공간 노멀 맵에 비해 더 적은 명령을 사용하여 표면 그레디언트로 직접 변환할 수 있습니다.
  • 두 채널(dHdu 및 dHdv)에 저장할 수 있으므로 런타임에 메모리와 텍스처 캐시 사용량이 줄어듭니다.
  • 표면 그레디언트 프레임워크에서 노멀 재구성을 처리하므로(셰이더 명령을 더 적게 사용) 셰이더에서 탄젠트 공간 노멀 맵을 처리할 때 일반적으로 사용하는 파란색 채널 재구성이 필요하지 않습니다.
  • 블렌딩, 마스킹, 또는 텍스처의 강도를 줄이는 방식으로 Photoshop에서 조정할 경우 제대로 작동하며 재정규화가 필요하지 않습니다. 예를 들어 텍스처 강도를 줄이려면 RGB(128,128,0)에 맵을 블렌딩하면 됩니다.

표면 그레디언트 프레임워크와 관련하여 다음과 같은 추가적인 이점이 있습니다.

  • 노멀 범프 맵의 정보가 알베도 블렌드/합성과 같은 방식으로 셰이더에서 블렌딩 및 합성될 수 있으며 올바른 결과가 도출됩니다.
  • 간단하고 정확하게 범프 기여도를 늘리고 줄이고 반전할 수 있습니다.

하지만 탄젠트 공간 노멀 맵의 사전 변환된 derivative에도 다음과 같은 몇 가지 단점은 있습니다.

  • Photoshop 변환을 사용하는 경우, 8비트 텍스처로 정밀도의 균형을 맞추기 위해 노멀 정의가 45도 이상의 각도에서 고정됩니다.
  • 탄젠트 공간 노멀 맵으로 작업하는 데 익숙한 아티스트는 Photoshop을 통해 맵을 사전 변환해야 합니다.

참고: 45도 이상의 각도 고정은 셰이더 기반 derivative 변환에 적용되지 않습니다.

사용 사례에 따라 이 제한의 효과가 더 크거나 작을 수 있습니다. 이 실험에서는 45도 미만인 노멀 방향이 최종 결과에 눈에 띄게 부정적인 효과를 미치지 않습니다. 실제로 이 사용 사례에서는 극단적인 노멀 방향의 원치 않는 반사를 줄이는 방식으로 이점을 제공합니다.

사전 변환된 derivative 맵 텍스처와 탄젠트 공간 노멀 맵 텍스처의 비교

 

사전 변환된 derivative와 탄젠트 공간 노멀 맵 사이의 성능 테스트 차이. 구 모양 범프는 사전 변환된 derivative 맵의 45도 고정으로 인해 일부 아티팩트를 드러냅니다.

 

사전 변환된 derivative 맵을 표면 그레디언트로 다시 매핑하는 그래프.

 

참고: 마스터 스택의 Fragment Normal Space에서 Tangent 대신 World로 설정되었는지 확인하세요.


전체 압축 해제 프로세스

컴팩트 PBR 텍스처를 압축 해제하여 컬러 알베도, 평활도, 표면 그레디언트를 출력하는 전체 서브 그래프.

참고: 표면 그레디언트의 노멀 변환은 서브 그래프 외부에서 이루어지므로 UnpackedSubGraph 출력을 기반으로 머티리얼을 손쉽게 블렌딩할 수 있습니다.

압축 해제된 셰이더의 머티리얼 샘플. 


광원에 대한 각 머티리얼의 반응을 더 정확하게 보여주는 다양한 각도.


2. 머티리얼 레이어링

이 실험에서는 단일 채널 Remap의 계층 기반 레이어링 방식을 선택했습니다. 서브 그래프는 다섯 번의 선형 보간(베이스 포함, 레이어 여섯 개 형성)을 수행합니다.

다양한 방법으로 레이어 가중치를 블렌딩할 수 있습니다. 이 방식은 단일 벡터 입력이 단순하므로 실험 목표에 적합합니다. 따라서 여러 스플랫맵/버텍스 채널을 많이 사용하지 않고도 수많은 레이어링이 가능해집니다.


하지만 이 방법의 단점은 개별 레이어의 가중치를 제어할 수 없다는 점입니다. 블렌딩은 항상 이전 레이어에서의 전환을 통해 이루어집니다. 사용 사례에 따라 이 부분은 기존의 채널별 블렌딩에 비해 제한적인 요소로 작용할 수 있습니다.

 

단일 채널을 다시 매핑하여 여섯 개의 레이어를 나타내는 서브 그래프.

 

위에 표시된 서브 그래프는 계층 기반 블렌딩의 여섯 개 레이어를 사전 정의합니다. 더 많은 레이어를 만들기 위해서는 1을 원하는 블렌드된 레이어의 수에서 1을 뺀 수로 나누고 해당 값 범위를 기준으로 각 레이어를 다시 매핑하면 됩니다.

예를 들어 레이어가 아홉 개인 블렌드 머티리얼의 경우 각 레이어의 Remap 범위는 1/(9-1) = 0.125입니다.

레이어 최소 최대
1 0 0.125
2 0.125 .25
3 .25 .375
4 .375 .5
5 .5 .625
6 .625 .75
7 .75 .875
8 .875 1

단일 채널을 여러 개로 나누므로 셰이딩 범위가 작아집니다.

블렌딩 특징을 보여주기 위해 컬러를 사용하여 테스트된 레이어링 방법.

 

하나의 버텍스 컬러(이 경우, 빨간색 채널)로 압축 해제된 머리티얼의 6개 레이어를 합성하는 머티리얼

참고: PBR 텍스처 3개를 블렌딩하는 것보다 셰이더 그래프에서 샘플로 채워진 PBR 머티리얼 하나의 레이어를 블렌딩하는 것이 더 간단합니다.

레이어 블렌딩은 계층 기반이므로 블렌딩 머티리얼을 설정하기 전에 먼저 레이어의 순서를 계획해 두는 것이 좋습니다.


3. 머티리얼의 기능 확장

레이어 블렌딩에는 채널이 하나만 필요하며(빨간색 버텍스 채널), 나머지 세 가지 버텍스 채널은 추가적인 기능을 제공합니다.

나머지 버텍스 채널을 사용하여 결과를 생성하는 최종 셰이더 그래프

이 실험에서는 Unity 에디터 내에서 Polybrush(패키지 관리자에서 제공)를 사용하여 버텍스 페인팅을 수행했습니다.

이 셰이더에 추천하는 버텍스 페인트 컬러 팔레트.

 

빨간색: 레이어 기여도에 가중치를 적용하는 데 사용됩니다.

빨간색 버텍스 채널 페인팅 데모


녹색: 노멀 범프 기여도를 뒤집거나 줄이거나 추가하기 위해 표면 그레디언트 속성을 설정합니다(-1과 1로 다시 매핑됨).

  • 0은 노멀 범프를 반전합니다(-1)
  • 0.5 값은 노멀 범프를 줄입니다(0)
  • 1은 노멀 범프를 원래 값으로 설정합니다(+1)

녹색 버텍스 채널 페인팅 데모

 

파란색: 물기가 있는 것처럼 보이기 위해 평활도와 표면 그레디언트 범프 스케일을 제어합니다

  • 0 = 변경 없음
  • 255 = 최대 평활도 및 평평한 노멀 맵(물기가 있는 것처럼 보임)

파란색 버텍스 채널 페인팅 데모

 

알파: 알베도 레이어의 가중치를 제어하며, 기여도를 표면 노멀의 Y축을 기준으로 하고 기본 컬러를 흰색으로 설정합니다. 평활도를 변경하지 않으며 기존 표면 레이어 평활도와 범프 속성을 활용합니다.

  • 0 = 눈 없음
  • 255 = 쌓인 눈

전체 레이어가 눈과 상호 작용하는 방식을 보여주기 위해 이전 채널과 결합된 알파 버텍스 채널 페인팅

서로 다른 버텍스 페인팅 채널이 결합된 결과:

프로젝트의 요구 사항에 따라 셰이더 블렌딩 방법과 여러 가지 버텍스 채널/스플랫맵 기능의 설정을 조정할 수 있습니다.


4. 성능 비교

이 실험의 목적은 리소스를 최소화하면서 셰이더 그래프의 기능을 확장하는 것이었습니다. 텍스처가 전처리되고 압축 해제되었는데, 그렇다면 런타임 효율성에는 어떤 결과가 있을까요?

성능 프로파일링은 이런 변화가 낳은 효율성을 보여줍니다. 

6개 레이어가 있는 컴팩트 블렌드 셰이더와 비교하기 위해 6개 레이어를 가진 표준 블렌드 셰이더가 생성되었습니다. 두 셰이더 모두 동일한 기능을 갖춘 동일한 블렌딩 방법을 사용하여 생성되었습니다. 주된 차이점은 스탠다드 셰이더에서는 단일 레이어를 표현하기 위해 세 가지의 서로 다른 텍스처를 사용한다는 것입니다.

프로파일링을 위해 대상 플랫폼의 유니버설 렌더 파이프라인을 사용하여 단일 메시가 블렌드 머티리얼과 함께 화면에 렌더링되었습니다.


모바일 메모리 및 성능 프로파일

모바일(Android)을 위한 텍스처 압축:

모바일용 1024×1024에서 알베도, 마스크, 노멀 맵을 사용하는 표준 PBR:

  • 6x 알베도 맵 ASTC 10×10 = 6x 222.4 KB
  • 6x 마스크맵 ASTC 8×8 = 6x 341.4 KB
  • 6x 노멀 맵 ASTC 8×8 = 6x 341.4 KB

총 텍스처 메모리 사용량 5.431 MB

 

모바일용 1024×1024에서 컴팩트 PBR:

  • 6x PackedPBR 텍스처 ASTC 8×8 = 6x 341.4 KB 

총 텍스처 메모리 사용량 2.048 MB

 

6개 레이어가 있는 컴팩트 머티리얼을 사용할 경우 모바일(Android)에서의 텍스처 메모리 소비량이 약 62% 감소되어, 절반 이상의 절감 효과가 있습니다.


Adreno 630(Snapdragon 845) 탑재 모바일 Android/Vulcan, Snapdragon 프로파일 결과:

  • 런타임에서 텍스처 메모리 읽기 약 70% 감소.
  • 표준의 경우 렌더링에 9971020클럭 소요.
  • 컴팩트의 경우 렌더링에 6951439클럭 소요.

컴팩트 머티리얼은 화면상에서 약 30% 더 빠르게 렌더링됩니다.


Snapdragon Profiler의 프로파일링 결과입니다.


PC 메모리 및 성능 프로파일

1024×1024에서 알베도, 마스크, 노멀 맵을 사용하는 표준 PBR:

  • 6x 알베도 맵 DTX1 = 6x 0.7 MB
  • 6x 마스크맵 DXT5/BC7 = 6x 1.3 MB
  • 6x 노멀 맵 DXT5/BC7 = 6x 1.3 MB
    총 텍스처 메모리 사용량 19.8 MB

 

1024×1024에서 컴팩트 PBR:

  • 6x PackedPBR 텍스처 BC7 = 6x 1.3 MB 

총 텍스처 메모리 사용량 7.8 MB 

 

6개 레이어를 사용하는 컴팩트 머티리얼의 경우 PC에서 텍스처 메모리 사용량이 60% 감소(절반 이상 절감)합니다.

 

2880×1800로 렌더링하는 Radeon 460 Pro 탑재 PC 노트북, RenderDoc 프로파일 결과:

  • 6개 레이어 표준 블렌드의 불투명 오브젝트 드로우: 5.186ms.
  • 6개 레이어 컴팩트 블렌드의 불투명 오브젝트 드로우: 3.632 ms.
    컴팩트 머티리얼은 화면상에서 약 30%* 더 빠르게 렌더링됩니다.
    *RenderDoc 프로파일 값은 변동될 수 있으며, 30%는 샘플의 평균입니다.

 

2560×1440로 렌더링하는 nVidia GTX 1080 탑재 PC 데스크톱, nSight 프로파일 결과:

  • 6개 레이어 표준 머티리얼을 위한 불투명 오브젝트 렌더링: 0.87 ms
  • 6개 레이어 컴팩트 머티리얼을 위한 불투명 오브젝트 렌더링: 0.48 ms

컴팩트 머티리얼은 화면상에서 약 45% 더 빠르게 렌더링됩니다.


nSight의 프로파일링 결과.

 

콘솔 성능 프로파일

PlayStation 4에서 컴팩트 머티리얼을 사용하면60%의 메모리 절감효과가 있으며 PS4에서 PC와 동일한 압축을 사용하므로PC에서의 효과도 동일합니다.

 

1920x 1080에서의 PS4 기본 렌더링, Razer 프로파일 결과:

  • 6개 레이어 표준 머티리얼을 위한 불투명 오브젝트 렌더링: 2.11 ms
  • 6개 레이어 컴팩트 머티리얼을 위한 불투명 오브젝트 렌더링: 1.59 ms
  • 컴팩트 머티리얼은 화면상에서 약 24.5% 더 빠르게 렌더링됩니다.

PS4 Razor Profiler의 프로파일링 결과.


요약하자면, 6개 레이어를 가진 컴팩트 PBR 셰이더를 사용할 경우 성능상 이점이 있으며 상당한 양의 메모리가 절감됩니다. 머티리얼 압축 해제 시 더 많은 텍스처를 샘플링하는 경우보다 ALU가 더 많이 사용되므로 GPU 성능의 변화는 흥미롭지만 예상한 대로였습니다.

샘플 프로젝트 다운로드

셰이더 그래프와 서브 그래프가 포함된 이 샘플 프로젝트는 아래에서 다운로드할 수 있습니다.

[여기에서 다운로드], Unity 2020.2.5f1, HDRP 10.3.1
[여기에서 다운로드], Unity 2020.2.5f1, URP 10.3.
[여기에서 다운로드], 탄젠트 공간 노멀 맵을 derivative로 사전 변환하는 Photoshop 액션 파일.


요약

프로젝트의 유니버설 렌더 파이프라인 버전 스크린샷.

이 실험의 주요 구성 요소는 다음과 같습니다.

  • 커스텀 머티리얼을 위한 셰이더 그래프
  • 사전 변환된 derivative
  • 표면 그레디언트 프레임워크
  • 알베도 컬러 재구성
  • 단일 채널 레이어 블렌딩
  • UpVector 블렌딩 기법, 버텍스 채널 블렌딩을 통한 평활도 및 범프 제어

이 실험은 셰이더 그래프를 사용하여 아름다운 그래픽을 효율적으로 만드는 방법을 보여줍니다. 이 사례를 통해 아티스트와 개발자가 Unity 프로젝트에서 미적인 경계를 넓혀 가는 데 영감을 얻을 수 있기를 바랍니다.

 

작성자 소개

리날도 챤(테크니컬 아트 디렉터, R&D, Spotlight 팀)은 실시간 조명 및 렌더링 시스템에 대한 열정이 많은 실시간 3D 아티스트입니다.

PlayStation 2 시절에 해당 분야의 업무를 시작한 리날도는 텍스처링부터 최종 렌더링된 씬 생성에 이르기까지 포괄적인 아티스트 워크플로에 관한 지식을 10년 이상 쌓아 왔습니다. 유니티 테크놀로지스에 합류하기 전에는 BioShock 2The Bureau: XCOM Declassified마피아 III 같은 AAA 게임 개발에 참여했습니다.

현재는 Unity 렌더링 기능의 내부 개발과 표준 구축을 지원하는 한편 고객과의 협업을 바탕으로 프로젝트를 진행하여 고객이 진정한 잠재력을 실현하도록 지원하고 있습니다.

21 replies on “셰이더 그래프를 활용한 실험: 적은 리소스로 더 많은 작업 수행하기”

Hello! great job!
I am really curious to adding this some real time mesh gen for close up camera.
I noticed that this terrain is realistic from far but not from close up camera.

I want to make a tech that converts these texture 3d effect to convert 3d high res vertex like tessellation when player look in front of terrain . So then whole world becomes Realistic!

For the moment, there’s no timeline I can give you for the tessellation shader graph functionality.
However there’s definitely a few things you can try to experiment with your idea.

For the vertex displacement, it is already supported at the moment with Shader Graph.
Just need to apply it to a highly tessellated mesh.
Then to test it even further, use the LOD Group system that has multiple progression of polygon complexity on the mesh to see if the result is as desired.
While this doesn’t give you the smooth transition of the auto tessellation system, it gives you a general idea on how the 3D displacement will look like.

Looking at your video, you might be interested in looking at Gradient Map technique.
You can try this in Shader graph.

Connect Sample 2D of a Grayscale image (R) to -> (Time) input of “Sample Gradient” node with a Gradient property connected to it’s Gradient input -> output of the sample gradient to base color to see the results.

This technique is known in compositing software and Photoshop (I believe GIMP has similar functionality). That way you can preview how the gradient get’s mapped to color the grayscale images.
Give it a shot.

Good article but relying on photoshop actions is a negative point.

It would be better to do a quick shader inside Unity to do the same result to process textures. It’s more reliable this way, can easily be absorbed into existing toolchains and can be saved as you’d like inside Unity.

I do this for my own conversions and so on, plus most people do not have an adobe subscription, only professionals tend to.

Feedback taken. The same concern was posted by mylk below in comment section. In hindsight I should have included the shader sub-graph (or at least a screenshot) to show what the ts normal to derivatives action try to accomplish. For now, please follow the link I posted in mylk reply to get the subgraph.
In any case, thank you for taking the time to read the blog and posting feedback.

No problem, I felt the article was one of the best I’d ever seen in recent times from Unity, and hope there will be more. I could only find one minor problem as above :-)

Pretty nice article and clever techniques! Normal derivates? I learned something new today :) Keep it up!

When i convert my project to the latest unity all my shaders become more shiny !
i think need more work to stabilize.

Nice writeup!

A few thoughts:
– Texture Compression favors the green channel, and packs alpha separately. So your most important information should be in the green and alpha channels, with the least important in blue.
– Splat map texturing is almost always memory bound – in most cases, the cost difference of avoiding a few instructions is negligible, so focusing on better packing of textures is the way to go.
– Consider generating your smoothness/ao from your luminance and normal, with user controls to range map the smoothness. You should be able to get a good approximation from both with only a few instructions.
– In the Walking Dead game I did for mobile, we reduced our terrain to a single texture sample. We packed 4 luminance channels into a single texture, then stored 4 Cb and Cr in the vertices (yCbCr color space). We then generated a height value from the luminance for height blending, unpacked the 4 colors, and blended. We also produced a simple normal from the luminance, though for more modern devices I’d like just use the derivatives of the worldPos to get a decent approximation if I didn’t need to get close to the terrain.
– Being able to properly branch in the shader and use dynamic flow control would have seen a similar reduction in memory bandwidth usage. It’s sad that no shader graph I’ve seen can handle this properly. You would have hit six samples without any packing of textures, and 2 with packing.
– Given that your shader only ever uses 2 of the samples on any given pixel (due to the 1 channel splat map), you should never have to sample all 6 textures. You could achieve this in two ways- the first is to use a texture array to store your textures and determine which two texture indexes need to be sampled for the pixel, and only sample those. The second would be to branch around the unused textures, which unfortunately requires proper dynamic flow control.
– Note that getting down to two samples and using dynamic flow control, you’d be able to add stochastic height map sampling or triplanar texturing to this and have a similar cost to what you have now, both of which greatly help with the quality of terrain texturing. Properly branch sampled, these would be 4-6 samples per pixel using the combined approaches.

Really nice to get some insights from real world experience.
There are definitely alternatives trade-offs that can be made.
One of the priority in my experiment is to preserve the smoothness information as best as possible.
It would be interesting to experiment with what you suggest on generating smoothness/ao from luminance and normal, I have never tried that.

Is it possible to share all the needed actions to pre-convert tangent space normal maps to derivatives, for those who don’t use Photoshop?

Comments are closed.