2024年12月23日月曜日

フェイクスキャッタリングライティング

この記事はHoudini Apprenticeアドベントカレンダー2024↓の22日目の記事です。
 https://qiita.com/advent-calendar/2024/happrentice

完成図


ボリュームのラインティング、真面目にやるとめっちゃ重いですよね。特にスキャッタリングが必要な場合は、ボリュームサンプリングとDepth設定を上げる必要がある為激重になります。

この記事は高速化の為に、Sopでフェイクでやる方法の解説です。
フェイクなので万能ではありませんが、雲に対して稲妻がつくるスキャッタリングなんかの時には有用です。

以下手順です。
まずは、雲と光源となる円柱を用意。


雲はHoudini20で搭載された新ノードSkyboxで一瞬で作れるようになりましたね。
調整も簡単です。

仕込みとして、円柱のほうにscatterノードでpointをばら撒きます。
(円柱のポリゴンが十分細かければ、scatterは不要です。)


このpoint群と雲のvoxelと距離を計算し、距離が離れれば離れるほど弱くなるフィールドを作り、PyroBakeVolumeノードで色を付けるという流れになります。

以下は、そのvoxelとpointの距離を計算する方法です。



雲側から円柱にscatterしたポイントをpoint cloudで参照し、Pアトリビュートを取得し、
voxel自身のPとdistanceノードで距離出します。
距離をfitノードで0~50の値を1 ~ 0の範囲に収め、元のDensityに掛け算します。



すると、以下のように近い所は元のdensity値、遠い所はdensityが0となります。


このdensityフィールドをtemperatureにNameノードで変更します。
名前はtemperatureでなくても、density以外なら何でも良いのですがpyro bake vokumeノードがデフォルトでtemperatureをscattterに変換するのでtemperatureにしています。


これを元のdensityのみの雲と合体させ(上図merge2ノード)ると、

Pyro Bake Volumeでルックを設定できます。
ScatterやFireタブでほぼリアルタイムで変更可能です。


以上で、解説は終わりです。

hipファイルはこちら

今年も本家もApprenticeもどちらのHoudiniアドベントカレンダーを盛況ですね。
素晴らしいです。過去にも多くの有用な記事あるので是非見てみてください。
以下からアクセスできます!














0 件のコメント :