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等の情報を
フラグメントに渡す方法を共有できたらと思います。