Search Unity

Unity 2018.3 셰이더 그래프 업데이트: 릿 마스터 노드

, 12월 19, 2018

2018.3에서 셰이더 그래프에 고해상도 렌더 파이프라인(HDRP)을 위한 새로운 마스터 노드가 도입되었습니다. 릿 마스터(Lit Master)라고 하는 이 새 마스터 노드를 이용해 HDRP의 고급 셰이딩 기능들을 셰이더 그래프에서 사용할 수 있습니다.

HD 릿의 고급 기능(또는 HD Lit AF라고도 함)으로는 코트 마스크(coat-mask), 이리데선스(iridescence), 반투명(translucency), 피하 산란(subsurface scattering), 이방성(anisotropy)이 있습니다.

이번 블로그 게시물에서는 이러한 고급 기능에 대해 알아보고, 셰이더 그래프를 사용하여 HDRP에서 멋진 에셋을 만드는 방법을 살펴보겠습니다. 이 블로그 게시물에서 사용할 샘플 프로젝트는 GitHub에서 다운로드할 수 있습니다. 이 샘플 프로젝트에는 이리데선스와 반투명을 많이 활용하는 분재와 나비가 포함되어 있습니다.

시작하기

멋진 씬을 만들고자 한다면 먼저 몇 가지 주요 사항을 숙지해야 합니다. 첫째, 이 마스터 노드는 HDRP 내에서만 작동합니다. 둘째, 경량 렌더 파이프라인(LWRP)에는 이 노드에서 사용하는 고급 셰이딩 옵션이 없습니다. PBR 표면에 기본 입력만 사용할 경우, PBR 마스터 노드를 사용하는 것이 좋습니다.

HDRP를 실행하는 가장 빠른 방법은 런처 또는 Unity Hub에서 High-Definition RP를 선택하는 것입니다. 이 게시물에서 예시로 보여드리는 나비 프로젝트도 HDRP를 사용합니다.

고해상도 RP 템플릿으로 새 프로젝트를 만들 경우 프로젝트의 HDRP 버전을 4.1.0 프리뷰에서 4.6.0 프리뷰로 업데이트하는 것이 좋습니다. HDRP 버전을 업데이트하려면 Windows > Package Manager에서 Package Manager를 실행합니다. 그런 다음 패키지 리스트에서 High Definition RP 패키지를 선택하면 우측 상단에 Update to 버튼이 표시됩니다. 우측의 버전이 4.6.0인지 확인한 다음 Update to 버튼을 누릅니다.

HDRP 프로젝트에서 작업 중일 때 Create > Shader > Lit Graph 버튼을 눌러 새로운 HD 릿 셰이더 그래프를 만들 수 있습니다. 해당 버튼을 누르면 사용 가능한 새로운 입력 옵션이 즉시 표시됩니다. HDRP 내에서 HD 릿 머티리얼을 사용한 적이 없다면 BentNormalCoatMask 옵션이 낯설게 느껴질 수 있습니다.

CoatMask 값을 0 이상(최대 1)으로 올리면 표면에 투명한 “코트” 효과가 추가됩니다. 이렇게 하면 오브젝트 위에 얇고 투명한 빛나는 막을 칠한 것처럼 보입니다. 메시 위에 에폭시 코팅을 칠한다고 생각해 보면 됩니다. CoatMask는 자동차의 외관 페인트를 시뮬레이션하기 위한 머티리얼을 만들 때 많이 사용됩니다.

사과에 할당된 머티리얼의 CoatMask 값을 0 1 사이에서 변경해보고 있습니다.

CoatMask는 릿 마스터 노드의 기본 입력이긴 하지만, 이 옵션은 원하는 모습을 꼭 만들어야 하는 경우에만 사용하는 것이 좋습니다. Coat Mask 값을 0 이상으로 올리면 셰이더 비용이 증가합니다.

BentNormal을 사용하면 에셋의 간접 조명(GI)을 개선하는 특별한 맵을 적용할 수 있습니다. AO 맵과 함께 사용하면 스페큘러 오클루전을 제공하여 메시의 반사에 오클루전을 추가할 수 있습니다. Substance Designer, XNormal, Knald 등의 애플리케이션에서 벤트 노멀 맵을 생성할 수 있습니다. (하지만 벤트 노멀 맵이 올바르게 작동하려면 생성할 때 코사인 분포를 사용해야 합니다.)

스페큘러 오클루전에 벤트 노멀 맵을 사용하려면 셰이더 설정에서 Specular Occlusion Mode를 From AO And Bent Normal로 설정해야 합니다. 셰이더 그래프 마스터 노드 우측 상단의 톱니바퀴 아이콘을 선택하면 이러한 설정에 액세스할 수 있습니다.

스페큘러 오클루전 모드에서는 Off, From AO only, From AO and Bent Normal, Custom의 4가지 옵션을 사용할 수 있습니다.

Custom을 선택하면 마스터 노드에 새로운 입력을 추가하여 사용자가 스페큘러 오클루전을 완벽하게 제어할 수 있습니다. 예를 들어 이 입력을 0으로 설정하면 모든 반사가 비활성화됩니다.

마스터 노드의 설정 메뉴에는 Lit AF 옵션이 로드되어 있습니다. 여기에서 셰이더 그래프에서 사용할 고급 머티리얼 유형과, 표면의 투명 여부 등의 기타 유용한 표면 정보를 설정할 수 있습니다.

여기서 활성화한 설정의 조합에 따라 노드 크기가 매우 커지고 셰이더 비용이 매우 증가할 수 있습니다.

위에 보이는 옵션이 바로 Lit AF입니다.

데모 프로젝트에서 구현된 고급 머티리얼

나비 샘플 프로젝트에서는 고급 머티리얼 유형으로 Iridescence와 Translucenct를 많이 사용합니다.

먼저 아래의 나비 데모를 한 번 확인해 주세요.

나비의 날개는 작은 비늘로 겹겹이 구성되어 표면이 매우 정교합니다. 이로 인해 사람의 눈에는 나비의 날개가 먼지를 날리는 것처럼 보입니다. 비늘의 반사도는 매우 높으며, 날개의 외골격을 형성하는 투명한 단백질인 키틴층 위에 배치됩니다.

생물학적으로 살펴본 이 정보를 셰이딩 모델에 적용하여 해석해보면 나비의 날개는 투명성, 이리데선스, 금속성을 가지고 있다는 것을 알 수 있습니다.

이리데선스는 표면의 조명 각도가 변화함에 따라 표면의 컬러가 점진적으로 변하는 현상으로 HDRP에서만 사용할 수 있는 고급 셰이딩 기술 중 하나입니다.

이 동영상은 이리데선스의 활용법을 보여줍니다. 이리데선스를 사용하면 나비의 날개가 퍼덕일 때 컬러를 변경합니다.

Material TypeIridescence로 변경하면 머티리얼 노드에 새로운 옵션인 IridescenceMaskIridescenceThickness가 나타납니다.

이 간단한 그래프로 두 가지 새로운 입력의 효과를 간단하게 살펴볼 수 있습니다.

IridescentThickness 프로퍼티 증가

이 이미지에서 IridescenceMask가 이리데선스 효과의 강도를 0에서 1(검은색에서 흰색)로 조정하고, IridescentThickness가 이리데선스 효과로 만들어진 컬러 그레디언트를 변경하는 방식을 살펴볼 수 있습니다.

이리데선스를 사용할 때 물리적 정확성을 확보하려면 IridescenceThickness가 nm 값이라는 점을 알아두면 좋습니다. 연결된 입력 값 0~1은 0~3000nm으로 다시 매핑됩니다.

샘플로 사용된 이 나비는 모르포 나비라서 날개 뒤쪽의 컬러와 패턴이 완전히 다릅니다.

이 효과를 구현하기 위해 두 개의 날개 세트에서 노멀이 서로 반대 방향을 향합니다. 광원이 날개를 통과하는 효과를 내기 위해 반투명한 머티리얼 유형을 이용하여 하단 면을 셰이딩합니다.

반투명한 머티리얼은 광원이 표면을 통과하는 효과를 내고 두께 맵(Thickness Map)과 확산 프로파일을 사용하여 이 광원의 세기에 변화를 줍니다.

확산 프로파일을 사용하는 머티리얼 유형에는 Subsurface Scattering, Subsurface Scattering with Transmission, Translucent(투과에만 해당)의 세 가지 “형식”이 있습니다.

여기서 투과(Transmission)란 광원이 오브젝트를 완전히 통과하여 반대편으로 나올 수 있음을 의미합니다(나비 샘플에 사용). 투과를 사용하는 머티리얼은 두께 맵을 추가하여 표면을 통과하는 광원의 강도를 조절할 수 있습니다.

확산 프로파일을 사용하는 방법을 이해하려면 먼저 피하 산란(Subsurface Scattering)에 대한 지식과 활용법을 아는 것이 도움이 됩니다.

피하 산란은 약간 반투명한 표면에 사용됩니다. 낙엽, 과일과 채소, 보석, 천, 이, 눈, 피부 등 다양한 표면 유형이 여기에 해당됩니다. 광원이 머티리얼의 표면에 진입하면 머티리얼 내부에서 산란한 다음 진입했던 지점과 다른 지점의 표면에서 빠져나옵니다.

표면에서 피하 산란을 활용하면 전체 광원 효과가 부드러워지고, 주변 영역에 광원을 확산하면서, 세부적인 표면 디테일이 흐려지는 효과를 연출합니다.

광원이 오브젝트를 더욱 깊이 통과할수록 광원이 더욱 약해지고 확산됩니다. 광원이 통과할 수 있는 “거리”는 두께 맵을 통해 제어하는 값입니다. 이 값이 작을수록(맵에서 검은색에 가까울수록) 피하 산란의 효과가 더욱 강해집니다.

두께 맵은 수동으로 페인트하거나, Substance Designer 또는 Maya 등의 외부 애플리케이션으로 생성할 수도 있습니다. 맵을 생성하려면 메시 표면 노멀을 반전하고, 앰비언트 오클루전을 베이크한 다음, 앰비언트 오클루전 맵을 반전합니다.

산란의 총량 및 각도와, 결과적으로 생성되는 컬러(광원 확산으로 표시되는 컬러) 는 확산 프로파일에서 조절합니다.

HDRP에서 Diffusion Profile Settings는 확산 프로파일을 포함하는 고유한 유형의 에셋입니다.

샘플 프로젝트를 사용 중이거나 프로젝트 템플릿을 통해 HD 프로젝트로 실행했을 경우 이미 Diffusion Profile Settings 에셋이 포함되어 있습니다. 새로운 에셋을 추가하려면 Create > Rendering > Diffusion Profile Settings에서 추가할 수 있습니다. 또한 이를 HD Render Pipeline Asset에 할당해야 합니다. HD 에셋은 Project Settings > Graphics > Scriptable Render Pipeline Settings에서 손쉽게 찾을 수 있습니다.

Settings 에셋이 존재할 경우 이 에셋에는 현재 프로젝트에 사용 중인 Diffusion Profile Settings에 대한 레퍼런스가 포함됩니다.

나비 프로젝트에는 두 개의 커스텀 확산 프로파일이 포함되어 있습니다. 하나는 날개의 뒷면에, 다른 하나는 나뭇잎에 사용됩니다.

확산 프로파일에는 광원이 메시 전체에 산란되는 방식을 조절할 수 있도록 다양한 커스터마이징 옵션이 포함되어 있습니다.

Scattering Distance는 광원의 산란 강도와 컬러를 제어합니다. 간단히 말해, 이 옵션을 사용하면 오브젝트의 머티리얼에 따라 각 컬러 채널에서 광원이 흡수하거나 반사하는 양을 제어할 수 있습니다. 예를 들어 사람의 피부는 빛이 산란할 때 피부 밑에 있는 혈액과 조직의 컬러로 인해 붉은 빛을 띱니다.

Index of Refraction은 광원이 표면에 진입할 때 굴절되는 각도와 관련되어 있습니다. 이 값은 측정 가능하며, 다양한 온라인 리소스에서 일반적인 머티리얼의 굴절률(IOR)을 확인할 수 있습니다. 예를 들어 사람 피부의 굴절률은 1.4이고, 기타 여러 머티리얼의 굴절률은 1.3에서 1.5 사이의 값입니다.

Texturing Mode는 피하 산란을 사용하는 오브젝트에만 적용됩니다. 대부분의 경우 알베도를 흐리게 하여 광원을 부드럽게 보이게 하는 전/후 산란(pre/post-scatter)을 사용합니다. 하지만 기존 피하 산란으로 인해 알베도가 이미 부드러워져 있을 경우에는(예: 스캔본 또는 사진에 존재하는 피하 산란) 후 산란만 사용할 수 있습니다.

나머지 옵션은 투과를 사용하는 경우에만 적용됩니다(Translucent 또는 Subsurface Scattering with Transmission). Transmission Mode를 변경하면 그림자 처리에 사용되는 로직이 변경됩니다. 보통 나뭇잎과 같이 매우 얇은 오브젝트에는 Thin만 사용하고, 그 이외의 경우에는 Regular를 사용합니다.

Transmission Tint는 광원에 설정되는 추가 컬러로, 기존의 산란 컬러와 블렌드된 색의 빛이 통과합니다. 두께 맵을 사용하면 0에서 1 사이의 두께 맵 범위를 에셋에 적합하게 다시 매핑할 수 있습니다.

나비의 날개나 나뭇잎과 같이 얇은 오브젝트의 경우 Translucent(투과에만 해당)만 사용해도 좋습니다. 오브젝트가 더 두껍거나 큰 경우에는 표면에서의 광원 투과뿐 아니라 표면의 다른 지점에서 산란되어 통과하는 광원 효과를 시뮬레이션해보는 것도 권장합니다. 이 경우 Subsurface Scattering 또는 Subsurface Scattering with Transmission 옵션이 적용됩니다.

셰이더 그래프로 제작 워크플로 개선

셰이더 그래프를 사용하여 이러한 고급 셰이딩 기술을 구현할 수 있게 되어 반복 시간이 획기적으로 줄어들었습니다. 비주얼을 (미세) 조정하는 과정에서 수많은 반복이 필요할 수 있지만 셰이더 그래프의 빠른 워크플로를 통해 이 과정은 간편해집니다.

셰이더 그래프는 특정 텍스처 요구사항의 부담을 크게 줄일 수 있으므로 확산 맵, 메인 바디 노멀 맵, 타일링 디테일 노멀 맵의 세 가지 텍스처만 사용하여 원하는 비주얼을 제작할 수 있었습니다. 셰이더 그래프와 몇 가지 실험을 통해 확산 맵의 채널과 노멀 데이터를 재사용하여 텍스처를 추가로 제작하지 않고도 부드러운 값을 만들 수 있다는 것을 알아냈습니다. 코드를 작성하지 않고도 가능한 빠른 반복과 실험을 자유롭게 수행할 수 있는 것 외에도 프로퍼티 사이, 그리고 그것의 인라인 값 사이를 자유롭게 이동할 수 있다는 점도 반복 작업을 더욱 향상시켰음을 알 수 있습니다. 예를 들어 값을 자주 변경할 경우 마우스 오른쪽 버튼을 클릭한 다음 Convert to Property를 선택합니다. 이렇게 하면 셰이더를 저장할 때 해당 셰이더에서 만든 모든 머티리얼의 Inspector에서 해당 프로퍼티를 사용할 수 있습니다.

나비 형상에서 반복 작업을 수행하는 과정에서 다양한 인라인 값을 프로퍼티로 노출시켰습니다. 이를 통해 원하는 이리데선스 효과를 구현하는 데 필수적인 정확한 광원, 포스트 프로세싱, 애니메이션을 통해 게임 뷰에서 나비를 세밀하게 조정할 수 있었습니다.

다음 영상을 통해 노출된 파라미터를 기반으로 나비의 외형을 매우 간편하게 변경할 수 있다는 것을 확인할 수 있습니다.

마지막으로, 나비 날개는 양면 모두 비슷하지만 서로 다른 머티리얼 유형과 텍스처를 사용해야 하므로 커스터마이즈 가능한 프로퍼티는 입력으로 유지한 채 날개 로직을 서브그래프로 변환했습니다. 이를 통해 고급 머티리얼 유형이 달라도 날개의 양면을 동시에 편집할 수 있었습니다.

셰이더 그래프를 통해 빠른 반복을 수행하는 또 다른 예시는 분재의 나뭇잎을 통해 살펴볼 수 있습니다. 분재의 나뭇잎 컬러를 선택할 때 결정을 여러 번 바꿨는데, 이 씬을 제작한 시기가 가을이었기 때문에 씬에 가을의 느낌을 담고 싶었습니다.

여러 가지 컬러를 시도한 끝에 나무에 단풍이 물드는 것처럼 녹색에서 주황색으로 전환하는 컬러를 만들고자 했지만 나뭇잎의 텍스처는 변경하고 싶지 않았습니다. 다행히도 셰이더 그래프를 통해 나무 지오메트리의 월드 포지션에 따라 변경되는 그레디언트를 사용하여 컬러를 변경할 수 있었습니다. 높이가 서로 다른 나뭇잎은 그레디언트에 따라 컬러가 다르게 표현되었으며, 또한 노이즈를 추가하여 획일적인 그레디언트에 변화를 주어 더 자연스럽고 유기적인 외형을 구현했습니다. 이러한 모든 수정은 텍스처 제작 소프트웨어를 사용하지 않고도 가능했습니다.

즉 텍스처 맵에 컬러를 베이크할 필요가 없었고 반투명 두께 맵과 같은 그레이스케일 텍스처 요구사항에 맞게 맵에서 다른 채널을 다시 사용할 수 있었습니다.

또한 프로퍼티를 통해 나뭇잎 그레디언트를 제어할 수 있게 설정하면 시간 경과에 따라 나뭇잎의 컬러가 변경되도록 애니메이션화할 수 있었습니다.

마치며

HD 릿 셰이더 그래프의 마스터 노드는 HDRP의 고급 셰이딩 옵션이 활용되는 표면을 제작할 수 있는 새로운 방법을 제시합니다. 이제부터 여러분께 익숙한 셰이더 그래프 워크플로에서 제공되는 새로운 HD Lit AF 옵션을 이용하여 씬의 비주얼 퀄리티를 한층 높여 보세요. 셰이더 그래프에 대한 다른 새로운 소식도 놓치지 마세요! Unity 셰이더 그래프 팀은 여러분이 멋진 컨텐츠를 만들 수 있도록 계속 지원하겠습니다.

HD 렌더 파이프라인 기술에 대한 자세한 내용을 알아보려면 여기에서 SIGGRAPH 프레젠테이션을 참조하세요.

 

19 코멘트

코멘트 구독

코멘트를 달 수 없습니다.

  1. Great to see this update – can’t wait to try it out!

    I just published a post about what I learned while trying to improve the visual quality of my Unity project as a programmer. Shader graph was definitely key to this – I used it extensively.

    I go over 5 other things I did to get better visual quality too.

    Please take a look, you might find it helpful – https://www.linkedin.com/pulse/programmer-art-unity-7-techniques-achieve-impressive-divij-sood/

  2. Hi Natalie,
    is there any combination to get the the tree leaves to work.

    Shader error in ‘Leaves’: incorrect number of arguments to numeric-type constructor at line 265 (on d3d11)

    I tried
    Unity 2018.3.0f2
    Unity 2018.3.1f1
    with
    High Defenition RP 4.6.0 preview,
    Shadergraph 4.6.0 preview

    and
    High Defenition RP 4.7.0 preview,
    Shadergraph 4.7.0 preview

  3. The Tree Leaves have never worked. Same error here.
    The Butterfly Wings outside you could refresh with resaving the ShaderGraph.

  4. Shader error in ‘Leaves’: incorrect number of arguments to numeric-type constructor at line 265 (on d3d11)

  5. When I opened this project from Github Desktop, there is no mesh in the scene.
    The console shows “AssetImporter is referencing an asset from the previous import. This should not happen.”
    Does anyone help me? Thank you a lot!!

    1. Oh,that’s my fault. It’s running great .It’s awesome project! Thanks.

  6. Sirius Bizdness

    1월 3, 2019 4:32 오후

    “These HD Lit Advanced Features, or HD Lit AF…”
    why

  7. Cloned & ran the sample in 2018.3…the butterflies and Bonzai tree shaders don’t render. I thought it might be enough to toggle on “Animated Materials”…alas, not so. What do I need to do to render the bonzai and butterfly wings?
    (I thought the sample would run as is)

    1. The project uses Git LFS as some files were too large for github, this could be what is causing you trouble. You can find instructions in the project’s readme for using Git LFS. https://help.github.com/articles/installing-git-large-file-storage/ may also be helpful.

  8. Very cool, cant wait to give it a try! Unfortunately some missing terrain features in HDRP is stopping me currently, but will feedback to the team as soon as I do! Keep up the great work guys! :)

  9. No Meshes in SampleProject. Is it ony for me?
    Only Empty Objects are existing.

    1. google – Git Large File Storage (LFS)

    2. What Aahart said, and there are also some instruction in the readme to help set up Git LFS.

  10. “HD Lit AF”

    I hate everyone who was involved with that naming decision.

  11. I find the default values’ “banners” on node pins a little misleading… At first I thought they were variables attached to the input, but then the pins all looking “empty” with wires attached made things even more confusing; until down the lines I see wires connected to the node then things began to make sense.

    1. They are default values that are fed into the node. Just for some that default value is 0 or nothing. However those default values can be altered without having to add another specific node just to do that, which is very handy.

  12. This blog post has helped me a lot, thanks.

  13. Bravo!

  14. Now we know what the Unity devs do on their time off….

    Make cool shader features! :P