Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

테드옹의 VFX

Solaris + Copernicus에서 표면에 디테일 주기 본문

Houdini

Solaris + Copernicus에서 표면에 디테일 주기

Tedd_Kim 2024. 10. 5. 22:31

디스트럭션 작업 시 모델과 룩뎁이 된 상태의 어셋에서 작업을 시작하지만, FX작업을 하는 과정에서 나온 inside면의 디테일이 부족하면 샷의 완성도와 리얼함에 방해가 된다. (흔히 말하는 CG티가 난다는..)

 

20.5부터 코페르니쿠스의 등장으로 FX에서도 맵을 뽑고 inside면 텍스쳐링을 할 수 있을 것 같아서 사용법을 찾아봤는데, 아직까진 파라미터의 컨트롤이 완전하지 않고 익숙하지도 않아서 그냥 Karma Builder에서 비슷하게 시도했다. 결과는 괜찮게 나온 것 같아서 까먹지 않게 + 생각의 과정을 기록하기 위해 포스팅

 

 

일단 정말 간단하게 구성한 네트워크에서 나온 결과물이고, base color는 주지도 않았는데 표면의 디테일이 올라온 모습

 

 

원본 지오메트리는 4,880개의 포인트와 5,952개의 프리미티브이고, 간단한 Boolean Fracture와 Labs Edge Damage를 이용해서 생성했다. (랩스툴로 생성된 덴트는 나중에 오클루전을 이용해서 음영을 조금 더 강조해도 좋을 것 같다. 단순한 라이팅으로만은 조금 부족한 느낌)

 

(사견) : 아무리 Fracture의 커팅면에 노이즈를 잘 줘도, 결국 그 자체 결과로는 날카로운 엣지들이 많이 나오기 때문에 CG티가 팍팍나는 지오메트리가 생성된다. 그래서 클로즈업샷을 작업한다면 데미지 버전을 생성한 후에 RBD 시뮬레이션 과정에서 스왑을 해주는 형식이 제일 이상적인 것 같다. (이건 Transform Pieces대신 Copy to Points를 이용하면 간단하게 해결될 일)

 

아무튼 프랙쳐가 끝난 지오메트리에 rest와 N어트리뷰트를 생성하고 LOP으로 가져가서 Shader 작업을 이어가면 된다.

 

결과에 사용된 셰이더 내부인데, 미친사람들의 포스팅만 보다가 이정도 네트워크면 정말 인간적인 모습 아닌가 싶다

그리고 MtlX를 쓰면서 느끼는 거지만, 정말 Principal Shader의 노드들이 너무 그리워진다

 

사용된 주요 노드는

- MtlX Geometry Property Value : VOP의 bind와 같은 역할을 한다

- MtlX Unified Noise 3D : 0-1의 노이즈를 준다

- MtlX Fractal 3D : Zero Center 즉, -0.5 ~ 0.5의 노이즈를 준다

- MtlX Height to Normal : 그레이스케일 맵을 Normal로 바꿔준다

- MtlX Normalmap : 오브젝트 혹은 탄젠트 공간의 노말벡터를 월드 스페이스로 변환해준다

- MtlX Range : VOP의 fit range와 같은 역할을 한다

- MtlX Surface Unlit : 다른 광원에서부터 라이팅 계산을 하지 않는 Surface 셰이더, 노이즈 볼때 유용하다

- MtlX Seperate : VOP의 Float to Vector 같은 느낌

- Karma Rounded Edge : Surface의 엣지를 샘플링하여 마치 Bevel을 적용한 것처럼 노말을 블렌딩해준다 (Ta-bom!)

 

이 경우엔 쓰지 않았지만 추가적으로 Material X에서 자주 사용되는 노드는

- MtlX Geometry Color : Cd어트리뷰트를 샘플링한다

- USD Prim Var Reader : 솔라리스 primtive의 primvar를 읽어온다

- Karma Ray Import : 아놀드의 State Vector나 만트라의 Global Parmeter역할

- Karma Complement Color : 인풋 Color를 꼽으면 보색을 계산해주는 노드 같다

- MtlX Occlusion : 이름 그대로 오클루전 계산

- Karma AOV

 

조금 의아했던게 Unified노이즈는 결국 모든 노이즈 타입을 하나로 모아둔 노드인데, Unified Noise의 프랙탈 노이즈와 MtlX 프랙탈 노이즈가 주는 결과가 서로 달랐다. (내가 잘못 썼겠지 뭐..)

 

이쪽도 PBR 셰이더답게

01. Base Color : Color

02. Specular Roughness : Float

03. Metallic : Float

04. Normal : Vector3

05. Height (=Displacement) : Float

06. Emission : Color

이렇게 기본적으로 넣어주면 된다.

 

나를 위해 쓴 포스팅이긴 하지만 혹시라도 셰이더에 익숙하지 않은 사람을 위해서 첨언하자면, 20버전부터는 텍스쳐 파일에 OCIO 컬러스페이스 변환이 들어가기 때문에, Color벡터와 Vector3벡터는 철저하게 구분해줘야한다.

 

[ Surface Normal ]

 

처음엔 rest어트리뷰트에 스칼라 곱을 해서 노이즈의 frequency를 조절한 후 노말벡터로 사용했고 (도대체 왜 노이즈 노드에 Frequecy 조절기능이 없는지 모르겠음), RBD의 Hard Edge를 누그러뜨리기위해 Karma Rounded Edge를 사용했다 (이거 너무 신기함)

 

 

Unlit된 Float 노이즈에서 생성된 패턴

 

 

그레이스케일 노이즈 패턴을 MtlX Height to Normal에 넣었을시 나오는 노말맵

 

 

이정도만 해줘도 저런 표면 디테일이 나온다, 개인적으론 inside에 저정도의 디테일만 줘도 99%경우엔 RBD 디테일로 문제되는 경우가 별로 없지 않을까 싶다. (원본 지오메트리는 충격적으로 low이기 때문에 노말맵으로 무에서 유를 창조한 급)

 

[ Height ]

 

ChatGPT 4-o인지 뭐시기한테 물어본 결과 (확신하냐고 재차 질문도 했음), Karma와 MaterialX는 Displacement를 먼저 진행하고 이 후에 Surface 셰이딩을 계산한다고 했다.뭐 사실 커스텀하게 생성된 노말맵으로 디스플레이스를 할 순 없으니 저건 당연하다 생각되고, 때문에 Dicing(Tessellation) 퀄리티를 올려주거나 지오메트리 자체의 폴리곤수가 어느정도 올라오지 않으면 Geometry Normal만으론 부정확한 Displace가 될 수 있다는 것 주의

 

 

이번엔 Worley노이즈를 이용해서 패턴을 만들었고, 너무 정직한 패턴이 나와서 Worley노이즈에 포지션값을 넣기 전에 rest포지션에도 노이즈를 줘서 너무 Generic하지 않은 패턴을 만들었다.

 

 

대충 이렇게 생긴 노이즈가 나왔고, 이걸 MtlX Displacement노드에 꼽으면

 

 

이런식으로 Peak 밸류쪽에서 지오메트리가 실제로 Displace하게 된다. 보통 작업에선 Outside 룩뎁은 건드릴 수 없으니 Inside에만 적용할테고, 그러면 RBD Interior Detail노드를 이용해서 마스크를 생성해주면 될 것 같다. (혹은 커스텀으로 만들거나)

 

위 과정들은 정말 간단한 예시이고 노이즈 패턴을 이용해서 Base Color와 Spec값들을 조절해주면 RBD 작업에 쓸만한 꽤나 괜찮은 프로시쥬얼 셰이더를 만들 수 있을 것 같다.

 

사실 여기에서만 텍스쳐를 만들기엔 20.5의 신기능인 코페르니쿠스에 비해선 활용도가 한참 떨어지긴해서 친숙해질겸 대충 찍먹만 해봤다. 

 

[ Copernicus ]

 

기본적으로 맵을 제작하는 워크플로우이기 때문에 지오메트리의 uv를 잘 관리해주어야하고 (특히 inside같이 새로 생겨난 면), Rasterize를 통해서 지오메트리의 정보 등을 가져올 수도 있다. 따라서 섭디의 기능과 섭페의 기능을 동시에 활용할 수 있을 것 같다.

 

 

코페르니쿠스에 대한 강의는 워낙 많이 풀렸으니 일단 Height맵과 노말맵을 제작해준 후

 

 

맵의 마지막 단에 null노드를 달고 경로를 op:/을 앞에 붙여서 참조해주면 된다 (ex. op:/obj/copernicus_normal_map/lopnet1/copnet1/NORMAL)

Quick Surface Material을 통해 프리뷰한거라 앞에 사용했던 Karma Edge 처리등도 들어가지 않았는데, 똑같은 로우 지오메트리를 사용해도 저정도의 디테일이 나온다.

 

굳이 Map을 Export하지 않아도 프리뷰를 할 수 있어서 편하지만, OpenCL 기반의 프레임워크라서 만약 회사에서 이용한다면 렌더팜에서 오류가날 수도 있으니 로컬이 아닌 환경에서 렌더링을 해야한다면 맵을 따로 저장해야할 것 같다.

 

rest 어트리뷰트만을 활용해도 되는 3D 프로시쥬얼 셰이더와는 달리 코페르니쿠스는 uv를 관리해줘야하는 번거로움이 있지만, 당연 코페르니쿠스의 활용도가 훨씬 뛰어난 것 같다. (사실 uv 관리라 해봤자 labs auto uv같은 좋은 노드들이 있어서 그것도 딱히..)

 

 

[ 팁과 활용하기 좋은 노드들 ]

 

- Control + Alt + S를 누르면 코페르니쿠스 환경에서 작업할 때 굉장히 편해진다 

- 섭디와 비슷하게 Height맵을 먼저 만들고, 그것을 기반으로 Base Color와 Roguhness를 만들어주는게 가장 직관적인 플로우 같다

 

- Tile Pattern

- UV Map by ID

- UV Transform

- Random

- Height to Ambient Occlusion

- Mono to RGB

- Streak Blur (급격한 Height의 격차를 블렌딩 해주는데 좋음, 블러보단 더 노이지함)

- Slope Direction

- Position Map (0-1 uv 타일 생성)

- Dilate Erode

- Equalize (Level을 자동 조절해줌)

- Feather

- Remap (fit range)

 

 

 

'Houdini' 카테고리의 다른 글

Volume Shader Demystifying  (0) 2024.11.08
Fog Volume의 표면만 필터링하기  (1) 2024.11.07
Non Commercial 힙파일 변환  (1) 2024.09.25
USD Solaris 개념 정리  (1) 2024.06.08
Hython Render Command  (0) 2024.02.23