환영합니다. 지난 강의에서
Runtime Virtual Texture(런타임 버추얼 텍스처, RVT)를 성공적으로 설치했습니다. 이 방법을 사용해서
셰이더 복잡도를 줄여서 Frame Rate(프레임 레이트)를 향상 시킨 것을 봤습니다
이전에 런타임 버추얼 텍스처를 사용하는 것의 또 다른 장점이 있다고 했습니다
non-landscape actors(비랜드스케이프 액터)를 랜드스케이프와 블렌드 할 수 있다는 것입니다
이것이 우리가 원하는 결과물입니다
함께 생각해 봅시다
이를 어떻게 달성할 수 있을까요?
먼저 이 작업물을 보시면 두 가지 머티리얼이 있는 것을 보실 수 있습니다
위 부분은 원본 머티리얼입니다
아래 부분은 랜드스케이프 머티리얼입니다
즉, 두 가지 머티리얼이 있습니다
더불어, 이 두 머티리얼을 블렌드해야 합니다
이를 이루기 위해 RVT 마스크가 필요합니다
아직 이것이 무엇이고 어떻게 만드는지 모르지만, 두 머티리얼을 블렌드하기 위해
마스크가 필요하다는 것을 알고 있습니다
이제 어떤 노드가 필요한지 생각해 보겠습니다
두 머티리얼을 블렌드하기 위해 BlendMaterialAttributes 노드가 필요합니다
이 부분은 확실합니다
소켓 A의 머티리얼은 원본 머티리얼이 됩니다
소켓 B의 머티리얼은 랜드스케이프 머티리얼이 됩니다
Alpha 소켓의 값은 RVT 마스크가 됩니다
평소와 마찬가지로 프로젝트로 돌아가서 시각화하기 위해 예시 머티리얼을
생성합니다
ExampleMaterial 폴더로 들어가서 만들어 보겠습니다
이름은 RVTBlend로 지정하고 더블 클릭하여 열어줍니다
새로운 머티리얼을 만들 것입니다
이름을 M_RVTBlend로 하고 머티리얼 인스턴스를 만들어줍니다
또 필요한 것은 이를 시각화하기 위해 또 다른 메시가 필요합니다
이를 위해 이 큐브가 위치한 곳을 가겠습니다
시각화하기 위해 sphere(스피어)를 끌고 옵니다. 크기를 살짝 키워주면
이렇게 됩니다
그리고 바로 MI_RVTBlend를 이 스피어에 할당합니다
더 진행하기 전에 필요한 노드가 무엇인지 명확히 해야 합니다
BlendMaterialAttributes 노드가 필요하고 원본 머티리얼이 필요합니다
이 노드부터 해결해 보겠습니다
M_RVTBlend를 더블 클릭하여 열어주고
BlendMaterialAttributes 노드를 불러옵니다
최종 출력이 이 머티리얼 전체가 되는 것입니다
그리고 이것이 통과하기 위해, Use Material Attributes(머티리얼 어트리뷰트 사용)를 체크해야 합니다
이제 최종 출력으로 통과됩니다
좋습니다
소켓 A 안의 머티리얼은 원본 머티리얼입니다
이 예시 메시에는 단순한 색상을 사용할 것입니다. 따라서 키보드에 3 버튼을 누른 상태에서
임의의 색상을 선택합니다. 저는 노란 계열을 선택할 것입니다
이것은 단순히 색상이지만 이 소켓은 머티리얼 출력이 필요합니다
그러므로 또 SetMaterialAttritbutes 노드가 필요합니다
소켓을 베이스 컬러 하나만 노출할 것입니다
이를 Base Color에 연결하고
이를 소켓 A에 연결합니다
이것이 원본 머티리얼이 됩니다
이렇게 처음 두 노드를 완료했습니다
다음으로 필요한 노드는 랜드스케이프 머티리얼입니다
이는 어떻게 얻을 수 있을까요? 런타임 버추얼 텍스처를 랜드스케이프에 적용하는 것을 상기시키기 위해
AutoMaterialLandscape 폴더로 들어가 랜드스케이프 머티리얼 폴더를 열어줍니다
이 Runtime Virtual Texture Sample을 사용하고 있고 RVT 랜드스케이프를 샘플링하여
이 각자의 어트리뷰트를 SetMaterialAttibutes에 사용합니다
그리고 나중에 최종 출력을 여기 랜드스케이프 머티리얼 최종 출력에 cache(캐시)합니다. 예시
메시에도 같은 작업을 할 수 있습니다
다시 M_RVTBlend로 돌아갑니다
Runtime Virtual Texture Sample을 또 불러옵니다. 여기에는 RVT_Ladnscape를
샘플링합니다
다음으로
필요한 노드는 또 SetMaterialAttributes이고 여기 소켓들이 필요합니다
Add Element(요소 추가) 버튼을 클릭하고 메탈릭은 제거합니다
스페큘러, 러프니스와 노멀이 있습니다
노멀을 변환하는 것을 기억하셔야 합니다
그것부터 먼저 실행하겠습니다
런타임 버추얼 텍스처에서 오는 노멀 데이터이기 때문에 소스를
탄젠트 공간에서 월드 공간으로 바꾸고 대상을 탄젠트 공간으로 바꾼 후 노멀에 연결합니다
이 부분은 베이스 컬러에 연결합니다
좋습니다
이것이 우리의 랜드스케이프 머티리얼입니다
그래프의 정돈 상태를 유지하기 위해 이름 경유 노드를 사용합니다
이름은 CachedRVTLandscapeMaterial로 합니다
이 두 노드는 단순하지만 그래도 이름 경유 노드를 사용합니다
이름은 CachedOriginalMaterial로 하고 여기 캐시된 노드를 대신 사용할
것입니다
좋습니다
세 번째 단계를 완료했습니다
이제 랜드스케이프 머티리얼이 생겼습니다
다음으로 RVT 마스크가 필요합니다
마스크를 만들 때마다 마스크가 어떻게 생겼는지 아는 것이 중요합니다
이것이 우리가 원하는 결과이고 Alpha 소켓에 연결할 값을 찾고 있습니다
소켓 A와 소켓 B에 연결하는 데이터에 따라 우리의 마스크는 이렇게 생겨야
합니다
메시 위에는 검정값이 필요하고 아래에는 폴오프가 있는 흰색 값이 필요합니다
이로 인해 우리가 원하는 방식으로 머티리얼 어트리뷰트를 블렌드할 수 있습니다. 이런 마스크를
생성하기 위해
런타임 버추얼 텍스처에 저장된 높이 데이터를 사용해야 합니다. 다시 자동 랜드스케이프 머티리얼로 돌아갑니다
머티리얼을 Runtime Virtual Texture Output에 출력했고 모든 데이터를
저장했습니다
그러나 월드 높이는 저장하지 않았습니다
이를 사용하기 위해 다른 RVT 에셋에 저장해야 합니다
이전에 했던 작업과 상당히 유사합니다. 높이 데이터에 대한 에셋을 만들고
랜드스케이프에 할당하고 고유의 볼륨을 명시해야 합니다
차근차근 함께 해보겠습니다
프로젝트로 돌아갑니다
새로운 RVT 에셋을 만들어줍니다. RuntimeVirtualTexture 폴더를 더블 클릭하여 열어줍니다
그리고 Textures(텍스처)로 갑니다
Runtime Virtual Texture를 선택합니다
이름은 RVT_Height로 하고 더블 클릭하여 열어줍니다
여기는 Virtual texture content(버추얼 텍스처 콘텐츠)를 기본설정에서 World Height로 변경합니다
저장(Save)을 누르고 레벨로 돌아가서 이를 랜드스케이프에 추가합니다
이를 위해 랜드스케이프를 선택하고 'virtual texture'를 검색합니다
여기 Drawn in Virtual Textures(버추얼 텍스처 그리기)가 보입니다
지금은 하나만 있습니다
하나 더 만들어야 합니다
그래서 요소 추가 버튼을 눌러 RVT_Height를 선택합니다
이제 여기에 랜드스케이프 머티리얼의 높이 정보 출력을 저장하게 됩니다
이것이 전부가 아닙니다
데이터가 제대로 작동하려면 자체 볼륨도 지정해야 합니다
이를 위해 이 RVT 볼륨 랜드스케이프 복사하여 붙여넣기만 하겠습니다
그래서 저는 이것을 선택하고 Ctrl+ D를 누르고 볼륨을 제어하기 위해 이름을 RVTVolumn_Height로 바꾸고
자체 에셋을 지정합니다
그래서 여기 버추얼 텍스처로 갑니다
여기서는 Height를 선택합니다
이제 런타임 버추얼 텍스처의 높이 데이터를 접근할 수 있습니다
그래서 ExampleMaterial 폴더로 돌아가 M_RVTBlend로 돌아갑니다
따라서 이제 높이 데이터를 사용하는 마스크를 만들어 줍니다. 위와 동일하게
텍스처를 샘플링해야 합니다
그래서 마우스 오른쪽 버튼을 클릭하고 'Runtime Virtual Texture'를 입력합니다
샘플하려는 텍스처는 이 RVT_Height입니다
그리고 나서 여기 핀 즉, WorldHeight에서 나오는 값을
노드에 저장합니다. 이름은 CachedRVTHeight입니다
다음으로 불러오는 노드는 WorldPosition 노드입니다
이 노드를 밑으로 끌고 와서 ComponentMask를 사용하고 Z 채널을 마스크 아웃합니다
그리고 Subtract 노드를 사용합니다
Subtract하는 값은 이 CachedRVTHeight입니다. 그리고 이것을
소켓 B에 연결합니다. 그럼 여기서 무엇을 하는 것인가요?
하이트 마스크를 기억하시나요?
하이트 마스크에서 사용한 값을 기억하시나요?
여기에서도 매우 유사한 작업을 하고 있습니다
이것이 우리의 머티리얼 인스턴스입니다
이것이 눈 마스크 시작 높이 값입니다
기억이 나신다면 이 값을 얻기 위해서는 큐브를 기준으로 끌어와
위치 정보를 직접 복사하여 붙여넣어야 합니다
정확하게 말하자면 여기 z 정보를 여기에 넣는 것입니다. 이와 같이 시작 높이를 알 수 있습니다
여기에서 사용하는 노드는 하이트 마스크를 생성하는 것과 유사합니다
Z 채널을 마스크 아웃하고 마스크를 높이기 위해 값을 subtract하는 것입니다
CachedRVTHeight에 저장된 값이 이것과 비슷합니다
이것이 우리의 기본 시작 높이가 됩니다
따라서 이는 참조 오브젝트를 드래그하고 해당 위치의 z 정보를 사용하는 것과 같습니다
유일한 차이점은 이미 위치 z 정보가 이 노드에 저장되어 있다는 점입니다
즉, 런타임 버추얼 텍스처에 저장되어 있습니다. 이를 증명하기 위해 베이스 컬러에 직접 연결하여
시각화합니다
이 핀을 끌고 나와
SetMaterialAttributes 노드를 사용합니다. 제가 설정하려는 어트리뷰트는 여기 베이스 컬러입니다
이것을 Base Color에 연결합니다. 그리고 이 최총 출력을 여기로 끌고와서 마스크를
시각화합니다. 적용(Apply)를 누르고 월드로 다시 돌아갑니다
이제 랜드스케이프의 정확한 높이에 마스크가 시작합니다
이 마스크를 offset(오프셋)하기 위해 조정하기 위한 파라미터가 필요합니다
따라서 더블 클릭하여 M_RVTBlend를 열어줍니다. 마스크를 오프셋하기 위해서
이는 고정값이기 때문에 변경할 수 없습니다
따라서 다른 값을 추가해야 합니다
이 값에는 스칼라 파라미터를 사용하고 이름은 RVTMasktStartHeight라고 할 것입니다
이것을 소켓 B에 연결합니다. 고정값이기 때문에
이것은 변경할 수 없으나 이것은 변경할 수 있으므로 이 값을 수정하여
마스크를 오프셋합니다
기본값을 0으로 설정합니다
소켓 B에 연결하고 적용(Apply)를 클릭합니다
MI_RVTBlend로 돌아갑니다
값을 높이면 마스크를 위로 오프셋할 수 있습니다
여기 값을 50으로 설정합니다
이제 마스크가 보입니다
값을 200으로 높이면 마스크를 더욱 미는 것입니다
차후에 이 두 개의 머티리얼 어트리뷰트를 블렌드하기 위해 마스크를 사용할 수 있습니다
더 정확히, 값을 Alpha 소켓에 연결하여 둘을 블렌드할 수 있습니다. 나머지는
하이트 마스크를 만드는 것과 매우 유사합니다
여기서부터는 여러분이 혼자 할 수 있으실 겁니
오늘의 과제는 RVT 블렌드 예시 머티리얼을 만드는 것입니다
그 다음, RVT 높이 데이터를 신규 RVT 에셋에 저장하는 것입니다
이를 위해 새로운 RVT 에셋을 만들어서 랜드스케이프에 할당하고
이 높이 데이터 고유의 새로운 볼륨을 추가해야 합니다
다음으로 예시 머티리얼에 높이 데이터를 샘플링해야 합니다. 저와 동일하게 하시면 됩니다
런타임 버추얼 텍스처 노드를 사용하여 에셋에 저장된 높이 데이터를 샘플링하셔야 합니다
다음 단계는 블렌드를 위한 마스크 확보입니다
따라서 마스크의 형태를 생각해야 합니다
어떤 노드를 사용하여 마스크를 조절할지 Think about what nodes you need to adjust the mask.
inverse(역) 값을 사용해야 하는지 또는 폴오프를 조절해야 하는지 생각하셔야 합니다. 어려운 문제일 수 있습니다
그러나 걱정하실 필요 없습니다. 천천히 차근차근 생각하면서 하시면 됩니다
영상을 멈추시고
시도해보시고
도움이 필요하면 영상을 다시 보시기 바랍니다
다시 오신 것을 환영합니다
어떠셨나요?
메시와 랜드스케이프 머티리얼을 성공적으로 블렌드하셨나요?
이제 어떻게 하는지 살펴보겠습니다
M_RVTBlend를 열어줍니다
이들이 조금 더 명확하게 보이도록 노드에 코멘트를 달도록 하겠습니다
좋습니다
코멘트를 달아준 후 마스크를 마무리합니다
이제 마스크를 오프셋할 수 있습니다
다음으로 할 것은 폴오프를 조절하는 것입니다
이를 위해 Divide 노드를 사용합니다
이 핀을 끌고 나와 또 다른 스칼라 파라미터를 만들어 줍니다
이름을 RVTMaskFallOff로 지정하고 기본값을 100으로 설정합니다
그리고 이것을 소켓 B에 연결하고 적용을 눌러줍니다
이제 레벨로 돌아갑니다
이제 폴오프를 조절할 수 있습니다
노드를 최종 출력에 연결하는 것을 잊은 것 같습니다. 이것을 베이스 컬러에 연결합니다
그리고 적용을 클릭합니다
머티리얼 인스턴스로 돌아가면 이제 폴오프
조절이 가능합니다
300으로 올리면 이와 같은 자연스러운 폴오프가 보입니다. 이것이 제 마스크입니다
그러나 머티리얼을 성공적으로 블렌드하기 위해 밑 부분이 흰색이고
윗 부분이 검정색인 것을 기억해야 합니다
이와 같이 각각의 소켓에 데이터를 연결했기 때문입니다
소켓 A의 데이터가 원본 머티리얼이고
소켓 B의 데이터가 RVT 랜드스케이프 머티리얼입니다
따라서 반대로 바꿔야 합니다
즉, 마스크를 inverse(인버스, 역)해야 합니다
그래서 프로젝트로 돌아갑니다
나눈 후 Saturate 노드를 사용하여 값을 0과 1 사이로 고정합니다
그러면 나중에 값을 안전하게 인버스할 수 있습니다
따라서 '1-'를 입력하면 우리가 원하는 마스크가 나올 것입니다
이제 이 핀의 연결을 끊고 여기도 끊고 이 RVTBlend를 여기로
위로 옮깁니다
그리고 이것의 최종 결과를 캐시합니다
이름 경유 노드를 사용합니다
이름은 CachedRVTMask가 되고 캐시된 노드를 Alpha 소켓에 연결합니다
이제 적용을 누르고 레벨로 돌아갑니다
이제 스피어가 랜드스케이프와 블렌드되는 것이 보입니다. 스피어를 어디로 옮기든
항상 랜드스케이프 머티리얼과 블렌드되고 마스크, 시작 높이 그리고 폴오프를
조정할 수 있습니다
지금은 블렌드 정도가 너무 높아 높이를 50 정도로 낮춥니다
그리고 폴오프도 150 정도로 낮춥니다
이제 보시면 자연스럽게 블렌드되는 것이 보입니다. 이렇게 Static Mesh(스태틱 메시)가
랜드스케이프에 더 자연스럽게 조화될 수 있습니다
이번 강의에서 RVT 마스크를 만들어 머티리얼을 블렌딩했습니다. 더 정확히
메시의 원본 머티리얼과 랜드스케이프 머티리얼입니다
다음 강의에서 이 마스크를 기존 머티리얼에 사용하는 방법을 알아보겠습니다
다음 강의에서 뵙겠습니다