환영합니다
지난 강의에서 foliage(폴리지)의 성능을 최적화하기 위한 다양한 방법을 배웠습니다
결국 성능과 품질 어떤 것을 선호하는지는 여러분에 달려 있습니다
지금 제 scene(씬)의 풀 상태입니다
보시다시피 풀에 심각한 artifact(아티팩트)가 있습니다
먼저 해결할 문제는 이 cull distance(컬 디스턴스) 문제입니다
보시다시피 scene(씬)에서 움직일 때 풀이 튀어나오고 있습니다
이를 위해 무엇을 할 수 있는지 알아보겠습니다
이것이 발생하는 이유는 컬 디스턴스 때문입니다
현재 컬 디스턴스는 3000이며 카메라와 풀의 거리가 이 값보다
적은 경우 Opacity(불투명도)가 즉시 1로 변합니다
이로 인해 튀어나오는 문제가 발생하는 것입니다
제가 원하는 최종 결과는 이러합니다
컬 디스턴스가 3000보다 작은 경우, Opacity(불투명도)가 0에서 1로 서서히 올라가게 하고 싶습니다
이를 통해 풀에 천천히 페이드할 수 있습니다
그렇다면 이를 어떻게 달성할 수 있을까요?
생각해보면 이는 Opacity(불투명도)와 상당히 관련이 있습니다
즉, 머티리얼 그래프의 Opacity(불투명도)에 무언가를 해야 한다는 의미입니다
Foliage(폴리지)에 Opacity(불투명도)와 translucency(반투명도)가 달성되는지 살펴보겠습니다
프로젝트로 돌아갑니다
풀의 마스터 머티리얼의 위치를 확보해야 합니다
다른 asset pack(에셋 팩)을 사용하신다면 Foliage(폴리지) 마스터 머티리얼을 찾기 위해
메시를 열면 LOD 별로 다른 머티리얼 인스턴스를 사용하는 것을
확인할 수 있습니다
원하는 것을 선택하고 돋보기를 클릭합니다
그러면 머티리얼 인스턴스 위치로 이동됩니다
더블 클릭하여 열어주고 스크롤하면 마스터 머티리얼이 보입니다
이 돋보기를 누르면
마스터 머티리얼로 이동됩니다
이 마스터 머티리얼로 들어갑니다. 마스크를 Opacity(불투명도) 소켓에 바로 연결하는 것이 아니고 마스크를
이 소켓, Opacity Mask(불투명도 마스크) 소켓에 연결합니다
이 핀을 따라가면 베이스 컬러 텍스처가 보이며 그리고
이 베이스 컬러의 위치로 이동하면 T_FieldGrass_01_D가 보이며 더블 클릭하여 열어줍니다
Alpha 채널을 고립시킵니다
이것이 마스크입니다
머티리얼 그래프로 돌아가면 마스크가 Opacity Mask(불투명도 마스크)로 바로 연결됩니다
Opacity(불투명도)가 아닙니다
첫 번째 섹션을 기억하신다면 Opacity(불투명도) 소켓을 사용하여 움직이는
화살표와 Dissolve(디졸브) 머티리얼을 달성했습니다
그러나 Foliage(폴리지)의 경우 마스크가 Opacity Mask(불투명도 마스크)에 통과하는 가장 중요한 이유는
Opacity(불투명도)보다 훨씬 값싸다는 것입니다
즉, translucency(반투명도)를 달성하기 위해 Opacity Mask(불투명도 마스크)를 통해 작동하는 것이 Opacity(불투명도)에 직접 작동하는 것보다 훨씬
값이 쌉니다
Opacity(불투명도)와 Opacity Mask(불투명도 마스크)의 차이점이 궁금하셨다면 사실
상당히 유사하지만 차이점이 있습니다
첫 번째로 Opacity Mask(불투명도 마스크)는 마스크 블렌드 모드에만 사용 가능합니다. 또한
Opacity Mask(불투명도 마스크)를 활용하여 작동하는 경우 최종 결과가 아주 잘 보이거나 투명하거나 둘 중 하나입니다
중간값이 없습니다
회색조 스케일 값에 연결하는 경우 Opacity Mask Clip Value(Opacity Mask(불투명도 마스크) 클립 값)을 조절해서
최종 결과를 정의할 수 있습니다
보이기를 원하시나요 아니면 투명하길 원하시나요?
Opacity Mask(불투명도 마스크)와 관련한 링크를 자료 드롭 다운에 추가했습니다
이것이 작동하는 방법을 배우고 싶다면 문서를 살펴보면
알아보실 수 있습니다
이제 이를 달성하기 위해 Opacity Mask(불투명도 마스크) 소켓에 무언가를 해야 합니다
그러나 정확히 무엇을 해야 이런 효과를 얻을 수 있을까요?
어떠한 Dissolve(디졸브) 행동이 필요합니다. 그러나 메시를 Dissolve(디졸브) 나가는 것이 아니라
메시를 안으로 Dissolve(디졸브)하게 하려고 합니다
이를 컬 디스턴스 값을 기반으로 하려고 합니다
이를 달성하기 위해 새로운 노드가 필요합니다. 이 노드의 이름은 PerInstanctFadeAmount입니다
이 노드의 출력 결과는 camera depth rate(카메라 뎁스 속도)와 유사합니다
마스크를 출력하지만 마스크의 행동은 컬 디스턴스에 의존합니다
이 메시의 컬 디스턴스는 3000이며 마스크까지 거리가 100인 경우
즉, 아주 가까운 경우
마스크가 흰색이 됩니다. 거리가 3100 단위인 경우
이 시점에서 메시가 사라질 것이고
노드의 출력 결과는 검정색이됩니다. 상당히 강력한 노드입니다
이를 사용하여 우리가 원하는 페이드 인 효과를 얻을 수 있습니다
이것을 새로운 마스크으로써 사용할 수 있습니다
또 필요한 노드는 DitherTemporalAA입니다
이 노드는 데이터 패턴에 따라 메시에 구멍을 뚫어줍니다
데이터 패턴은 단순하게 작은 검정색 점입니다
두 개의 입력 소켓이 있습니다
PerInstanceFadeAmount를 Alpha에 연결하면 DitherTemporalAA에게 메시를 언제 Dissolve(디졸브)할지
알려줍니다
원하는 효과를 얻기 위해 이 두 노드를 사용할 수 있습니다
이를 어떻게 설정하는지 살펴보겠습니다
프로젝트로 돌아옵니다. 이를 얻기 위해
새로운 머티리얼 함수를 만들 것이며 나중에 다른 유형의 Foliage(폴리지)에도 동일한 문제가 발생한다면
사용할 것입니다
AutoLandscapeMaterial로 가서 MaterialFunction으로 이동합니다
새로운 폴더를 생성합니다. 이름은
FoIiageFade로 합니다. 더블 클릭하여 열어주고
새로운 머티리얼 함수를 만들어줍니다
이름은 MF_FoliageFade로 지정하고 이 머티리얼 함수 안으로 이동합니다. 출력 결과는
이름을 FadeInOpacityMask로 변경합니다
나중에 이 출력을 Opacity Mask(불투명도 마스크)에 연결해야 합니다
먼저 필요한 노드는 PerInstanceFadeAmount입니다
이 노드가 컬 디스턴스의 데이터를 읽게됩니다. 이 데이터를 사용하여
DitherTemporalAA에 연결합니다
이를 통해 메시에 구멍을 뚫을 수 있습니다
이 값이 원본 Opacity Mask(불투명도 마스크)에 영향을 끼치기 위해 함수 입력이 필요합니다
따라서 메시의 원본 Opacity Mask(불투명도 마스크) 입력을 허용해야 합니다
유형은 scalar(스칼라)로 변경합니다. 이름은 OriginalOpacityMask로 변경합니다
이 값에 영향을 미치기 위해 multiplier(배수) 노드를 사용합니다. 이를 소켓 B에 연결하고 이것을
소켓 A에 연결합니다
Random(랜덤) 소켓은 페이드 인 효과의 무작위성을 정의합니다
여기에 아무것도 연결하지 않아도 괜찮습니다
최종 출력을 출력 소켓에 연결하기 전에 스위치 파라미터를
추가하여 효과를 껐다 켤 수 있게 합니다
스위치 파라미터 이름은 UsedFoliageFade로 하고 고유의
그룹을 지정합니다
그룹 이름은 00-FoliageFade가 되고 정렬 우선순위는 1로 설정합니다
조건이 True인 경우 이것이 최종 출력으로 통과합니다
조건이 False인 경우 원본 불투명 마스크가 최종 출력으로 통과합니다
따라서 여기에 Name Reroute 노드를 사용하고 이름을 CachedOriginalOpacityMask로하고
이름 경유 노드를 False 소켓에 연결합니다
이 핀 연결을 해제하고 두 노드를 약간 옆으로 치우고 대신에 이름 경유 노드를 사용합니다
좋습니다
이제 Apply을 눌러줍니다
마지막으로 할 것은 마스터 머티리얼에 있는 머티리얼 함수를 풀에 사용하는 것입니다
따라서 풀로 이동합니다
간단하게 머티리얼 함수를 불러와야 합니다
끌고 오고 Ctrl 키를 누른 상태에서 이 핀을 원본 Opacity(불투명도)
마스크 소켓으로 가져옵니다
이것의 출력은
Opacity Mask(불투명도 마스크)에 연결합니다. MF_FoliageFade로 다시 이동합니다
스위치 파라미터의 기본값을 True로 설정하고 Apply를 누릅니다
이제 레벨로 돌아가서 shader(셰이더)가 recompile(재컴파일)되기를 기다립니다
좋습니다
재컴파일 후에 원하는 효과가 나온 것을 볼 수 있습니다
기존에 튀어나오던 것보다 훨씬 개선되었습니다. 이제 여러분도 할 차례입니다
오늘의 과제는 페이드 인 Foliage(폴리지)를 위한 머티리얼 함수를 만드는 것입니다
여러분이 사용할 노드는 PerInstanceFadeAmount와 DitherTemporalAA
입니다
원본 Opacity Mask(불투명도 마스크)를 위한 입력 소켓을 만드는 것을 잊으시면 안됩니다
마지막으로 기존의 Foliage(폴리지) 머티리얼을 수정하셔야 합니다
따라서 이 머티리얼 함수를 사용하여 원본 Opacity Mask(불투명도 마스크) 입력을 대체합니다
영상을 잠시 멈추고 시도하시길 바랍니다
다시 오신 것을 환영합니다
어떠셨나요? 풀을 성공적으로 페이드 인 하셨나요?
머티리얼 함수 다음으로 해결할 문제가 또 있습니다. LOD 전환
문제입니다
보시다시피 움직일 때 LOD가 바뀔 떄 전환선이 보입니다
컬 디스턴스를 높이면 더 도드라질 것입니다
Foliage 폴더로 이동하여 LGT_Grass를 열어줍니다
컬 디스턴스를 5000으로 증가하고 끝 컬 디스턴스를 7000으로 변경합니다
이제 레벨로 돌아갑니다
LOD 간에 아주 강렬한 전환선이 있는 것이 보입니다
이를 없애는 것을 상당히 쉽습니다
LOD를 전환하기 위해 여기에도 Dither 방법을 사용할 수 있습니다. 이를 머티리얼에서
활성화하면됩니다
풀이 위치한 곳으로 이동하고 마스터 머티리얼을 열어줍니다. 검색창에서
'dither'를 검색합니다
여기 Dithered LOD Transition이 보입니다
여기에서 사용한 것과 동일한 방법이고 체크한 후 Apply를 누르고 셰이더가
재컴파일 되기를 기다립니다
이제 scene(씬)에서 움직일 때 전환이 덜 눈에 띕니다
Dither 패턴이 이와 같이 강력합니다
우리가 원하는 효과를 얻는데 도움이 되었습니다
좋습니다
이제 더 다양한 풀 유형을 추가하려고 합니다
이를 위해 Landscape(랜드스케이프) 풀 타입으로 이동합니다. 더블 클릭하여 열어줍니다
요소를 하나 더 추가합니다
풀 밀도를 먼저 30으로 설정하고 꽃을 사용할 것입니다
KiteDemo 폴더로 이동하고 Environments 그리고 Foliage로 들어가서 Static Mesh(스태틱 메시)를
필터링합니다
보시다시피 선택할 수 있는 에셋이 상당히 많이 있습니다
이것이 꽤 멋있어 보입니다
이 인덱스 안에 추가하고 이 풀 메시에 추가합니다
이제 scene(씬)에 꽃이 있습니다. 그러나 30은 너무 높은 것 같습니다
10으로 변경합니다
또한 컬 디스턴스를
줄이며 500과 1000으로 수정합니다
이 창을 최소화합니다
scene(씬)에서 움직일 때 꽃에도 튀어나오는 문제가 발생합니다
이는 이미 만든 머티리얼 함수를 사용해 쉽게 해결할 수 있습니다
Landscape(랜드스케이프) 풀 타입으로 이동하여 돋보기를 클릭합니다
꽃은 이 마스터 머티리얼을 사용하고 있습니다. 더블 클릭하여 열어줍니다
방금 사용한 머티리얼 함수를 불러옵니다
FiedGrass로 돌아가 머티리얼 함수를 복사하고 이 머티리얼 그래프에
붙이며 Ctrl 키를 누른 상태에서 이 핀을 끌고 나와 원본 Opacity Mask(불투명도 마스크)에 연결합니다
그리고 최종 출력은 Opacity Mask(불투명도 마스크)에 연결합니다
Apply를 누른 후 레벨로 돌아갑니다
보시다시피 꽃이 서서히 페이드 인되고 있습니다
이 경우 컬 디스턴스를 조정해야 할 것 같습니다
Landscape(랜드스케이프) 풀 타입으로 돌아갑니다
컬 디스턴스를 2000과 5000으로 높입니다
3000으로 해야할 것 같습니다. 밀도는 5 또는 3으로 줄입니다
좋습니다
이제 제가 원하는 효과와 꽤 가까운 것 같습니다
밀도를 조금 더 줄이는게 좋을 것 같아 2로 설정하고 풀의 밀도는 올려줍니다
따라서 여기는 300으로 수정합니다
좋습니다
아주 멋진 것 같습니다
다른 유형의 Foliage(폴리지)를 추가할 것입니다
이제 풀와 꽃이 있습니다
이제 세 번째 요소를 추가합니다. 이 요소는
풀 밀도를 2로 낮춥니다
아니면 인덱스 1의 attribute(어트리뷰트)를 복사하여 새로운 인덱스에 붙일 수 있습니다. 마우스 오른쪽 버튼을
클릭하고 복사한 후 인덱스 2에 붙입니다
이제 풀 메시만 바꾸면 됩니다
KiteDemo 폴더로 돌아가서 Environments, Foliage로 들어가고 Static Mesh(스태틱 메시)를
필터링합니다
다음으로 이것을 추가하려고 합니다
이 흰색 꽃들이 꽤 멋지다고 생각합니다. 이것을 이 풀 메시에 배치합니다
풀 밀도는 약간 올려줘서 5로 설정합니다
이제 scene(씬)에 꽃이 더 생겼습니다. 그리고 몇 가지 더 추가할 것입니다
절차는 이 두 개를 추가한 것과 같기 때문에
빠르게 타임랩스로 진행하겠습니다
좋습니다
최종 결과가 상당히 만족스럽습니다
따라서 새로운 인덱스를 빠르게 추가하기 위해 이 요소 버튼을 누르고 어트리뷰트를 복사하여
새로운 인덱스에 붙이면 됩니다
이 숫자를 조정하는 것과 관련해 시간을 많이 아낄 수 있을 것입니다
이제 재생 버튼을 누릅니다
이제 scene(씬) 안에서 뛰어 다닐 수 있습니다. 결과가 상당히 만족스러운 것 같습니다
물론 나중에 언제든지 다른 유형의 풀을 추가할 수 있습니다. 이 방법을 사용하여
돌이나 나무 몸통도 넣을 수 있습니다
다시 말해 Landscape(랜드스케이프) 풀 타입은 아무 Static Mesh(스태틱 메시)에 사용할 수 있습니다. Foliage(폴리지) 이외에도
돌 같은 것도 Landscape(랜드스케이프)에 넣을 수 있습니다
이번 강의에서 Foliage(폴리지)를 페이드 인 했고 PerInstanceFadeAmount 노드와
DitherTemporalAA 노드를 사용해서 실행했습니다. 또한 동일한 방법을 사용하여 LOD 간 전환 문제를 해결했습니다
고생하셨습니다. 이제 scene(씬)이 완성되어가고 있습니다
다음 강의에서 뵙겠습니다