ZOOM,meet,Skype,teamsにクールな映像イフェクトやリアルタイムCGを!
スマホのSNSアプリにえらく高度な画像処理やイフェクトが用意されているのに、ZOOM,meet,Skype,teamsなどは、ビジネス用と考えられているせいか、あまり面白い画像処理やイフェクトが使えません。
そこで、これらのリモート会議システムにも色んなイフェクトが使えるように、またそのイフェクトを簡単に
増やせるようなアプリケーションを作ってみました。
↓このコードはそのまま使えます。
https://www.shadertoy.com/view/ldsBz2
openframwworks + ofxshadertoy + Spout + その他アドオンで作り、shadertoyのコードがほぼそのまま
使えるので、shadertoy.comやGLSL sandboxなどの膨大なコードが参考になりますので、イフェクトをどんどん増やせます。たとえば、上の惑星の写真のコードをhttps://www.shadertoy.com/view/ldsBz2
からコピーして、
"data/shaders"フォルダ下の、001-009.fragのどれかにぺイストすると、その番号のキーを押すと、
惑星の動画が表示されます。(最初の一行に空のコメント行、//を追加してください。)
一応Windows上で開発しましたが、openframeworksで開発したので、macにも移植できるはずです。
オフライン時にshadertoyのシェーダ(特にマルチレイヤー)のシェイダーをデバッグしたり、
開発したりするのにも使えます。
GIT
git上に実行プログラムとサンプルのシェイダー(主にshadertoy.comから)を置きました。**WebCamが接続されていないと起動しません。キーボードのキーの0-9にそれそれ、イフェクトがアサインされています。**スペースキーを押すと、表示している画像をフレーム毎に"data/export"に書き出します。書き出し中にスペースバーを押すと書き出しが止まります。キー1-9に対応する"data/shaders"の下に000.frag -- 009.fragの10個のシェイダーファイルがありますが、この中をshadertoy.comからコピーしたものぺイストし、最初のコメント行を以下の説明のように追加すれば、shadertoyのコードがスタンドアローンでPC上で動きます。
(MySettings.exeで表示ウィンドウの縦横サイズを選択できます。)
このシェアバージョンでは顔のランドマークを検出する機能や、ZOOMなどの仮想カメラになる機能などを
外してありますが、どういうコンセプトかこのバージョンでご理解いただけると思います。
ポイントはShaderToyのマルチシェイダーをシェイダーの最初の行に簡単に記述できるのがアイデアです。
openframeworksベースですので、shadertoy以外の機能も今後追加していく予定です。
gitのreadme.mdに使い方の詳細を追加していく予定です。
マルチパスシェイダーの記述
たとえば、上のシェーダーフォルダ(data/shaders/)内の 004.fragは
https://www.shadertoy.com/view/wttSRM
のコードですが、これはA,B二つとメインのイメージバッファのマルチパスレイヤーで、git内のデータの最初の行は、
//:0ab,1bb,0b,0va,1v
と、なっていますが、これは、
0ab は、bバッファの0チャンネルにaバッファのテキスチャーを送る
1bb は、bバッファの1チャンネルにbバッファの結果をもどす
0b は、イメージバッファの0チャンネルにbバッファの結果を送る
0va は、aバッファの1チャンネルにwebcamの画像を送る
1v は、イメージバッファの1チャンネルにwebcamの画像をインプット
ということになります。
":"の左のフィールドはマウス、サウンドなどのスイッチで、
//M:とすれば、シェイダー内でマウスの値が参照されていいればマウスコントロールがオンになります。
//S:はサウンドの入力がオンになり、サウンドでリアルタイムCGを制御できたりできます。
プロ版では//F:でwebcamに映る顔のface landmarksをディテクトして表示します。
やや複雑なマルチパス構造を持つ、"Sirenian Dawn" https://www.shadertoy.com/view/XsyGWV
は、メインのイメージバッファの他に、A, B, Cのレイヤーを持ちます。
ヘッダーは以下のようになります。
//M:0gMa,1rLa,0ab,1bb,0bc,1cc
ここで、
0gMa -> input middle size gray noise texture to A buffer thru 0 channnel
1rLa -> input large size rgb noise texture to A buffer thru 1 channel
となり、Sjでは一般的にノイズファイルは以下のように記述します。
gL gray Large noise texture
gM gray Middle noise texture
gS gray Small noise texture
g,[noize texture size]
rL rgb Large noise texture
rM rgb Middle noise texture
rS rgb Small noise texture
r,[noize texture size]