TWA Houdini1/Volumes

TWA 후디니 1 Volume_13_01 : 최소한 Volume Visualization과 똑같이 랜더하기

yiss09 2023. 3. 15. 03:49

https://www.twahoudini.com/course/volumes1

 

HOUDINI1_ VOLUMES

2️⃣ 볼륨의 기초이론과 응용 그리고 SIMULATION까지 경험해보세요.

www.twahoudini.com

 

Volume Visualization을 통해 Scene view에서 보는 결과와 실제 랜더 Volume 결과를 동일하게 뽑을 수 있는가?

Palette에서 제공하는 Pyro Shader만을 가지고 우리가 원하는 색, 원하는 조절을 만들어내는 것은 쉽지 않을 수 있다.

오늘 배우는 테크닉은 Scene view에서 보이는 Volume Visualization 결과와 랜더 결과를 일치시키는데에 있다.

Volume13의 강의을 통해 Volume 랜더에 자신감을 가지게 될 것이라 예상한다.

 


 

먼저 새로운 Geometry에 Rubber toy를 만들어준다.

VDB from Polygons로 Rubber toy를 Fog VDB로 만들어준다. voxel size를 0.02까지 높여준다.

 

랜더 세팅을 해주겠다.

Light를 하나 생성해준다. Type은 Distant로 한다. 각도를 틀어주고, y축으로 방향으로 높이를 높여준다. 이름을 a로 둔다.

Camera를 생성한다. Lock Camera로 Rubber toy가 잘 보이도록 카메라 위치를 조정한다.

Scene view에서 Split pane Tom/Bottom으로 Viewport를 분리해준다. 아래쪽 Viewport를 Render view로 두도록 한다.

새로운 Networkview를 생성해 Out으로 지정해준다. Mantra를 생성해 objects 카테고리에서 Force Objects와 Force Lights에 랜더에 사용할 Geometry와 Light를 입력해준다. 카메라를 방금 만든 Camera로 설정해준다.

 

이제 Geometry 안에서 만든 Density 자료를 Volume Visualization으로 보겠다.

Density Scale을 높여준다면 밀도가 차오르는 것처럼 표현될 것이고, Shadow Scale을 높여준다면 그림자의 세기가 커지는 것을 확인할 수 있다.

Fog VDB에 output을 연결해 랜더 결과를 확인해본다면 화려한 결과는 아니지만 기대했던 Density로 인해 만들어진 Volume 결과를 확인할 수 있다. Material 없이도 결과를 볼 수 있는 것을 확인하였다. 

Scene view와 Render view의 사이즈를 동일하게 만들기 위해서 카메라의 Resolution을 960x480으로 낮춰주겠다.

 

이제부터 핵심으로 들어간다. 오늘 강의에서의 핵심은 Volume Visualization을 통해서 Scene view로 보는 결과와 랜더의 결과를 동일하게 만드는 것이다.

앞서 만들어둔 녀석의 Scene view에서의 모습과 랜더에서의 결과가 거의 동일한 상태이다.

약간의 차이가 있다면 Scene view보다 랜더의 해상도가 낮은 점, 감마 값의 차이로 밝기에 약간 차이가 있다는 점이다.

Scene View에서 D를 눌려 감마 값을 변경해주겠다.

 

Volume Visualization에서의 파라미터의 값들을 바꿔주었을 때 Scene view에서의 모습과 동일한 결과를 Render view에서 보기를 원한다.

이를 위해서 이제 Material을 달아 작업해줄 예정이다. VDB from Polygons 아래에 Material을 달아준다.

 

Material Palette의 Volume 항목을 보면, Smoke를 묘사해줄 Shader들이 존재하는 것을 볼 수 있다.

Basic Smoke, Cloud, Constant Smoke를 가져오도록 하겠다. 이 셋을 비교해보겠다.

Basic Smoke는 Cloud와 Constant Smoke와는 다르다. Cloud와 Constant Smoke는 Material Builder라고 적혀있지만, Basic Smoke는 Pyro Shader라고 적혀있다. 또한 Pyro Shader는 Rock이 걸려있으며, 이미 어떤 Template으로 되어있다. 그럼에도 그 안에서의 작동은 Attribute Vop처럼 작동하고 있는 것을 볼 수 있다. Basic Smoke는 당장은 사용하지 않을 예정이다.

 

Cloud와 Constant Smoke를 주목해보겠다.

먼저 Constant Smoke를 보면 조절 가능한 파라미터가 2가지 밖에 없는 것을 볼 수 있다. 먼저 Constant Smoke를 Material로서 활용해보겠다.

랜더 결과로는 Material이 없을 때와 큰 차이가 없는 것을 볼 수 있다.

만약 Volume Visualization과 마찬가지로 Density Scale이 10인 결과를 보고 싶다면, Constant Smoke의 Smoke  Density를 10까지 올려주도록 한다. 

아쉽게도 랜더 결과로 Constant Smoke를 썼을때는 그림자의 느낌이 원했던 결과가 아닌 것을 볼 수 있다.

 

Cloud가 가진 파라미터는 Constant Smoke보다 그 수가 많은 것을 볼 수 있다.

이제 Cloud를 Material로서 사용해보겠다. 랜더 결과로는 Material이 없을 때와 큰 차이가 없는 것을 볼 수 있다.

Cloud의 파라미터 값을 바꿔준다면 어떻게 되는지 한번 보겠다.

Cloud Density를 10까지 올려주었다. Volume Visualization과 큰 차이가 없는 랜더 결과가 나왔다. 기대했던 결과가 나온만큼 앞으로 진행할 내용에서는 Cloud를 사용하겠다.

 

앞으로의 작업에서 Obj와 Mat을 옮겨다니며 파라미터를 수정해주는 것은 매우 번거로울 것이다.

이제 Material에서의 값은 초기값으로 설정해둔 뒤에, Obj에서 Attributes를 활용해 파라미터의 값들을 조절할 수 있도록 만들어줄 예정이다.

이에 Cloud node의 Input Operators 부분과 Material Builder 내부에서의 그 구조를 이해할 필요가 있다.

우선 Input Operators를 보면 생각보다 작동에 쓰이는 값이 적은 것을 볼 수 있다.

만약 어느 파라미터에 어떠한 Attributes가 쓰이는지 궁금하다면 파라미터에 마우스를 가져다 대면 생기는 정보 박스에 관련 내용이 적혀있다. Cloud Color의 경우 Diffr Diffg Diffb가 쓰이고 있는 것을 볼 수 있다.

이렇게 출처가 정해진 녀석들을 제외하면, Density와 Cd가 남게 된다. Density와 Cd는 Cloud가 아닌, Material의 전 단계(VDB from Polygons)에서 Density와 Cd의 정보를 제공받게되고 Shader로서 이용하고 있는 것이다. 이때 Cd에 대한 정보가 Node info에서 확인이 안된다면, 자동으로 {1,1,1}의 값으로써 정보가 작동할 것이다.

 

Mat에서 파라미터를 변경하기보다는, Obj 단계에서 Attributes 값을 수정해 파라미터의 값들을 변경해주도록 하겠다.

하지만 Particle에 비해서 Volume에서는 이러한 과정이 더 복잡하다. 겁먹지 말고 차근차근 알아보도록 하자.

 

우리가 만든 Density가 Cloud Shader를 통과하면서 시각적으로 더 진해보이게 되었다. 이때 Cloud Density에 10이 쓰여 있었다. 여기서 쓰인 Cloud density의 값은 그냥 float 정보가 아닌 Volume으로서 이해하면 좋다.

영역 안에 모두 float 정보 10을 가지는 Volume이 있다고 생각하면 이해하기 쉽다.

density와 동일한 모양과 Volume을 가진 clouddensity라는 Volume이 있다고 가정해보겠다. 이때 density와 동일한 선상에 clouddensity를 Material에 들어가기 전 Merge로 묶어서 Material로 넣어준다면, clouddensity가 Volume으로서 준비가 되었다고 인식되게 될 것이다. 그리고 그 다음 density와 clouddensity를 비교하면서 얼마나 진하게 보이게 될지 결과를 내주는 것이다.

만약 voxel마다 밀도가 다르다면, 그 각각의 밀도 값에 따라 얼마나 진하게 보일지 계산해주게 될 것이다. clouddensity뿐만 아니라 Cloud의 Input Operators에 있는 모든 Attributes들이 이러한 방식으로 계산되게 될 것이다.

 

이제 Cloud의 Input Operators에 있는 정보들을 Volume으로써 준비해주면 될 것이다. 대신 준비를 해주지 않는다면, 그 값들을 density를 기준으로 cloud가 알아서 떼워줄 것이다.

이 중에서 우리는 준비를 해주었을 때 의미가 있는 정보들을 Material 전에 직접 만들어서 제공해줄 것이다.

 

 Volume Visualization에서 예쁜 값들을 얻어놓고 Render에서 제대로 예쁜 결과를 뽑지 못하는 경우가 많다. 기왕 잘 만든 Smoke를 Scene view와 동일한 수준으로 뽑을 수 있어야 한다. 그리고 랜더 세팅을 Volume Visualization과 같은 세팅으로 다루어낼 수 있다면 이용하기에도 굉장히 편할 것이다.

이제 도장깨기 하듯이 Volume Visualization 세팅과 랜더 세팅을 일치시켜보겠다. 이때 우리가 쓸 Material이 이런 값을 요구하는구나 하고 받아들이는 자세로 공부하도록 하자.

 

가장 먼저 clouddensity부터 세팅해주겠다. Name node로 density의 정보를 clouddensity로 변경해준다.

이름을 제외한 어떤한 값의 변화도 없기 때문에 지금은 density와 그 정보가 같다. Volume Vop에서 Constant node를 연결해 clouddensity 값이 10이 되도록 해주었다. 이로인해 Volume Visualization에서 Density Scale이 10인 것과 Render view에서 같은 결과가 나타나게 된다.

 

Shadow Scale에 대한 값도 만들어주겠다. Name으로 shadowscale 정보를 생성해준 뒤, Volume Vop을 달고 null을 달아 정리해준다.

Volume Vop 안에서 shadowscale에 대한 값을 생성해주겠다. Parameter를 달아 Volume Vop 밖으로 shadowscale에 대한 파라미터를 빼내었다. Geometry 단계에서 shadowscale의 값을 조절할 수 있게 되었다.

마찬가지로 앞에서 만들어두었던 clouddensity의 Constant도 Parameter node로 교체해준다.

이때 파라미터에서의 이름에 _를 치는 이유는 Attributes와 이름이 완벽하게 똑같으면 오류가 날 가능성이 있기 때문이다.

 

null node를 생성해 volume_render_control이라는 이름을 달아준다.

앞으로 Volume Vop에 들어갈 내용들을 control에서 한번에 조종할 수 있게 만들어주도록 하겠다.

control에서 clouddensity와 shadowscale에 대한 파라미터를 생성해 Copy Parameter로 정보를 Volume Vop과 Volume Visualization에 연결해주겠다.

이제 지금부터는 Volume Visualization과 control에서의 기능을 똑같이 만든다는 느낌으로 작업해보겠다. 앞으로 생성되는 파라미터의 Copy Parameter에 대한 내용은 생략하겠다.

 

먼저 Density에서 Min, Max 값에 대해서 조절해주겠다. Density에 Volume Vop을 달아주겠다.

Volume Vop 안에서 density에 Fit Range를 연결해 Input으로 들어오는 정보에 대해 Min, Max 값을 조절해주려한다.

Volume Visualization에서의 내용을 생각해보면 Destination Min, Max는 0~1 사이의 값으로 고정되어야한다. 그러므로 우리가 변경해주어야 하는 값은 Source Min, Max가 되겠다.

Parameter를 두 개 생성해 각각 Source Min, Max에 연결해주겠다.

이제 Density Ramp를 생성하려한다. Fit Range로 구해준 0~1 사이의 값을 Ramp Parameter로 꾸며주려한다.

Ramp Type은 Spline Ramp로 정해준다.

 

이전에 처음으로 SDF를 배울 때 0 근처 값을 조명해 보는 것을 연습한 적이 있었다. 이제 해당 묘사를 Render view에서도 동일하게 뽑아낼 수 있을지 실행해볼 예정이다.

 

VDB from Polygons와 IsoOffset, Primitve를 교체해준 뒤 랜더 결과를 확인해보면 원하는 결과가 잘 나온 것을 볼 수 있다.

 

이제 Cd를 만들어줄 차례이다. 해당 정보는 Volume Visualization에서의 Diffuse Ramp 역할을 할 것이다.

Name으로 Density를 Cd.x, Cd.y, Cd.z 3개의 정보로 변환해준다. 그 다음 Merge 해준 뒤, Convert VDB로 Volume 정보를 VDB 정보로 변환해주겠다. 그 다음 VDB Vector from Scalar로 Cd의 정보들을 하나의 vector 정보로 만들어주겠다.

Density 정보에 기반해 색깔 정보를 지정해주어야하기 때문에, density와 Cd를 Merge로 묶어 Volume Vop에서 작업해주도록 하겠다.

Bind Export로 Cd(vector) 정보를 생성해주었다. Vop global의 de

nsity와 Bind Export 사이에 Fit Range와 Ramp Parameter를 달아주었다.

Fit Range의 Source Min, Max는 Parameter로 조절할 수 있게 연결해주었다. 해당 파라미터의 내용은 Diffuse Range의 내용이 될 것이다.

Ramp Parameter의 Ramp Type은 RGB Color Ramp로 한다. 해당 Ramp 파라미터는 Diffuse Ramp의 역할을 한다.

밖으로 나와서 Volume Vop 아래에 Blast node를 달아 중복되는 정보인 density에 대한 정보를 제거해준다. Volume Vop 안에서 density를 기반으로 완성된 Cd 정보만이 남아있게 된다.

control에서 폴더를 생성해 파라미터들을 보기 편하게 구분지어 주었다.

 

이제 Mat으로 가서 Cloud node의 안쪽 내용을 살펴보려한다. 어떤 Volume 출력을 위해 고전적으로 이용된 node들이 있는 것을 볼 수 있다.

Volume Model node에서의 Input Operators의 내용들이 어디서부터 연결되어 있는지 따라가보자.

density의 정보는 density로부터, densityscale은 clouddensity로부터 정보를 받고 있는 것을 볼 수 있다.

Multiply에 연결된 정보를 보면 emit_clr(emission color)와 연결된 것을 볼 수 있다. Ce라는 값에 emit, density, clouddensity가 곱해진 결과가 어떤식으로 Volume이 빛날지를 정해주는 정보가 된다.

Smoke_clr을 보면, {1,1,1}의 diff(Cloud Color) 값에 Cd가 곱해진 결과이다.

현재 Cloud node 내부의 정보 중 우리가 아직 정의해주지 않은 정보는 Ce와 emit의 정보만이 남았다. 하지만 emit이라는 값은 얼마나 더 빛날지 그 세기를 정해주는 값이기에 결과적으로 Ce 값을 강하게 둠으로써 해결이 가능하다. 따라서 지금 만들어야 하는 정보는 Ce 하나뿐이라고 할 수 있다.

Ce 정보 또한 색에 대한 정보이기에 vector 정보가 될 것이다.

 

Cd에서의 Merge까지의 내용을 그대로 복사해 Cd를 Ce로 변경해주었다. Merge 아래에 Volume Vop을 달아 Ce 정보를 수정해주었다.

이제 Volume Visualization에서의  Emission 탭을 그대로 만들어주겠다.

먼저 Ce(vector)의 Bind Export를 생성해준다. Vop Global의 density와 연결해준다.

둘 사이에 이제 Fit range를 달아 Emit Range의 기능을 하도록 만든다. 이때 Emit Range와 Emission Color Range는 보통 동일하게 사용하기 때문에 Fit Range를 하나만 만들도록 하겠다.

Ramp Parameter를 Spline, Color 타입 두 개를 만들어 하나는 Emission Ramp로 다른 하나는 Emission Color Ramp로서 사용해주겠다.

Emission Scale로써 이용될 Parameter를 하나 만들어주겠다.

이제 Multiply를 달아 Color Ramp, Spline Ramp, Parameter 순으로 연결해주겠다.

control에서 Emission에 대한 폴더를 하나 만들어주겠다.

 

이렇게 Volume Visualization에서의 결과와 Render View에서의 결과를 비슷하게 뽑아내는 방법에 대해 배웠다.

Volume Visualization에서 잘 만들어놓고 Render로 결과를 뽑지 못하는 상황은 이제 오지 않도록 Volume13_01에서 배운 내용을 다양한 결과에서도 연습해보는 시간을 가져야겠다.

 

 

Rubber toy와 앞전에 만들어둔 Smoke를 Render한 결과이다. 컴퓨터 성능이 좋지 않아서인지 영 시원찮은 결과가 나와 아쉬울 따름이다.