14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Copernicusで直接トゥーンレンダリングを行う

Last updated at Posted at 2024-07-20

rubberToy.gif

はじめに

Houdini 20.5からベータ版として新たな画像処理フレームワークCopernicusが追加されましたね
実用性があるかはさておき、勉強がてらMantraやKarmaを使わずCopernicusのみで簡単なトゥーンレンダリングを行ってみました
まだ私もCopernicusを触り始めたばかりなので何かおかしい点があるかもしれません。気付いた点があればご指摘いただけると幸いです。

本記事で使用しているHoudiniのバージョンは20.5.278です
本記事で作成したHIPファイルはこちらです
image.png

ベースシーンの作成

カメラがラバートイのまわりを旋回する簡単なシーンを用意しました。ライトの種類はDistantです
flipbook.gif
image.png

ジオメトリのラスタライズ

image.png
このセクションではジオメトリの情報をレイヤ(画像のPlane)としてラスタライズします。
一番はじめの手順にして今回のCopernicus解説のなかで一番面白い機能です。

まずCOP Networkを作り、SOP ImportでジオメトリをCOPに持ってきます。
image.png

Rasterize Setupはジオメトリの座標を調整したり、法線やDepthを作成したりするノードです。
今回のラバートイには法線アトリビュートが無かったので、ここで作成します。
image.png

Camera ImportでカメラをCOPに持ってきます。
ディスプレイフラグをONにすると、カメラがある位置に黒い平面が表示されます。
image.png

Rasterize Geometryはあるカメラから見たジオメトリの情報をレイヤにラスタライズするノードです。
Quick Setups↓をクリックするとラスタライズする情報の一例が選択できます。ジオメトリに存在するアトリビュートであればここに無いアトリビュートもラスタライズできます。
image.png
今回はQuick SetupsからN Alpha Depth from eyeを選択しました。
NがAttirbutesの一番上にあるのでレイヤにカメラから見たラバートイの法線が表示されていることがわかります。
これまでもSOPでpointを作ってrayを飛ばしてprimuvでアトリビュートを参照して...みたいなことで似たことはできましたが、COPだけでその処理が行えるのは便利ですね。
image.png

Match Cameraは、あるレイヤを他のカメラ空間に変換するノードですが、二番目のcamera_ref入力に何も指定しないとXY平面に戻されます。
これですべてのレイヤをXY平面に戻します。
image.png
(ちなみにこの変換をレイヤごとではなく一括で行う方法ってあるんでしょうか...ご存じの方がいれば教えて下さい)

シェーディングと着色

このセクションではシェーディングの計算とかをやっていきます
image.png

ライト方向ベクトルの定義

シェーディングを計算するためにはライト方向ベクトルが必要なのですが、Copernicusではライトの情報は取得できないようです。普通にConstantで特定の向きのライトを定義してやってもいいのですが、直感的じゃないし調整もしづらいので、obj階層のライトの回転を参照することにします。

まず普通にobj階層でdistantライトをTransform無しで作成すると、ライトは(0,0,-1)の方向を向いていることが分かります。
image.png

ライト方向ベクトルは光子が光源から進む方向ではなく、照らされる面から光源に向けたベクトルなので、Constantでライトの向きに-1を掛けた(0,0,1)を入力します
image.png

Vector Transformでライト方向ベクトルを回転させます。このときRotateチャンネルでobj階層のライトの回転を参照することで、回転が連動するようになります
image.png
つまりCOPのカメラ方向ベクトルをハンドルで制御できることになります
Animation.gif

内積の計算

Dot Productで法線とライトの内積を計算します。これで光源と同じ向きの面は1、正反対の面は-1の値が返されます。
image.png

image.png
(画像引用元:【連載】Unity時代の3D入門 – 第5回「拡散反射ライティング」)

Lambert shadingの説明はggればいくらでも出てくるので、詳しく知りたい方は調べてみてください。

色の調整

色を調整しやすくするために色のレンジを(-1,1)から(0,1)Remapします
image.png

Rampで色のグラデーションを変えます。今日は猛暑日だったので涼しげな色にしてみました
image.png
Rampパラメータの右上に並んでるアイコン達の一番左のアイコンをクリックすると補間モードが変えられます
image.png

背景色の合成

Constantで背景色を定義します
image.png

BlendのModeをOverにして前景レイヤーを背景レイヤーに重ねます。
maskにはジオメトリのラスタライズのときに作ったAlphaを接続します。
image.png

エッジの作成

Copernicusでエッジを作成するにあたり、複数のノードがあるようです。
今回はとりあえず無難にDepthから作成することにします。
image.png

DepthをEdge Detect by Depthに接続するとエッジが出ます。
image.png

エッジのところは真っ白にしたかったのでremapでホワイトレベルを下げます。
image.png

いい感じにラインの色を定義します。
image.png

Blendノードを使い、エッジをシェーディングしたラバートイに重ねたら出来上がり!
image.png

おわりに

今後の正式版実装が楽しみなフレームワークです:eyes:
従来のCOPよりも遊びがいがありそうです。
OpenCLノードもあるのでゴリゴリコードを書くのも楽しそうですね。

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?