TouchDesignerのGLSLでディゾルブをやってみる
はじめに
こちらはTouchDesigner Study Weekend Vo.010に参加した際に学んだことをまとめています。
運営の方含め、とても良い勉強会でおすすめです。
あくまで自分の復習の為に、まとめ直しています。
実際はもっと、有益な情報を沢山学ぶことができます。
勉強会の内容を撮影した動画も購入できるみたいなのです!
購入はこちらから
ディゾルブをやってみる
はじめの構成は以下です。
詳しくは前回の記事を参考にしてください。
頂点シェーダーの情報をフラグメントシェーダにわたす
ディゾルブを行う為に、フラグメントシェーダーのalphaを変更する必要があります。
ディゾルブと呼ぶかわからないのですが、一番簡単にやるのであれば、uniform変数としてabsTime.seconds
などの値を利用するのが簡単です。
absTime.seconds
を利用すると、オブジェクト全体がフェードイン、フェードアウトします。
◎phong1GLSLPixel
uniform float uTime; ・・・中略 void main() { ・・・中略 // Alpha Calculation float alpha = sin(uTime);
noise TOPを利用する
次はテクスチャとして利用したnoise TOPの情報を利用してみます。
webGL2.0からは、varying変数は利用できなくなり、in,outを利用します。
以下のような感じで渡します。
◎phong1GLSLVertex
out Vertex { vec4 color; vec3 worldSpacePos; vec3 worldSpaceNorm; flat int cameraIndex; vec2 texCoord; } oVert; void main() { oVert.texCoord = uv[0].st;
◎phong1GLSLPixel
in Vertex { vec4 color; vec3 worldSpacePos; vec3 worldSpaceNorm; flat int cameraIndex; vec2 texCoord; } iVert;
オブジェクトとして渡さなくても、out vec2 texCoord
のような形でも大丈夫です。
テクスチャのデータを取り出す
GLSL MATに定義したnoise TOPの情報を取り出して、アルファ値として使います。
◎phong1GLSLPixel
テクスチャのRの値を閾値として利用します。
step関数を利用して、値が0.5以上の場合は表示(alpha 1.0)、それ以外は非表示(alpha 0.0)にします。
uniform sampler2D dispTex; in Vertex { vec4 color; vec3 worldSpacePos; vec3 worldSpaceNorm; flat int cameraIndex; vec2 texCoord; } iVert; ・・・中略 void main() { ・・・中略 // Alpha Calculation float edge = texture(dispTex, iVert.texCoord).r; float alpha = step(0.5, edge);
ここまでやると、以下のような表示になります。
全体をフェードイン、フェードアウトする
noise TOPの値を利用して、sphereの一部が透明になるようになりました。
次は全体をフェードイン、フェードアウトさせるようにします。
noise TOPの値を操作していきます。
noise TOPの値にcontent TOPの値をaddします。
content TOPの色をLFOで黒から白を繰り返すようにします。
これで、sphere全体もフェードイン、フェードアウトするようになります。
1点なぜなのかわからないのですが、noise TOPと、content TOPのPixel Formatを16-bit float(RGBA)にしないと、addした結果が完全に黒にならなかったです。
ポリゴンの裏面も描画する
GLSL MATはポリゴンの裏面など、描画する必要がないポリゴンを描画しないようになっているようです。 そこで、ポリゴンの裏面も描画する場合は、Discard Pixels Based on AlphaをOnにする必要があります。
まとめ
最終的な仕上がりはこちらです。