35
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TouchDesignerAdvent Calendar 2017

Day 23

[#TouchDesigner] バックバッファを用いたGLSLの書き方

Last updated at Posted at 2017-12-22

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3132373430322f62633039666136362d363937342d636632642d383230342d3138373832653034323666632e706e67.png

この記事は、TouchDesigner Advent Calendar 2017 23日目の記事です。

はじめに

何の打ち合わせもなしに、前日の記事と内容が丸被りしました。(そんなことあるんですね...)
書き直すの面倒なので、そのまま掲載します。
ごめんなさい!!!

TouchDesignerでは、GLSLフラグメントシェーダを用いた画像の生成が可能です。
2017-12-10_160250.png
上記画像のように、単一のGLSLフラグメントシェーダであれば、GLSL TOPノード1発で済むのですが、
人間とは欲深いもので、前フレームの計算結果を利用して次のフレームの描画をしたくなる時があります...

つまるところ、このLorenz Attractorのように、
バッファを用いた描画をどうやってTouchDesigner上で実現するのか気になって夜も眠れませんでした。(昼寝てたけど)

本記事では、これを実現する方法を雑に解説します。

実装する内容

今回は、Shadertoyに掲載されている2次元波動シミュレーションをTouchDesigner上に移植します。


リリースはこちらです。(CC License) [WaveSimulationForTouchDesigner - GitHub](https://github.com/kodai100/TD_WaveSimulation/releases/tag/TD_WaveSimulationSample) (TouchDesigner099 2017.15400)

波動シミュレーションの仕組み

波動シミュレーションの解説は、うしお先生の記事が非常にわかりやすいため、
こちらを参照していただきたいと思います。

過去にUnityで実装した例も掲載しておきます。
Wave Simulation for Unity

ただし、今回の内容は波動シミュレーションを理解しなくても問題ありませんので、読み飛ばしていただいても結構です。

TouchDesignerでのバッファの作り方

一度Shadertoyプロジェクトを見てみましょう。
BufAのGLSLコードは、BufAとBufBの計算結果を参照しており、
2017-12-10_174955.png

BufBのGLSLコードは、BufBとBufAの計算結果を参照、
2017-12-10_175014.png

最終的な描画処理ではBufAの計算結果を参照しています。
2017-12-10_175027.png

TouchDesignerで同じバッファ機能を実現するためのキモは以下2つのノードを利用することです。

  • GLSL Multi TOP (GLSL TOP)
  • Feedback TOP

GLSL Multi

GLSLコードを書くためのノードです。
複数の画像を入力に受けることができます。
今回の例はGLSL TOPでも同じ効果が得られますが、僕は宗教的にこちらを使います。

Feedback

「指定されたノードの現在のフレームバッファを消去せず次のフレームに受け渡す」機能を持ったノードです。
つまり、これをうまく利用することで次フレームに現在の計算結果を引き継ぐことができます

つなぎ方

ShadertoyプロジェクトのBufAを実装する例を示します。

はじめに、Feedback TOPにConstant TOPを接続します。
このときのConstant TOPは、解像度を指定するためだけの機能を持っています。(Feedbackは接続元がないとエラーを吐くため渋々...)

次に、Feedback TOPのTarget TOPに、BufAのコードを実装したGLSL Multi TOPを指定します。

最後に、Feedback TOPの出力と、
画像には映っていませんがBuf BのFeedback TOPの出力を
GLSL Multi TOPの入力に接続します。
2017-12-10_180054.png

BufBや最終的な描画についても同様に接続すればOKです。

最終的なノード

I/Oなどの雑多な処理を除けば、以下のように単純な構造になります。
2017-12-10_180716.png

詳しい内容は配布した.toeプロジェクトを参照していただけると助かります。

結果

ジャスティス

終わりに

この手法の応用例としては、森岡さんの記事と組み合わせて、
バッファだけGLSLで書き出し、
その結果をパーティクルシステムで取り出して利用するといった使い方ができるかと思います。
(俗にいうVTFですね。)

時間が確保できず適当な解説になってしまいましたが、質問等あればお気軽にTwitter経由でご連絡ください。

明日は一番楽しみにしていた比嘉先生によるOpenCL講座です。
よろしくお願いします!

参考文献

35
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?