HoudiniでGLSLシェーダを作る / 4.頂点シェーダで頂点を動かす!
さて、今回はヴァーテックスシェーダの方に関わっていきます!
基本はフラグメントシェーダとほぼ同じで、むしろこっちの方が楽です。
いろいろ説明等
今回のベースもスフィアです、ジオスフィアはエフェクトに嬉しい。
フラグメントと同じでコードの中腹ぐらいまでスライドすると
mainになるコードを見つける事が出来ます。
↑こんな感じ。
ビューでのポジションの描画についてはこの式で構成されているようです。
ここを変更すれば位置が変わる、という事。
このPは何処から来ているのか
ヴァーテックスシェーダの最初の方で定義されているっぽい。
条件付コンパイル?で用意されてました。
特に何もいじってない場合は上の方が使われているはず...。
つまりlayout(location=0) in ver3 P; がアトリビュートのPを拾ってきてくれています。
layout(location=x)の意味は良くわかっておりません!
頂点を変更してみる
という事でPの情報はアトリビュートからそのままPとして拾ってきてくれているので
Wrangleと同じ感覚で編集出来ます。
P*0.5すれば原点計算で半分のサイズになるはず。
↓
ちなみに、見た目的な変化でしかないのでデータ的な頂点の位置などは残ったままです。
頂点をSinで動かす
ちょっとsinつかって動かしてみる。
前準備。
・floatパラメータ(time)を追加。
・timeには$Fのエクスプレッションを設定。
・ヴァーテックスシェーダにはフラグメントシェーダでやったようにパラメータの取得コードを追加する。
これをSinに使います。
Sinってどういう動きするんだっけ?と思う時があるので、まずは色に当ててみる。
↓
GLSLだとラジアン変換が必要なので事前にそれをtimeに加えておく。
(-1)~(1)いってるから、(0~1)に変更。
Sin を lerp用に移植。
(LerpじゃなくてMixだったの忘れてた)
変化後の値をP2として定義。
PとP2を行ったり来たりする式を作成。
動いてる!やった~
頂点をテクスチャで動かす
lerpの値をSinじゃなくてテクスチャにしてみましょう。
先にUVをSOPで設定しておかないと駄目です、UV持ってないと意味ないので。
・テクスチャサンプラ(mixTexture)を追加。
・適当にサンプラにテクスチャぶっこみます。
・パラメータの取得コードを追加する。
テクスチャを値として取得、Rだけもらえればよいのでそこだけ気を付ける。
まずは色に乗せて値が出ているか確認。
あとはUをスクロールさせたいので、UVを分解してU(uv.r)に時間を加算させてます。
いけるや~ん☝☝
それじゃあ、カラーを戻してポジションにつかっているlerpをtexlerpに差し替えてみます。
☜ぐねぐね~☞
カラー戻したけど、やっぱり色つけて、フラグメントシェーダをunlitに変更した物がこちら
前述したとおり、見た目だけ変わっていたので位置の情報はそのまま
こんな感じで結構お手軽に頂点アニメーションを試せます。
↓頂点アニメーションの例
アトリビュートの取得
パラメータの取得以外にもアトリビュートの取得が出来ます。
例としてAttrubuteNoiseで作った色情報を、
オリジナルのアトリビュートにして色として表示するまでの流れをこちらに書いておきます。
まずはCdに転写した場合の絵。これをマテリアルで表示されるようにしてみます。
Cd ⇒ @iro
と設定。
当然Cdがないのでこうなる。
in を使います。
in vec3 iro;
で取得できる。
※Vertexはこれだけで済みますが、
フラグメントでinを使うにはこの情報の運搬コードが必要になります。
あとはそのまま色に渡せば、
こんな感じで使えている事が確認できます。
ちょっとした情報
ヴァーテックスシェーダを見ていて
フラグメントシェーダで詰まりそうなところがあったのでこれも一応報告。
テクスチャ使わずに、UV情報だけ使いたい場合があります、ありました。
ヴァーテックスシェーダの段階で下記の様に
If文でテクスチャ使わない場合はUV情報捨てちゃうよ、となっています...。
なのでIf消して上だけ残しておくのが安パイだと思います。
こんな感じ
おしまい
次は頂点シェーダ上の自分で作った値やUV2等の情報を
フラグメントに渡す方法を共有できたらと思います。