線形モデルをビルボードさせる

今回のネタは↑のこれを出来るようにします。

 

用意する物

・線形のモデル

ビルボード用の調整をいれたマテリアル

 

線形モデルに必要な情報

均を等幅にしたモデル(1mとか)

作り方はお任せ、パス作ってからExtrudeでZ方向に+1とかするのが楽かも

UVの向きはどちらでもいいけど、均等に0-1で納める

やってる事の説明

A.     シェーダで線形モデルの幅を0にして、骨のようにする

B-1.  モデルのUVを使って幅を作り直す

B-2.  モデルの背骨が向いている方向(VertexTangent)とカメラの向きを使って
      幅を行列変換させる

C.      AにBを足す

マテリアルの設定

 

 

TransformVectorノードを使わないで同じことをする (WorldSpace To TangentSpace)

UE4には便利な変換ノードがあります。

f:id:serano_vfx:20210429155606p:plain

めちゃくちゃ利用してるノードなのに中身がどうなってるのかわからないのが
自分的にめたんこ嫌なので同じ事が基本ノードで出来るようになっておきたい、という事で調査。
何度かに分けて簡単に共有できればと思います。
(知識が無さ過ぎてこれが正解なのでは?という所まで持っていくのに1年近くかかった)

 

今回はワールド座標から接空間座標への変換の計算をご紹介
自分で色々計算式しらべて見つけた答えなのですが、間違ってたら連絡ください・・・orz

f:id:serano_vfx:20210429160243p:plain

上がトランスフォームノードでWorldSpace to TangentSpaceを選んだ時
下がWorldSpace to TangentSpaceを計算ノードで行う場合
※他のトランスフォームは別の計算が必要です
 戻すとき(TangentSpace to worldSpace)には別の計算が必要です 


f:id:serano_vfx:20210429161551p:plain

←がTransformVectorノード →が今回の計算、一応合ってるはず(やや不安)

HoudiniでGLSLシェーダを作る / 4.頂点シェーダで頂点を動かす!

さて、今回はヴァーテックスシェーダの方に関わっていきます!
基本はフラグメントシェーダとほぼ同じで、むしろこっちの方が楽です。

いろいろ説明等

今回のベースもスフィアです、ジオスフィアはエフェクトに嬉しい。
f:id:serano_vfx:20200713142731p:plain

フラグメントと同じでコードの中腹ぐらいまでスライドすると
mainになるコードを見つける事が出来ます。

f:id:serano_vfx:20200713142536p:plain

↑こんな感じ。

 

f:id:serano_vfx:20200713142802p:plain

ビューでのポジションの描画についてはこの式で構成されているようです。
ここを変更すれば位置が変わる、という事。


このPは何処から来ているのか

ヴァーテックスシェーダの最初の方で定義されているっぽい。
条件付コンパイル?で用意されてました。
特に何もいじってない場合は上の方が使われているはず...。

つまりlayout(location=0) in ver3 P; がアトリビュートのPを拾ってきてくれています。
layout(location=x)の意味は良くわかっておりません!

f:id:serano_vfx:20200713145051p:plain

頂点を変更してみる

という事でPの情報はアトリビュートからそのままPとして拾ってきてくれているので
Wrangleと同じ感覚で編集出来ます。

P*0.5すれば原点計算で半分のサイズになるはず。
f:id:serano_vfx:20200713143016p:plain

f:id:serano_vfx:20200713142917p:plain

ちなみに、見た目的な変化でしかないのでデータ的な頂点の位置などは残ったままです。

f:id:serano_vfx:20200713151335p:plain

頂点をSinで動かす

ちょっとsinつかって動かしてみる。

前準備。
・floatパラメータ(time)を追加。
f:id:serano_vfx:20200713151646p:plain

・timeには$Fのエクスプレッションを設定。

f:id:serano_vfx:20200713151721p:plain

f:id:serano_vfx:20200713151835p:plain

ヴァーテックスシェーダにはフラグメントシェーダでやったようにパラメータの取得コードを追加する。
f:id:serano_vfx:20200713151627p:plain

これをSinに使います。

Sinってどういう動きするんだっけ?と思う時があるので、まずは色に当ててみる。

f:id:serano_vfx:20200713152158p:plain

GLSLだとラジアン変換が必要なので事前にそれをtimeに加えておく。

f:id:serano_vfx:20200713154923p:plain
f:id:serano_vfx:20200713154832g:plain

(-1)~(1)いってるから、(0~1)に変更。

f:id:serano_vfx:20200713155439p:plain

Sin を lerp用に移植。
(LerpじゃなくてMixだったの忘れてた)
変化後の値をP2として定義。
PとP2を行ったり来たりする式を作成。

f:id:serano_vfx:20200713160049p:plain

f:id:serano_vfx:20200713160318g:plain
動いてる!やった~

 

頂点をテクスチャで動かす

lerpの値をSinじゃなくてテクスチャにしてみましょう。
先にUVをSOPで設定しておかないと駄目です、UV持ってないと意味ないので。

・テクスチャサンプラ(mixTexture)を追加。

f:id:serano_vfx:20200713160829p:plain

・適当にサンプラにテクスチャぶっこみます。
f:id:serano_vfx:20200713161144p:plain

・パラメータの取得コードを追加する。
f:id:serano_vfx:20200713160819p:plain

テクスチャを値として取得、Rだけもらえればよいのでそこだけ気を付ける。

f:id:serano_vfx:20200713161742p:plain

まずは色に乗せて値が出ているか確認。

f:id:serano_vfx:20200713161616p:plain

あとはUをスクロールさせたいので、UVを分解してU(uv.r)に時間を加算させてます。

f:id:serano_vfx:20200713162658p:plain
f:id:serano_vfx:20200713162223g:plain
いけるや~ん☝☝

 

それじゃあ、カラーを戻してポジションにつかっているlerpをtexlerpに差し替えてみます。
f:id:serano_vfx:20200713162635p:plain

f:id:serano_vfx:20200713162541g:plain
☜ぐねぐね~☞

カラー戻したけど、やっぱり色つけて、フラグメントシェーダをunlitに変更した物がこちら

f:id:serano_vfx:20200713162924p:plain

前述したとおり、見た目だけ変わっていたので位置の情報はそのまま

f:id:serano_vfx:20200713163015p:plain

こんな感じで結構お手軽に頂点アニメーションを試せます。


↓頂点アニメーションの例

f:id:serano_vfx:20200713164102g:plain
f:id:serano_vfx:20200713163449g:plain

アトリビュートの取得

パラメータの取得以外にもアトリビュートの取得が出来ます。

例としてAttrubuteNoiseで作った色情報を、
オリジナルのアトリビュートにして色として表示するまでの流れをこちらに書いておきます。

まずはCdに転写した場合の絵。これをマテリアルで表示されるようにしてみます。

f:id:serano_vfx:20200713164803p:plain

Cd ⇒ @iro
と設定。

当然Cdがないのでこうなる。
f:id:serano_vfx:20200713164940p:plain

in を使います。

in vec3 iro;

f:id:serano_vfx:20200713165146p:plain
で取得できる。
※Vertexはこれだけで済みますが、
 フラグメントでinを使うにはこの情報の運搬コードが必要になります。

あとはそのまま色に渡せば、

f:id:serano_vfx:20200713165547p:plain
f:id:serano_vfx:20200713165626p:plain

こんな感じで使えている事が確認できます。

ちょっとした情報

ヴァーテックスシェーダを見ていて
フラグメントシェーダで詰まりそうなところがあったのでこれも一応報告。

テクスチャ使わずに、UV情報だけ使いたい場合があります、ありました。
ヴァーテックスシェーダの段階で下記の様に
If文でテクスチャ使わない場合はUV情報捨てちゃうよ、となっています...。
f:id:serano_vfx:20200713202918p:plain

 

なのでIf消して上だけ残しておくのが安パイだと思います。

 f:id:serano_vfx:20200713203202p:plain

こんな感じ

 

おしまい
次は頂点シェーダ上の自分で作った値やUV2等の情報を
フラグメントに渡す方法を共有できたらと思います。

HoudiniでGLSLシェーダを作る / 3.エフェクト用フラグメントシェーダの整理

※今回は[HoudiniLab]の[Labs Flowmap Shader]をほぼそのまま使ってきているので
 出せる情報かなり浅いです、申し訳ありません・・・。

 
目的はライトを見てしまっているシェーダなのでライトを見なくするシェーダに変更しつつ、
シェーダの中の情報整理を行う事です。

デフォルトのコードは結構な量のコードになっていてウワァーとなってしまいますが
コードを見て上からざっくりとした内容として、
------------------------------------------------------------------------------------
・頂点シェーダからの値の引き取り
f:id:serano_vfx:20200608145506p:plain

・パラメータの取得_Houdini自動ユニフォーム
f:id:serano_vfx:20200608145526p:plain

・いくつかのビルドイン関数
f:id:serano_vfx:20200608145653p:plain

・メイン処理
f:id:serano_vfx:20200608145717p:plain
------------------------------------------------------------------------------------

こんな感じです。

今回はフラグメントシェーダのメイン処理の部分をエフェクト用にスッキリさせようと言う話です。
具体的な作業は、If文と一部のデフォルト値を変更していらない情報を整理。

それではやっていきます。

diffuseのIf文

f:id:serano_vfx:20200608151356p:plain

f:id:serano_vfx:20200608152208p:plain
f:id:serano_vfx:20200608161938p:plain
▲テクスチャを使うならこっち

こんな感じで他もガンガン削っていき、パラメータ参照してた物は値に変えていく。

opacityのIf文

f:id:serano_vfx:20200608151609p:plain
f:id:serano_vfx:20200608152404p:plain

emissionのIf文

f:id:serano_vfx:20200608152515p:plain

f:id:serano_vfx:20200608152616p:plain

oclusionとmetallicのIf文(テクスチャが32枚を超えた場合実行)

f:id:serano_vfx:20200608152803p:plain
はテクスチャそんな使わないので削除。

nN,rough,diff_roughのコード

f:id:serano_vfx:20200608153547p:plain
はそのまま使う。

f:id:serano_vfx:20200608153749p:plain

glH_LightingEnabledのIf文

※ライティングが有効なら1、無効なら0の整数が返される、その結果。

f:id:serano_vfx:20200608153959p:plain
から下に降って

f:id:serano_vfx:20200608160558p:plain

赤線までがほぼ一つのイフ文になっている模様
勉強不足ですが条件コンパイル的な物が使われているらしい...

f:id:serano_vfx:20200608161650p:plain
自分には複雑なコードだったが、ライティングオンじゃない時の表示について記述されているのは
最後のelseの部分だけのようなのでそれをほぼそのまま使う
アルファだけ頂点アルファ(fsIn.Color.a)とテクスチャアルファ(tex.a)の乗算に変更。

wireのコード

f:id:serano_vfx:20200608155211p:plain
最後のこれはそのまま使う。(ワイヤフレームの表示に関わる値です。)

 

これでunlitなシェーダが作れたはず・・・!

HoudiniでGLSLシェーダを作る / 2.フラグメントシェーダの改造_パラメータの追加

※注意※シェーダ知識があまりないので間違った説明があるかもしれません。

今回は前回作成したフラグメントシェーダを改造する所までご紹介。

ポイントは

---------------------------------------------------------------

 1. diffuseTextureをそのまま利用する

 2. パラメータを使う
---------------------------------------------------------------

HoudiniのSOPはこんな感じになっています。

f:id:serano_vfx:20200511145547p:plain

f:id:serano_vfx:20200511145627p:plain

1. diffuseTextureをそのまま利用する

前回基本のGLSLシェーダを作りましたが、そのシェーダを複製して
複製したシェーダでは
前回追加したパラメータを減らして[Diffuse Texture Layers]フォルダ内だけ残します。

f:id:serano_vfx:20200511144616p:plain
▲こちらは前回用意したパラメータです。

f:id:serano_vfx:20200511144726p:plain
▲[Diffuse Texture Layers]フォルダ内だけを残して他を削除した状態にします。

f:id:serano_vfx:20200511145147p:plain
▲[+]を押すと

f:id:serano_vfx:20200511145213p:plain
▲テクスチャとUVの指定、設定をする場所が追加されます。


f:id:serano_vfx:20200511145816p:plain

f:id:serano_vfx:20200511145802p:plain

▲テクスチャとUVが指定されていればこんな感じになります。

 

2. パラメータを使う

引き続き作成したシェーダを[Edit Operator Type Properties]ウィンドウで 

[Code]タブを開きます。

f:id:serano_vfx:20200511150545p:plainf:id:serano_vfx:20200511150605p:plain▲赤線のボタンを押してFragment Shaderだけを見れるようにしておくと
 コードを書くのが少し楽になります。

コードの中腹ぐらいまでスライドするとmainになるコードを見つける事が出来ます。

f:id:serano_vfx:20200511151101p:plain▲スライドしてみると結構量が多い事がわかるのですが、今回弄るのはここだけ。
 if文になっていますが、内容は
 テクスチャを刺してないない場合は白色にする、という事みたいです。

 なので、このif文は消してしまいます。 

f:id:serano_vfx:20200511152441p:plain
▲ifとelseとelseの中身を削除。

試しにテクスチャではなく、色にしてみます。

f:id:serano_vfx:20200511152635p:plain

f:id:serano_vfx:20200511152655p:plain
tex = HOUsampleDiffuseMap(fsIn.texcoord0); から
 tex = vec4(1.0, 0.0, 0.0, 1.0); に変更した結果


これを変更前の状態に加算してみる。

 

f:id:serano_vfx:20200511153032p:plain
f:id:serano_vfx:20200511152809p:plain
tex = HOUsampleDiffuseMap(fsIn.texcoord0) + vec4(1.0, 0.0, 0.0, 1.0);
 テクスチャの上に色を加算できるようになりました。

色は変えられるようになりましたが、数値をわざわざコードで変更するのはとても大変なので
パラメータから色を変えたいですよね。
なので、パラメータを用意してシェーダが拾えるようにします。

 

f:id:serano_vfx:20200511151635p:plainf:id:serano_vfx:20200511153529p:plain
▲色とアルファのパラメータを追加、ラベルと名前を設定します。
 [Name]がCodeで拾える変数になります。

f:id:serano_vfx:20200511153825p:plain
▲こんな感じでパラメータが追加されています。

 

パラメータを取得するコードを追加します。

パラメータを取得する為のコードは

[uniform + Type + ParameterName]

----
今回の場合はRGBA、名前はaddColorなので
Typeは Vector4
ParameterNameは addColorになります。
----
uniform vec4 addColor;

こう書けば取得できます。
f:id:serano_vfx:20200511154229p:plain
▲こんな感じですね。
 パラメータを追加するコードは頭に置いていますが、もっと良い場所があるかもしれません。

 

取得したコードを先ほどの加算式から差し替えます。

f:id:serano_vfx:20200511154901p:plain
tex = HOUsampleDiffuseMap(fsIn.texcoord0) + addColor;

 

 

f:id:serano_vfx:20200511155121p:plainf:id:serano_vfx:20200511155051p:plain

 ▲RGBAパラメータを変更してみると、色が変わる事が確認できると思います。

 

Houdiniのパラメータダイアログから値を取得して
変更がサクサクできるという事はシェーダを調整する時にとても嬉しい環境だと、自分は思いました。

 

今回はここまでです。
次はいらない情報(ライト影響やラフネス等)を消す部分を説明しようかなと思います。

f:id:serano_vfx:20200511160147p:plain

▲削除出来ればとこんな見た目になって、よりゲームっぽい絵作りや
ルックの調整がHoudini上で可能になります。

ただ、自分もなんでそうなっているのか
ちょっと把握できてない部分なので説明しきれるか怪しかったりします..

上手くできなかったら申し訳ありません!

一応今後の予定としては

情報削除⇒頂点シェーダ⇒アトリビュートの取得

まで続く予定です。

 

分からない事はツイッターやブログコメントなどで投げて貰えれば追記補間できるので助かります。
独学の情報共有なので、もっとこうしたらええよ!という言葉もいただけたらとても嬉しいです!

HoudiniでGLSLシェーダを作る / 1. 基本のシェーダを作成する

まずはGLSLのカスタマイズではなく、GLSLシェーダを作るところまでです。


基本のシェーダを作成する

f:id:serano_vfx:20200407221318p:plain

[File]⇒[NewAsset...]

 

f:id:serano_vfx:20200407221611p:plain

New Assetウィンドウが開くので下記の様に設定していく

---
Node Type Name : 任意のネーム
Node Type Label  : 任意のラベル

Definition : VOPs

Network Type : GLSL Shader

Save To Library : 任意のディレクトリ(誰かに渡すものならHipと同階層か、その下階層)
---

 

 

f:id:serano_vfx:20200407223144p:plain

Edit Operator Propetiesウインドウが出てくる。
基本はHDA作る時と同じ奴なので省略。

 

 

f:id:serano_vfx:20200407223033p:plain

Codeタブを選択するとHoudiniでのGLSLシェーダの基本設定が詰まったコードが書かれている。

 

 

f:id:serano_vfx:20200407224117p:plain

基本パラメータを用意する。
ParametersタブのRenderPropertiesでOpenGLフォルダを丸ごと持ってくる。
OpenGLフォルダを探すのはfilterで検索するのが速い。
基本の設定はこれで終了、[Accept]して窓を閉じる。

 

 

f:id:serano_vfx:20200407225101p:plain
f:id:serano_vfx:20200407224833p:plain

Matから右クリック⇒DigitalAssets⇒作成したシェーダが出てくるはず

 

 

f:id:serano_vfx:20200407225700p:plain

f:id:serano_vfx:20200407225211p:plain

こんな感じになってれば成功。

---

「1. 基本のシェーダを作成する」はここまで。
自分の好きにGLSLシェーダをカスタマイズする方法については、次に続きます。