Created on | Updated on

Houdini Game Dev Tools:Texture Sheetsのリアルタイム合成を行う

Texture Sheetsの基本はこちら

より新しいTexture Sheetsは多くの機能が追加されています。
こちらは先日のセミナーにてSideFXの方よりご紹介があった拡張部分です。

この機能を使用するには細心のGameDevelopmentToolsetをGitHubのDevelopmentからダウンロードしてください。

この機能を使用すると、単純に1枚のシートに設定するだけなく、どのようにテクスチャをパッキングするかComposite Viewで確認しながら決めることができるようになります。

まずはPyroエフェクトを作成してください。

このチュートリアルに使用可能なサンプルデータはこちらからダウンロード可能です。(※パスワードはborndigital、データサイズは1GB)

シーン内には、pyro_cacheというデータがあり、シミュレーションのキャッシュを読み込でいます。


キャッシュにMantraのFireballを適用されいます。
Mantraでレンダリングするの下記のように表示することができます。
(ビューポートでビジュアライズするデータは含んでいません。)

キャッシュには下記のデータが含まれています。

これをHoudini内でコンポジットして下記のようなTexture Sheetsにまとめます。

 

はじめに/OutでTexture Sheets(Game)を作成します。いくつかあるのですが、下記と同じものを作成してください。

パラメーターを確認すると、オプションが拡張されていることがわかります。

Settingsで出力するSprite Sheetの設定がわかりやすくなりました。

下記は、1から64フレームを1枚のTexture Sheetに合成する場合です。

Images Per LineでU方向に並べる数を指定するので今回は8枚とします。

Resolutionで1枚に合成した場合のTexture Sheets解像度を決めるため、4096×4096でレンダリングすると設定します。

すると、その下部分に4096*4096を8(フレーム数)で分割した場合のAtlas LayoutResolution per frame(フレームでの解像度)が表示されます。ここでは1フレーム当たり512*512でレンダリングされることがわかります。

次にNodes To RenderでTexture Sheetsにするためのノードを選択します。ここではPyro_cacheを指定しました。

MapsカテゴリでRender RGB LightRender Emission Layerを有効にすることができます。

この2つのマップを出力することで、リアルタイムエンジンの中でダイナミックにシェーディング、ライティングができるようになります。

Render RGB Lightを有効にすると、下記画像のように軸に合わせてR、G、Bの6個のライトが作成されます。

Volumeのノーマル情報を出力することは大変ですが、Houdiniのこの拡張機能では2つの方法をブレンドして可能にしています。Houdiniはデフォルトでボリュームのグラディエントをレンダリングする機能があります。それが下記画像のVolume Normalsとなります。こちらはDetailを保持します。

Render RGB Lightを有効にした場合、下記画像の左下にある状態でレンダリングします。

この2つをブレンドすることがボリュームの法線情報を取得する最も良い方法となります。

Render Emission Layerは、爆発等による発光部分を別のLayerとしてレンダリングします。これは後からリアルタイムエンジンで発光をコントロールするために使用することが可能です。

次にMantraノードを作成します。この部分が重要で、Mantraノードと組み合わせることでTexture Sheetsを更に拡張可能です。

Valid Frame RangeをRender Frame Rangeに変更し、Start/Endでテクスチャシートにまとめるフレームを指定します。次にCameraを指定してください。

Mantraでこの2つを設定しTexture Sheetsに接続すると、Texture Sheetsのオプションは入力無効になります。
Mantraノードから情報を取得する形となります。

作成したMantraとノードをTexture Sheetsを下記のように接続します。

その後、Texture Sheetsノードを確認すると

Image Sequenceは、MantraのOutput Nameで指定した名前が自動的に定義されます。

Texture Sheetsで設定した追加レイヤー(RGB LightやEmission、Normal)をアクティブにするために、MantraノードのExtra Image Planeタブを開きます。

ここでまず、Shading Normalを有効にします。
これは、Texture SheetsのExport Normalと接続され、Volume Normalをレンダリングします。ここがオフになっているとVolume Normalがレンダリングできないのでご注意ください。

次にObjectsタブに移動します。

Candidate Objectsは空欄にします。
Force ObjectsにPyroオブジェクト(Texture SheetsノードのNode To Renderに追加したものと同じ)を指定します。これでPyroのみがテクスチャシートにレンダリングされます。

Exclude Lightに@rgb_lightrigと入力します。これはTexture SheetsノードのRender RGB Lightを有効にしたときに作成されたノーマル計算ようのRGBライトをライト計算に追加しないようにするためです。

レンダリングクオリティのために、今回はexture SheetsでMicropolygon Renderingを選択しました。必要があればPixel Samplingの数値をあげてください。

これで準備が完了です。

テストレンダリングのため、MantraノードでStart/Endを16フレーム分にしてレンダリングしました。


Texture SheetsのRenderボタンを押してください。これがTexture Sheetsコンポジットの元になります。

レンダリングが終了したら、Texture Sheetsノードをダブルクリックして中に入り、COMPOSITINGノードをダブルクリックします。(Composite Viewで結果を表示するために一旦COMPOSITINGを展開する必要がある)

一度COMPOSITINGを展開すれば、選択し続ける必要はありません。再度Texture sheetsノードに戻って、調整します。

次にComposite Viewで1フレームにすると1枚に統合されたTexture Sheetsがレンダリングされます。
Texture Sheetsは既に合成された結果として1枚のシートになっています。そのため、1フレーム以外だと表示されません。また、いったんComposite ViewでCOMPOSITINGノードの結果(つまりTexture Sheets)がレンダリングされたら、再度Texture Sheetsノード自体の選択に戻って大丈夫です。

これでどのようにテクスチャをパックしたり、Volume NormalとRGB Light NormalをブレンドするのかComposite Viewを見ながら調整することができます。

まずは、ノーマルのブレンド率を調整します。

Texture SheetsのChannel PackingタブでTexture PreviewをNormalsに変更します。

Base SettingsタブのBlend N and RGB Lightのスライダーを変更します。
※リアルタイムでコンポジットを行っているため、並べるテクスチャ数が多いと更新に時間がかかる場合があります。

先ほど一度紹介した下記の画像のようにRGB LightとVolume Normalのブレンドを目で見ながら調整できます。

値を0にするとVolume Normalの結果のみになります。

値を0にするとRGB Lightの結果のみになります。

実際に必要な結果になるまでスライダを調整します。一度レンダリングしたものをComposite Viewで合成しているだけなので、再レンダリングの時間はかかりません。

更にChannel PackingタブでTexture PreviewをPackedに設定すると、RGBA各チャンネルにここで定義した画像が設定されその結果がビューポートに表示されます。

上記がデフォルトの設定で、RとGにノーマルマップの結果のRとGを設定し、BにはEmission_Normalisedを入力しています。これはEmissionの値を正規化して、グレースケールにしています。

1つにパックするイメージが下記になります。

実際にComposite Viewには下記のように表示されます。

変更している様子をムービーにしてみました。

 

このPackするためにレンダリングする画像をMantraノードのExtra Imageで追加することができます。

例えば、シーンに下記のように2つのライトが存在し、各ライトの強さをPackしたいとします。

 

Mantraノード>Imagesタブ>Extra Image Planesを2つ追加します。

1つ目のVEX Variableはdirectとし、2つ目のVEX Variableはdirect_emissionとします。
各ライトごとに出力するため、Export variable for each lightをオンにします。

更にEmissionも同じようにしますが、ライト情報が必要ない倍は、No Lgiht exportsにします。

追加した2つのパスはまだレンダリングされていませんので、再度レンダリングを実行します。

レンダリング結果を表示してみます。他のチャンネルをSet to 0にすると黒になるので、1つのチャンネルをしっかり確認することができます。

必要なチャンネルをパック設定し、実際に必要なフレームに合わせてレンダリングを行ってください。

 

下記のサイトにMike氏による解説ムービーとUE4データをダウンロード可能です。

https://www.sidefx.com/ja/tutorials/channel-packing-pyro-data-using-the-texture-sheets-rop/

上記のUE4のシーンをダウンロードし、自分で作成したテクスチャに置き換えてみます。

問題が解決しない場合は、Born Digital サポートまでお問い合わせ下さい。

※ 問い合わせ対応はBorn Digitalより製品をご購入頂きましたお客様のみのサービスとなります。ご了承下さい。
サポート問い合わせ