Search Unity

셰이더 그래프의 표면 그레디언트 프레임워크를 이용한 노멀 맵 합성

, 11월 20, 2019

Unity Labs는 최근 논문에서 기술 아티스트와 그래픽 엔지니어 모두가 쉽고 직관적으로 활용할 수 있는 새로운 노멀 맵 블렌딩 프레임워크를 소개했습니다. 이 방식은 기존의 여러 제약점을 극복했습니다.

실시간 컴퓨터 그래픽에 노멀 매핑이 도입된 이후, 노멀 맵을 정확하게 계산하여 조합하거나 블렌딩하여 시각적으로 우수한 결과물을 도출하는 것은 매우 숙련된 그래픽 엔지니어에게도 까다로운 일이었습니다. 과거에는 월드 공간에서 노멀을 블렌딩하는 방식이 사용되었으나, 그 결과물은 부정확하고 만족스럽지 않았습니다. ‘표면 그레디언트 기반의 범프 매핑 프레임워크‘ 논문은 기존 노멀 매핑의 제약을 극복하는 새로운 프레임워크를 제시합니다. 이를 활용하면 기술 아티스트와 그래픽 엔지니어가 서로 다른 형태의 범프 맵을 조합하는 경우에도 쉽고 직관적인 방식으로 작업할 수 있습니다.

최신 컴퓨터 그래픽 분야에서 풍부하고 정교한 환경을 구현하려면 반드시 머티리얼 레이어링이 필요합니다. 머티리얼 레이어링을 위해서는 여러 세트의 텍스처 좌표에 걸친 범프 매핑이 지원되어야 하며, 여러 범프 맵을 블렌딩해야 합니다. 또한 오브젝트 공간 노멀 맵의 범프 스케일을 조정한 후 탄젠트 공간 노멀 맵 및 3면 투영(triplanar projection)과 올바르게 합성 및 블렌딩할 수 있어야 합니다.

과거의 실시간 그래픽스는 텍스처 좌표에서 한 세트의 범프 매핑만 지원했습니다. 범프 매핑을 위해서는 모든 버텍스의 데이터를 미리 계산하고 저장해야 합니다(탄젠트 공간). 더 많은 텍스처 좌표 세트를 지원하려면 그에 비례하여 버텍스당 추가 공간을 확보해야 하며, 이 경우 절차적 지오메트리/텍스처 좌표나 고급 지오메트리 변형은 지원되지 않습니다.

HDRP(High Definition Rendering Pipeline, 고해상도 렌더 파이프라인)는 표면 그레디언트 기반의 범프 매핑 프레임워크를 활용하여 이 문제를 해결합니다. HDRP에서는 첫 텍스처 좌표 세트에 버텍스마다 기존의 탄젠트 공간을 사용하여 MikkTSpace를 철저하게 준수합니다. 이는 로우 폴리곤의 단단한 표면 지오메트리용으로 생성된 베이크된 노멀 맵과 같은 난이도 높은 사례에 필수적입니다.

이후의 모든 텍스처 좌표 세트의 경우 픽셀 셰이더에서 즉각적으로 탄젠트 공간을 계산할 수 있습니다. 따라서 모든 텍스처 좌표 세트에 노멀 매핑을 지원하고, 단순한 스키닝을 넘어 절차적 지오메트리 및 고급 변형과 함께 사용할 수 있습니다.

논문에 수록된 것과 같이 표면 그레디언트를 누적하는 방식으로 올바른 블렌딩을 할 수 있습니다.

지금까지 이 프레임워크는 HDRP에 빌드된 셰이더를 사용하는 경우에만 이용할 수 있었습니다. 하지만 이제 Github에서 Unity 2019.3.0b4와 셰이더 그래프 7.1.2 버전으로 제작된 샘플 씬을 다운로드하여 셰이더 그래프용 프로토타입 버전을 사용해 볼 수 있습니다. 프레임워크는 셰이더 그래프용 하위 그래프로 구현되었으며, 각 하위 그래프는 빌트인 노드만으로 만들어졌습니다.

이 방법은 다음 단계로 구성됩니다.

  1. 각 범프 맵을 위한 표면 그레디언트를 만듭니다.
  2. 사용자 정의 범프 스케일을 이용하여 각 표면 그레디언트를 확대/축소합니다.
  3. 모든 표면 그레디언트를 하나로 추가(또는 블렌딩)합니다.
  4. 리졸브하여 범프 매핑된 최종 노멀을 생성합니다.

이 프레임워크를 따르면 탄젠트/오브젝트 공간 노멀 맵, 평면 투영, 3면 투영 및 절차적 3D 텍스처 형태의 범프 맵까지 모든 형태의 범프 맵이 표면 그레디언트를 생성하여 일관성 있게 처리할 수 있습니다. 따라서 더욱 쉽게 적절한 블렌딩을 할 수 있습니다.

샘플에는 이 프레임워크를 사용하는 여러 그래프가 포함되어 있으며, 각 그래프는 다른 프레임워크 사용 사례를 나타냅니다. 다음 섹션에서 일부 사례를 살펴보겠습니다.

기본 노멀 매핑

basic 셰이더의 그래프는 흐름뿐 아니라 버텍스 탄젠트 공간을 사용하는 경우와 절차적 탄젠트 공간을 사용하는 경우의 차이점도 보여줍니다.

  1. basisMikkTS.shadersubgraph 하위 그래프는 기존의 탄젠트와 바이탄젠트를 생성합니다. 이 방식은 UV0에만 유효합니다.
  2. 모든 텍스처 좌표에서 GenBasisTB.shadersubgraph 하위 그래프를 이용하여 절차적 탄젠트와 바이탄젠트가 도출됩니다.

이 샘플은 UV0를 사용하므로, 블랙보드의 부울(Boolean) 프로퍼티가 토글로 작용합니다. 다른 UV 세트에는 셰이더에서 두 번째 방법을 사용해야 합니다.

탄젠트 공간 노멀 맵 샘플링에는 특수한 하위 그래프(tex ts norm to deriv.shadersubgraph)가 사용되었습니다. 이 하위 그래프는 vector3가 아닌 derivative라는 vector2를 반환합니다. 같은 UV 세트를 사용하여 탄젠트 공간 노멀 맵을 샘플링하는 경우 derivative를 추가하거나 블렌딩할 수 있습니다. 단, 다른 UV 세트나 다른 형태의 범프 맵 사용 시 추가 및 블렌딩을 지원하려면 표면 그레디언트를 추가하거나 블렌딩해야 합니다.

표면 그레디언트를 생성하려면 위에 표시된 Surfgrad TBN.shadersubgraph 하위 그래프를 사용합니다.

표면 그레디언트의 범프 스케일을 조절하려면 간단한 multiply 노드를 사용하거나 Apply Bump Scale.shadersubgraph 하위 그래프를 사용할 수 있습니다.

이후 Resolve Surfgrad.shadersubgraph 하위 그래프를 사용하여 표면 그레디언트를 범프 매핑된 최종 노멀로 전환할 수 있습니다.

오브젝트 공간 노멀 맵

오브젝트 공간 노멀 맵 역시 표면 그레디언트 기반의 워크플로에 통합됩니다. 이를 통해 범프 매핑 강도를 조절하고, 오브젝트 공간 노멀 맵을 다른 형태의 범프 맵에 블렌딩/추가할 수 있습니다.

아래는 OS nmap basic 그래프입니다.

먼저 샘플링한 노멀을 오브젝트 공간에서 월드 공간으로 변환합니다. 최적의 결과를 위해서는 Normal 타입으로 변환하는 것이 바람직하지만, 이는 셰이더 그래프의 빌트인 변환에서 지원되지 않으므로 Direction을 선택합니다. 다음으로 Normal to surfgrad.shadersubgraph 하위 그래프를 사용하여 노멀을 표면 그레디언트로 변환합니다. 일단 범프를 표면 그레디언트로 표현할 수 있게 되면, 다른 형태의 범프 맵을 처리하는 경우와 마찬가지로 범프 스케일을 조정하고 여러 표면 그레디언트를 추가/블렌딩한 다음 리졸브를 거쳐 최종 노멀을 생성합니다.

3면 투영

3면 투영은 범프 맵이 3D 텍스처로 사용될 때의 특수한 사례를 나타냅니다. ‘표면 그레디언트 기반의 범프 매핑 프레임워크‘ 논문은 이를 올바르게 수행하기 위한 계산식 전체를 설명합니다. 아래는 기존의 노멀 맵 블렌딩(왼쪽)과 표면 그레디언트 기반의 방식(오른쪽)을 비교한 것입니다(출처: Siggraph 2018의 Unity 발표).

 

Triplanar 그래프는 하위 그래프 Triplanar to surfgrad.shadersubgraph를 사용하여 3면 투영으로 표면 그레디언트를 생성하여 텍스처를 블렌딩합니다. 이전처럼 범프 스케일을 사용하여 표면 그레디언트를 조절하거나, 표면 그레디언트를 다른 표면 그레디언트에 추가하거나 블렌딩하고, 리졸브하여 최종 노멀을 도출할 수 있습니다.

여러 개의 범프 맵 블렌딩/추가하기

이 프레임워크의 가장 큰 장점 중 하나는 절차적 UV를 포함하여 범프 맵의 카테고리와 개수 및 텍스처 좌표 세트 수에 상관없이 올바른 블렌딩이 가능하다는 것입니다. 아래의 예는 타일화 가능한 탄젠트 공간 노멀 맵, 오브젝트 공간 노멀 맵과 절차적 3D 텍스처를 위한 범프 맵 등 3가지 범프 맵이 블렌딩된 모습입니다.

Mixing 그래프는 아래와 같이 블렌딩을 실행합니다. 범프 맵은 각각의 범프 맵 강도에 따라 표면 그레디언트를 생성하며, 표면 그레디언트를 추가하거나 블렌딩하여 조합할 수 있습니다. 마지막으로, 조합된 표면 그레디언트가 리졸브되어 최종 노멀이 생성됩니다.

추가 예시

Unity 샘플 씬에는 노멀 매핑된 표면에 3면 투영 적용, 시차 보정(parallax correction) 또는 POM(시차 오클루전 매핑) 후 상세 노멀 매핑 적용, 하이트맵에 범프 매핑, 절차적 3D 텍스처를 이용한 범프 매핑 등 다양한 예가 포함되어 있습니다.

  • (a)3면 투영 적용
  • (b)노멀 매핑 후 3면 투영 적용

2019.3의 새로운 기능

이제 셰이더 그래프에서 시각적으로 셰이더를 제작하고 비주얼 이펙트 그래프를 사용하여 커스텀 비주얼과 렌더링 동작을 만들 수 있습니다. 또한, 그래프에서 정적 브랜치를 만들 수 있는 셰이더 키워드가 추가되어 자체 셰이더 LOD 시스템 생성 등에 활용할 수 있습니다. 이와 더불어 DOTS 애니메이션의 버텍스 스키닝 지원이 추가되어 더 나은 품질의 물과 나뭇잎을 구현할 수 있습니다. 또한 스티커 메모에 프로젝트 팀원을 위한 메시지를 남겨 워크플로를 향상할 수 있습니다. 마지막으로, 절차적 셰이프와 패턴을 생성하는 방법을 수식으로 보여주는 절차적 패턴 하위 그래프 샘플이 추가되었습니다.

새로운 프레임워크에 대한 피드백은 셰이더 그래프 포럼에 남겨주세요!

11 replies on “셰이더 그래프의 표면 그레디언트 프레임워크를 이용한 노멀 맵 합성”

“We have added Shader Keywords, which can create static branches in your graph. Use this for things like building your own Shader LOD system.”

This merits its own blog post or training session. Anyone planning to address this? This is the first I’ve heard of Shader Graph being capable of complex branching akin to Unreal shaders.

Also, with complex techno-posts like this blog, why not say something like:

“To sum it up, [insert thing this blog post helps you do here] will allow you to render textures in multiple ways for things like [insert one use-case here], [insert another use-case here], and [insert final use-case here].

More info will be available for each of these use cases here:
[insert URL(s)]”

Most of the time Unity’s tech blog posts tend to fly way over most people’s heads. This could ease some unnecessary tension from users who didn’t understand what Unity was actually capable of. Capeesh?

Hi Morten,
Why not compute the tangent also for the UV0 using the tangent generation calculation from your paper?
That can avoid vertex data + interpolation and fix for blendshape tangent.
Thanks!

Hi Alundra,

You absolutely can use the “on the fly” approach across the board and in my experience it works perfectly well on the vast majority of cases. Where it falls short is when people want to do tricky low poly hard surface cases without bevels (ie. low poly cases with very bad vertex normals). For these you still need to use vertex level tangent space to get strict compliance and continuity.
In the context of blend shapes, if you are using the built-in Lit shader in hdrp, I’d say just use a different uv set than uv0 and you’ll get the “on the fly” approach. As for Shader Graph using this framework you can do it however you like. Using “on the fly” method on everything is a perfectly reasonable to ship a game and as you point out it means fewer interpolators. Heavy use of interpolators puts pressure on the parameter cache which leads to starvation of gpu cores.

hi morton,
thanks a lot for this heads up, much appreciated.
but even more important i think is the fact that we actually see some efforts from all the people unity acquired during the last years.
what is natalia working on, what part did sebastian aalton took over? you are so invisible to the community!

Hi Lars,

First thank you for expressing direct interest in our work. We are often working on a collective effort and our corner of this will most often not turn into an individual blog post. In my case I wrote the tiled (fptl) and the clustered light/refl probe list building that is in HDRP.

Comments are closed.