본문 바로가기

UENREAL ENGINE/MAT

명교

볼륨 텍스처 애셋은 언리얼 엔진 4.21과 함께 제공되는 새로운 기능입니다. 릴리스 노트에는 새로운 기능의 추가가 언급되어 있지 않기 때문에 레이더 아래로 날아갔습니다. 다행히도 그것들을 만들고 사용하는 방법에 대한 문서가 있습니다. 한 눈에보기에는 그다지 유용하지 않은 것 같지만 다양한 응용 프로그램이 있습니다. 이를 생성하는 방법을 안내하고 사용 사례를 보여 드리겠습니다.

하지만 들어가기 전에 잠시 볼륨 텍스처가 무엇인지 알아 봅시다. 일반 텍스처는 2 차원 픽셀 격자입니다. 길이와 너비가 있습니다. 볼륨 텍스처에는 세 번째 축이 있으며, 이는 서로 위에있는 텍스처의 "스택"으로 생각할 수 있습니다. 따라서 볼륨 텍스처를 32x32x16으로 정의하면 16 개의 32x32 픽셀 이미지가 서로 겹쳐서 구성됩니다. 길이와 너비 치수가 모두 동일한 경우 원하는 이미지를 볼륨 텍스처에 넣을 수 있습니다. 이것은 아래 이미지에서 시각화됩니다. 투명한 녹색은 볼륨 텍스처를 나타내고 "슬라이스"는 옆에 "의사 볼륨 텍스처"로 시각화됩니다.

Ryan Bruck의  블로그 게시물  에서 가져온 GIF 입니다.

Creating Volume Textures

Pseudo Volume Textures

먼저 볼륨 텍스처를 만들려면 의사 볼륨 텍스처를 만들어야합니다. 볼륨의 "슬라이스"를 행과 열로 저장하는 2D 텍스처입니다. 이것은 구의 밀도 정보를 저장하는 의사 볼륨 텍스처를 만드는 아래 GIF에서 시각화됩니다. 구 안에있는 픽셀은 흰색으로, 바깥쪽에있는 픽셀은 검은 색으로 표시됩니다. 그런 다음 3D 정보를 포함하는 2D 텍스처로 정렬되므로 "의사"이름이됩니다.

Epic Games의 Ryan Brucks 는 가상 볼륨 텍스처와이를 UE4로 작성하는 것에 관한 일련의 블로그 게시물을 보유하고 있습니다. Authoring Pseudo Volume Textures를 읽어 보는 것이 좋습니다 . 그가 아주 잘 설명했던 많은 정보가 거기에 있으며, 나는이 기사에서 그 정보의 일부를 반복 할 것입니다.

그의 포스트 중 하나 는 타일링 노이즈 텍스처를 생성하는 방법  대한 것 입니다. 2016 년 그의 게시물에 설명 된 프로세스는 볼륨 텍스처 자산이 사용 가능하기 전이었고 의사 볼륨 텍스처를 생성하고 샘플링하는 방법이 상당히 관련되어있었습니다. 불행히도 그 당시에는 그것이 유일한 방법이었습니다. 다행히도 볼륨 텍스처의 출현으로 매끄러운 타일링 3D 노이즈 텍스처를 만들고 샘플링하기 위해 작성해야하는 모든 커스텀 코드와 추가 머티리얼 함수를 잘라낼 수 있습니다! 그것은이다 훨씬 쉬워졌습니다. 살펴 보겠습니다.

볼륨 텍스처 활성화

4.23부터 DefaultEngine.ini 파일을 편집하여 볼륨 텍스처를 활성화해야합니다. 따라서 프로젝트 디렉토리의 Config 폴더로 이동하여 DefaultEngine.ini를 찾으십시오 (존재하지 않는 경우 작성하십시오). 그런 다음 렌더 설정 섹션으로 이동하여 (해당 섹션이 보이지 않으면 만들 수 있음) "r.AllowvolumeTextureAssetCreation = 1"을 추가합니다. 아래에 예가 있습니다.

[/Script/Engine.RendererSettings]

r.AllowVolumeTextureAssetCreation=1

노이즈 재질 만들기

이 예제에서는 6 옥타브로 타일링 보로 노이 노이즈를 렌더링 해 보겠습니다. 고품질 보로 노이 노이즈는 ~ 600 명령으로 악명이 높으므로 볼륨 텍스처에 캐시하는 데 완벽한 유형의 노이즈입니다.

새로운 언릿 머티리얼을 생성하고 위 이미지와 같이 설정합니다. 노이즈 노드의 매개 변수는 이미지의 왼쪽 하단 부분에서 볼 수 있습니다.

렌더링 할 렌더 타겟과 블루 프린트를 만듭니다.

다음으로 Render Target Asset을 만들고 그 크기를 4096x4096으로, Render Target Format을 RGBA8로 설정합니다.

그런 다음 블루 프린트 액터를 생성하고 이벤트 그래프에서 커스텀 이벤트를 생성하고 "Draw To Render Target"과 같은 이름을 지정합니다. 이벤트 노드를 선택하고 "Call In Editor"를 활성화합니다. "Draw Material To Render Target"노드를 추가하고 커스텀 이벤트에 연결합니다. "Texture Render Target"속성에서 새로 만든 Render Target 자산을 참조한 다음 "Material"속성에서 노이즈 재질을 참조합니다.

블루 프린트를 컴파일하고 씬으로 드래그 한 다음 디테일의 "Default"카테고리에서 볼 수있는 "Draw to Render Target"버튼을 클릭합니다.

Render Target 애셋에 그려진 머티리얼이 보일 것입니다. 그렇지 않은 경우 렌더 타겟 애셋을 열고 "알파"채널을 비활성화하여 거기에 무엇이 있는지 확인해야 할 수 있습니다.

볼륨 텍스처 생성

다음으로 Render Target 애셋을 마우스 오른쪽 버튼으로 클릭하고 "Create Static Texture"를 선택합니다. 그러면 Render Target 애셋과 같은 폴더에 텍스처 오브젝트가 생성됩니다. 이 "정적"텍스처는 볼륨 텍스처를 생성하는 데 사용하는 것입니다.

그 스타틱텍스쳐위에 마우스 오른쪽 버튼으로 클릭하십시오. "DefaultEngine.ini"파일을 올바르게 편집 한 경우 맨 위에 "Create Volume Texture"라는 옵션이 표시됩니다.

그렇게하면 볼륨 텍스처 애셋이 만들어집니다. "VT_WorleyNoise"와 같이 멋진 이름을 지정하고 처리하는 동안 몇 초 동안 기다리십시오.

볼륨 텍스처를 열고 "알파없이 압축"을 활성화합니다.

이렇게하면 자산의 메모리 사용량이 줄어 듭니다. 다음으로 View> Viewmode로 이동하여 "Trace Into Volume"을 활성화합니다. 그러면 회전하고 재생할 수있는 볼륨 텍스처의 시각화가 생성됩니다.

 

볼륨 텍스처 테스트를위한 재질 만들기

이제 볼륨 텍스처를 만들었으므로 테스트 할 재질을 만들어 보겠습니다. 볼륨 텍스처를 샘플링하려면 Texture Sampler Parameter Volume이라는 특별한 유형의 샘플러 노드를 가져와야합니다. 볼륨 텍스처이므로 UV에 플로트 3이 필요합니다. 저는 일반적으로 "Tile Size"매개 변수로 나눈 World Space를 사용합니다.

 

장면을 통해 개체를 드래그하면 World Space에서 샘플링하므로 3D 변화를 볼 수 있습니다. 그렇게하지 않으려면 대신 "로컬 공간"에서 샘플링하십시오.

Voronoi 노이즈를 볼륨 텍스처에 캐싱하면 256 ^ 3 텍스처 크기에서 약 10MB의 비용으로 약 600 개의 명령을 절약 할 수 있습니다. 예산이 빠듯한 경우 최대 텍스처 크기를 128로 설정하면 리소스 비용이 1.2MB 미만으로 낮아져 시각적 차이가별로 없습니다.

Bake some Curl Noise

Voronoi Noise로 멈추지 마십시오! 또한 Perlin Curl과 같은 벡터 노이즈를 3D 텍스처로 굽는 것을 좋아합니다. 이러한 유형의 벡터 노이즈는 UV 왜곡에 유용한 방향 정보를 저장합니다.

위는 Perlin Curl Noise의 3D 텍스처입니다. 저는 이것을 생성하기 위해 Vector Noise 노드를 사용했습니다. 하지만 타일로 옮기는 것은 약간 까다 롭습니다. 내 UV에 6을 곱하고 벡터 노이즈 노드에서 타일 크기 36을 사용해야했습니다. 그런 다음 베이킹 할 때 값을 0에서 1 범위로 다시 매핑해야합니다. 이 볼륨에서 샘플링 할 때 값을 다시 -1에서 1 범위로 매핑해야합니다.

응용

이제이 모든 아름다운 볼륨 텍스처를 마음대로 사용할 수 있습니다. 몇 가지 응용 프로그램을 살펴 보겠습니다.

시각 효과

저는 이러한 텍스처를 메시의 UV 좌표로 샘플링하고 W 좌표에 시간 용어를 추가하여 볼륨 텍스처를 통해 UV를 "밀어 넣는"것을 좋아합니다.

아래 이미지에서 설정과 오른쪽에서 결과 비주얼을 볼 수 있습니다. 2D 텍스처로 재현하기 매우 어려운 멋진 애니메이션을 생성합니다.

동일한 기술을 사용하여 Curl Noise를 샘플링하고이를 사용하여 원래 노이즈 텍스처의 UV를 왜곡하여 더 흥미로운 효과를 만들어 시각적 효과를 더욱 향상시킬 수 있습니다. 여러 노이즈와 여러 워프를 결합하면 완전히 다양한 비주얼을 생성 할 수 있습니다.

위의 셰이더는 모두 UV 크기와 뒤틀림 강도를 약간 조정하여 위의 기술을 사용하여 만들어졌습니다. U 또는 V 축에서 텍스처를 패닝하여 더 나아갈 수 있습니다. 위의 GIF에서 불이 생성 된 방법입니다. 매우 자연스러워 보이며 모든 텍스처가 여러 축에서 서로 다른 속도로 패닝되기 때문에 반복되는 요소를 찾기가 어렵습니다.

체적 안개

볼륨 텍스처에 약간의 텍스처 정의를 추가하는 것은 볼륨 텍스처의 또 다른 훌륭한 사용 사례입니다. 텍스처 자체가 없으면 머티리얼에서 비용이 많이들 수있는 노이즈 노드를 사용해야합니다. 이를 베이킹하면 셰이더 비용이 상당히 단순화되고 사용 비용이 엄청나게 비싸지 않으면 서 더 복잡한 효과를 얻을 수 있습니다. 우리는 보더 랜드 3의 모든 곳에서 이것을 사용했습니다.

위의 이미지에서는 체적 안개와 함께 사용하기 위해 3D 구형 마스크로 뒤틀린 보로 노이 노이즈를 샘플링하는 셰이더를 사용하고 있습니다. 이 장면은 UE4 마켓 플레이스에서 얻을 수있는 Multi-Story Dungeons 키트에서 가져 왔습니다. 셰이더를 간단한 구형 스태틱 메시에 적용한 다음 볼륨을 장면에 렌더링하는 데 사용됩니다. Volumetric Fog 사용에 대한 문서는 여기에서 찾을 수 있습니다. 다른 예는 Ryan Bruck의 UE4 Volumetric Fog Techniques 라는 제목의 블로그 게시물에서 찾을 수 있습니다 . 그 게시물은 이제 몇 년이 지났으며 볼륨 텍스처 자산이 문제가되기 전에 작업을 수행해야했던 방식을 볼 수 있습니다.

재료 도메인을 "볼륨"으로 설정하는 것을 잊지 마십시오.

구름

Ray Marching은 엄청나게 복잡하고 비용이 많이 드는 기술이지만 Horizon Zero Dawn, Red Dead Redemption 2 및 몇 가지 다른 오픈 월드 게임에서 볼 수있는 것과 같은 아름다운 구름 풍경을 렌더링하는 데 사용할 수 있습니다.

https://youtu.be/FhMni-atg6M


사실, 위 비디오의 기술은 몇 가지 다른 타일링 볼륨 텍스처를 사용하지 않고는 불가능합니다. 이 기술에 대한 자세한 내용은 해당 문서를 참조하십시오 . GPU Pro 7 (4 장)에서이를 만드는 방법에 대한 자세한 가이드도 있습니다. 시간이 좀 있으면이 효과를 UE4 내에서 어떻게 달성 할 수 있는지 살펴보고 싶습니다.


마지막 생각들

언리얼 엔진에서 볼륨 텍스처를 만들고 작업하기가 그 어느 때보 다 쉬워졌습니다. 볼륨 텍스처 에셋과 의사 볼륨 텍스처에서 자동으로 생성하는 도구를 추가하면 그 어느 때보 다 빠르게 시작하고 실행할 수 있습니다. 모든 사람이 이러한 텍스처를 시각 효과 및 환경 아트 파이프 라인에 통합 할 것을 권장합니다. 당연히 모든 응용 프로그램을 하나의 게시물로 다룰 수는 없지만 모든 사람들이 이러한 응용 프로그램을 어떻게 사용할 수 있기를 바랍니다. 읽어 주셔서 감사합니다!


작업일지 

스피어에 머티리얼 인스턴스를 적용

M_Fog_UVWarpSphereMask

M_Fog_UVWarpSphereMask_Inst

 

머티리얼을 구현 했지만 엔진상에서 효과를 확인 하기가 어려웠는데 일단 보이게끔 설정하였다.

기본 머티리얼 인스턴스 설정

이제 머티리얼과 인스턴스를 사본으로 복사하여 적절한 설정을 찾는다.

curlTileSize  수치가 작으면 의미가 없다. 적당하게 움직임에 운동성을 준다. 수치가 너무크면 전체적으로 흔들린다.

Density  농도를 표현한다.    음수일때 큐브안쪽으로 투명, 0.3적당, 양수로 값이 높아질수록 흰색에 플랫

Mask Exp 수치가 작으면 포그의 덩어리가 작아지고, 수치가 커지면 포그의 덩어리가 커지면서 사각박스화 된다.

MinimumDensity 최소 덴시티로 작은값을 유지해도 무방하다.

SphereRadius Mask Exp와 기능이 유사하다.  값이 커질수록 포그의 분포가 지오메트리의 형태에 충실해진다.

TileSize 값이작을수록 조밀해지고 값이 클수록 넓어진다.

WarpStrength 0.02로 고정하는것이 바람직하다. 다른수치는 포그가 보이지않을 수 있다.

Volume Speed 포그흐름의 방향성, 속도

Wrap Speed 포그모양에 굴절을 섞는다. Volume Speed 와 적절히 섞으면 오묘한 느낌을 낼 수 있다.


볼륨포그의 veiw Distance 조절을 해준다.