당신은 당신의 이웃을 사랑하...
당신은 volume visualization을 통해 Scene view에서 보는 결과와 실제 volume의 render 결과를 동일하게 뽑을 수 있는가?
이 부분이 핵심이다.
오늘 배울 테크닉은 씬 뷰에서 보이는 volume visualization의 결과와 volume render의 결과를 일치시키는 데 있다.
러버토이를 만들고, vdb from polygon으로 fog vdb를 만든다.
그리고 기본적인 render setting을 잡아주고 둘의 비교를 원활하게 하기 위해서 아래 이미지처럼 위/아래로 창을 나누고 각각 Scene view / render view를 띄워준다.(같은 크기로 놓고 보길 원해서 카메라 resolution을 960 x 480으로 맞췄다)
현재의 장면은 fog vdb로 얻은 결과(위)와 그것을 곧바로 mantra를 통해 render를 진행한 결과(아래)이다. (머티리얼이 따로 달리거나 하지는 않았다.)
둘이 비슷하다. 약간의 차이가 있다면, scene view보다 render의 해상도가 낮은 점, 감마값의 차이로 인해 밝기에 차이가 있다는 점, 이밖에 전반적인 느낌은 같다고 봐도 될 듯하다.
이제 volume visualization의 parameter에 변화를 가해보자.
density scale을 10으로 올려줬고, scene view에서는 밀도가 그만큼 차오르게 보이고 있다. 이와 동일한 결과를 render view에서 얻어보자.
이제부터는 material을 달아서 작업을 진행한다.
material palette에 가서 보면 volume 항목에 smoke를 묘사해 줄 만한 많은 shader가 존재하고 있는 것을 볼 수 있다.
일단 basic smoke, constant smoke, cloud를 가져와서 확인해 보자.
Basic Smoke - 오늘 딥하게 다룰 것은 아니다. 적혀있는 것처럼, pyro solver의 결과, 폭발이나 화염, 불과 같은 쪽을 다루기에 특화되어 있는 shader이다.
오늘은 위의 것을 다룰 것은 아니고, 아래의 두 shader에 주목하기로 한다.
Constant Smoke
constant smoke shader 안으로 dive 해보면 뭔가가 많아 보이긴 하는데, 막상 shader에서 조절할 수 있는 parameter는 smoke color와 smoke density 뿐이다. 일단 material에서 활용해 보자.
일단 큰 차이가 발생하지는 않았다. constant smoke의 smoke density를 위의 volume visualization처럼 10으로 올려보자.
그럼 이번에는 cloud를 확인해 보자.
parameter에서 constant smoke보다는 무언가 조절할 수 있는 항목이 좀 더 있다. 일단 기본값으로 material에서 사용해 보자.
이제 material에서 parameter에 변화를 줘보자.
cloud density의 값을 1에서 10으로 올려준 결과이다. constant smoke를 사용해서 density를 올렸을 때와는 확실히 차이가 있다.
constant smoke에서는 우리가 원했던 그림자의 표현이 제대로 묘사되지 않았다. 그래서 오늘은 constant smoke도 제쳐둔다. cloud를 중점적으로 다뤄보기로 한다.
만약 volume visualization(이하 volvi라고 칭한다. 길다...)의 shadow scale을 10으로 올려준 결과와 같은 render 결과를 얻으려면, cloud의 어느 parameter를 만져줘야 할까?
Shadow Density Multiplier의 값을 1에서 10으로 올려주면 될 것이다.
계속 이렇게 material network view와 object network view를 왔다 갔다 하면서 수치를 조절하고 하는 것은 귀찮다. 우린 이제 material은 기본값으로 두고, 값의 조절은 obj network view에서 하도록 작업해 줄 예정이다.
cloud shader가 어떠한 input operator를 사용하고 있는지 볼 필요가 있다.
density
clouddensity
diff
Cd
emit
shadowscale
phase
Cloud Color parameter는 위의 7개의 input operator 중 어떤 것에 해당되는지 확인해 보자.(마우스를 위에 가져다 대면 나온다.)
cloud color는 diff(diffusion)에 연결된다는 것을 알 수 있다.
Cloud Light parameter는 위와 같은 방법으로 확인해 본다면, emit과 연결된다는 것을 알 수 있다.
Cloud Density는 clouddensity, Shadow Density Multiplier는 shadowscale, Scattering Phase는 phase에 연결이 되는 것을 확인이 가능하다.
이렇게 연결이 되고 난 뒤, input operator에는 아직 연결되지 않은 두 개가 남게 된다. density와 Cd이다.
쉐이더 작동이 올바르게 되려면, 위와 같이 7개의 정보가 모두 필요한 것이다.
그렇다면, density와 Cd는 정보의 출처가 어디일까?
당연하게도, material 노드 위쪽에서 density나 Cd의 정보를 제공받고 그 뒤에 쉐이더가 적용되는 것이다.
density에 대한 정보는 반드시 필요하다.
대신에 Cd의 정보가 따로 없다면, 기본값인 1,1,1처럼 작동하게 된다.
우리가 기본적으로 제공한 density가 cloud라는 쉐이더를 통과하면서 시각적으로 보이는 방식이 바뀌었다.
더 진하게 표현되었고, 이때 cloud density의 값은 10이었다. 이 때 이 cloud density의 값은 그냥 float이 아니고, volume으로 이해하면 더 좋다.
density 볼륨과 동일한 모양에 동일한 voxel 규칙을 가지는 cloud density 볼륨이 있고, 그 볼륨은 float 정보를 10으로 가지고 있다고 이해하면 된다.
density와 cloud density를 merge로 묶어주고 material에 넣어주면, 쉐이더는 density와 cloud density가 볼륨으로서 이미 준비되어 있다는 것을 인지하게 된다. 그리고 이제 density와 cloud density를 비교하면서 얼마나 진하게 묘사할지 결과를 내주게 된다.
각각 대응되는 위치에 cloud density를 활용해서 density를 더 진하게 묘사해 주게 된다.
이 말은 곧, cloud density의 voxel이 각각 다른 값을 가지고 있다면, 그 값을 density에 곱해주게 되면서 density의 밀도 묘사를 해주게 된다는 것이다.
미리 준비되지 않는 정보들은 cloud 쉐이더의 parameter 값을 가져와서 적용하게 된다.
이번에는 density와 Cd 값을 미리 정의해서 제공하게 된다면 어떻게 될까?
Cd값을 제공하지 않을 경우, Cd를 1,1,1로 고려해서 묘사가 되고, Cd를 제공하게 된다면, 제공되는 Cd(vector volume)와 diff를 곱해준 결과를 smoke의 color로 사용하게 된다.
cloud 쉐이더가 요구하는 7개의 input operator들을 volume으로 준비해 주면 된다. 만약 준비되지 않는 것들은 density를 기준으로 cloud shader가 알아서 정보들을 채워서 사용하게 될 것이다.
이 중에서 준비를 해줬을 때 의미가 있는 operator volume들을 material 전에 직접 만들어서 제공해 줄 것이다.
이론은 길더라도 포기할 수 없다.
기껏 예쁘게 색도 주고 연기를 다 만들었는데, 표현 못하는 경우가 정말 많다. 특히 씬 뷰 상에서 색을 화려하게 잘 줬으면서 렌더 하는 시점에 씬 뷰와 동일하게 뽑지 못해서 고민하는 사람이 많다.
기왕 잘 만든 연기는 '최소한' 씬 뷰와 동일한 수준으로 뽑을 수 있어야 한다.
그리고 volume visualization setting으로 다뤄낼 수 있으면 정말 편하다. 작업 전반에 volvi로 세팅하는 것에 익숙해져 있기 때문에 그렇다.
이제 하나씩 volvi 세팅과 렌더세팅을 일치시켜 보자.
우리가 사용하는 material들이 이러한 값을 요구하는구나 하고 받아들이면 좋다.
cloud density를 만들자.
일단 volume VOP 안에서 bind export로 clouddensity를 적어주고, constant 값을 연결했다.
위의 결과는 마치 volvi에서 density scale이 0일 때의 결과와 같다.
shadow scale도 작업을 해보자.
각각의 constant로 연결했던 내용을 parameter로 연결해서 Volume VOP 밖에서 수치를 조절할 수 있도록 해준다.
tip!!!
parameter로 뽑아줄 때 Name을 보면 bind export의 name과 다르도록 가운데 '_'가 들어가는 것을 볼 수 있다. 이렇게 다르게 적어주는 이유는, bind export의 name과 parameter의 name이 같으면 오류가 발생할 수 있기 때문에 '_'를 사용해서 다르게 기입해 주는 것이다.
volume 작업을 진행할 때 control 노드를 만들어서 여러 값들을 노드 하나에서 조절할 수 있었던 것처럼, 이번에도 그러한 노드를 만들어주도록 하자.
edit parameter interface로 들어가서 이전과 마찬가지로 parameter를 만들어주는데, 관리가 용이하도록 folder부터 만들어주도록 한다.
이곳에서 만들어지는 parameter는 copy parameter - paste relative references의 조합으로 각각의 Volume VOP parameter에 붙여 넣어준다.
copy parameter - paste relative references 작업은 volvi에도 동일하게 적용해 준다. 그렇게 되면, 우리가 만들어주는 control 노드 하나로 volvi와 출력 세팅을 동시에 다뤄줄 수 있다.
이제는 대놓고 volvi와 같은 기능으로 만들어준다는 마음으로 작업을 진행해 보도록 하자.
volvi의 minimum / maximum에 대한 부분은 density 노드 라인에서 작업을 진행하면 될 것이다.
우리가 현재 관심 있는 부분은, input으로 들어오는 정보에 대해서 0 ~ 1 사이로 묘사를 하고 싶은 것이다. 그 이유는, volvi처럼 minimum / maximum에 따라 input 데이터를 density ramp에서 활용이 가능하도록 0 ~ 1 사이의 정보로 묘사해 줄 것이기 때문이다.
parameter를 만들어서 source min / max에 연결해 준다.
그리고 control 노드에 parameter를 만들어주고, 값을 연결해 준다.
이번에는 volvi의 ramp 부분을 만들어보자.
ramp parameter도 copy parameter - paste relative references가 먹힌다!!!
이제 diffuse ramp를 하나 더 만들어주자. 이번에 만들 diffuse ramp는 float이 아닌, color로 만들어줄 것이고, 이 정보는 앞으로 다룰 Cd에 대한 정보가 된다.
일단 diffuse range에 대한 설정이 필요하고, 이 값에 따라서 색을 조절할 수 있으면 된다.
density 정보를 name 노드를 사용해서 각각 Cd.x / Cd.y / Cd.z로 복제해 준다. (마치 이전에 vel을 만들던 것과 같다.)
복제한 세 개의 name 노드는 merge로 묶어주게 되면 일반 볼륨 세 개가 묶여있는 것을 볼 수 있다.
convert VDB로 일반 볼륨을 VDB로 바꿔주고, VDB Vector Merge로 하나의 vector VDB로 만들어준다.
(19 버전에서는 VDB Vector Merge의 이름이 VDB Vector from Scalar로 바뀌었다.)
이렇게 만들어진 Cd라는 VDB vector volume을 활용해서 diffuse ramp의 color 부분을 꾸며줄 것이다. 그런데, density를 기반으로 해서 색의 정보를 지정해줘야 하기 때문에, 두 정보를 묶어줄 필요가 있다.
이제 volume VOP을 연결해 주자.
일단 우리가 얻고 싶은 결과는 density가 아니고 Cd 이기 때문에 Bind Export를 사용해서 Cd 정보를 결과로 빼낼 것이라는 것을 기입해 둔다.
그리고 density의 어떤 구역을 주목하고 싶은지 정해줘야 하기 때문에 fit function으로 clamp 할 곳을 정한 다음, 0 ~ 1로 확대 / 축소해 주도록 하자.
만들어준 parameter는 위에서와 마찬가지로 control에 edit parameter interface에서 parameter를 만들어주고 값을 연결해 준다.
control의 수치를 바꿔주고 러버토이를 연결해서 확인해 보자.
둘이 잘 적용되는 것을 볼 수 있다.
이제 volvi의 emission 기능만 구현해 주면 된다.
emission을 확인하기 위해서는 cloud 쉐이더 안쪽으로 dive 해서 확인해 볼 필요가 있다.
volumemodel 노드에 활용된 density는 density 정보를 받아서 사용되었다.
densityscale은 clouddensity 정보를 받아서 사용되고 있다.
shadowscale과 phase는 parameter로 나가있다.
smoke_int는 smoke_intensity로 현재 어떠한 정보가 연결되어있지는 않다.
smoke_clr은 smoke_color로 diff와 Cd의 값을 multiply해준 값을 정보로 사용하고 있다.
emission_int는 emission_intensity로 현재 어떠한 정보가 연결되어있지 않다.
emission_clr은 emission_color로 현재 노드를 보면, density와 clouddensity, emit, Ce를 multiply 한 결과를 정보로 사용하고 있다.
- 이 부분이 어떤 식으로 volume이 빛날지 묘사해 주는 부분이다.
- emit의 값은 얼마나 더 세게 빛날지를 정해주는 부분이기 때문에, Ce가 세게 정해진다면, emit은 1로 고정해도 상관이 없다.
- 즉, 우리가 현재 만들어야 할 정보는 Ce라는 값이다.
- Ce는 색에 대한 정보이기 때문에 Vector volume이 필요하다.
위에서 Cd를 만들어줄 때와 유사한 부분이 있으므로, 그 부분에 대한 세팅을 잡아준다(혹은 복사해서 가져와도 된다. 이때, name은 Cd.x 가 아니고 Ce.x이다)
volvi의 emission folder를 확인해 보자.
emission scale : 얼마나 세게 빛날지를 정해주는 값(float), cloud 쉐이더 안에서 emit에 대응되는 값이다.
emission field : 어떤 field를 활용해서 어디에서부터 어디까지를 조명할 것인가(emit range). density를 사용하게 될 것이다.
현재 우리가 만들고 있는 세팅 역시 density를 그대로 활용하고 있다. 이 부분은 volume VOP 안에서 fit function으로 density를 조명해 주면 된다.
그리고 이렇게 만들어진 0 ~ 1 사이의 값을 ramp를 활용해서 곱해준다.
0 ~ 1 사이의 값을 색으로 표현하는 부분에서 구체적인 Ce 정보가 나오게 되고, float ramp 데이터는 곱해지는 값이 될 것이다.
그리고 마지막에 emission scale을 곱해주면 된다.
참고로, emit range와 emission color range는 copy parameter로 연결해서 많이 사용하기 때문에, 한 번에 작업을 해주기로 한다. (volume VOP 안에서 density를 분석함에 있어서 fit function을 두 개 사용하지 않을 것이다.)
만들어진 parameter는 Control에서 조절할 수 있도록 Copy Parameter로 link 해준다.
Scene View와 Render View의 색감 차이는 어쩔 수가 없다. Scene view에서는 조명에 대한 영향이 더 rough 하게 작용을 하기 때문에 이러한 차이가 발생하는 것은 어쩔 수가 없다.
이렇게, volvi의 기능을 갖춘 volume render setting이 마무리되었다.
이 세팅으로 작업을 진행하면, material network view를 왔다 갔다 할 필요가 없다.
이제 이것을 가지고 brute의 smoke를 render 해보자.
처음 volume render를 해보는 과정치고 꽤나 복잡했다.
선생님이 강조하고 싶은 부분은 우리가 지금까지 volume을 봐왔던 방식과 같은 방식으로 render를 할 줄 알 필요가 있다는 점이다. volume visualization에서 색을 주면서 Scene view로 보는 것은 쉽지만, 그 결과를 render 할 때 pyro shader로 한방에 처리하는 것이 지금 단계에서는 쉽지 않을 수 있다.
그리고 오늘의 과정을 밟아봐야 material에서 요구하는 정보가 무엇인지 우리가 직접 찾아서 준비하는 능력을 기를 수 있다.
권장하는 것은, 지금까지 작업했던 내용들에 대해 꼭 render를 진행해 보는 것이다.
숙제.
다음 수업에서는 별다른 설명 없이 바로 수업에 들어가게 된다.
연기 자료 있어야 하고, 스파크, 전기라인, 머티리얼 세팅이 잡힌 브루트까지 있어야 한다.
잘 준비해 둘 것!!!
즐겁고 신나는 volume render가 시작되었다.
render를 한 번씩 걸 때마다 컴퓨터가 비명을 지르고, 오늘은 별다른 트윜이 없었지만, 트윜이 있을 때마다 컴퓨터가 죽여달라고 소리를 지르지만, 아직은 보낼 수 없다... 요즘 좀 텅장사정이 빠듯해...
오늘의 수업으로, 결과를 만들어내는 것에 한발 더 다가선 느낌이 든다.
천년만년 공부만 하고 있을 수는 없기에 오늘도 하게 되는 고민,
'나는 왜 후디니를 공부하는가?'
'내가 후디니로 하고 싶은 작업은 무엇인가?'
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
14_연기 QUALITY 올리기, TEMPVEL (0) | 2023.03.14 |
---|---|
13_VOLUME RENDER_part2. Brute 최종 랜더 (전기, 스파크 면만들기, Pass 따로 뽑기) (1) | 2023.03.11 |
12_전기에 따른 스파크(PARTICLES) (1) | 2023.03.09 |
11_part2. 캐릭터 움직임에 따른 전기 효과 (0) | 2023.03.08 |
11_part1. 전기 만들기 (0) | 2023.03.07 |