jit.gl.pixで映像エフェクタを作ろう #2 jit.gl.pix入門その2

こんにちは、コバルト爆弾αΩΣです。
「jit.gl.pixで映像エフェクタを作ろう」の第2回目ではjit.gl.pixにてsampleオブジェクトを用いたエフェクトを解説していきたいと思います。

第2回目内容

  1. 「sample」オブジェクトの基本
    1. サンプル範囲の指定
    2. boundmodeの指定
  2. タイルエフェクト
  3. モザイクエフェクト

1.「sample」オブジェクトの基礎

1-1. サンプル範囲の指定

sampleオブジェクト

タイルエフェクトやモザイクエフェクトを作るには「sample」オブジェクトを用います。
そこでまずsampleオブジェクトの使い方について解説していきたいと思います。
sampleオブジェクトは2つのinletと1つのoutletを持ち、以下内容でサンプル対象とサンプル範囲を指定します。

  • 第1 inlet:サンプル対象入力(textureデータ)
  • 第2 inlet:サンプル範囲を指定(正規座標)
  • outlet:サンプリング結果を出力(textureデータ)

(例1)
入力全体をサンプリングする場合、以下の図の様な正規座標を第2 inletに入力します。

sample解説1

jit.gl.pixパッチは以下の様に記述します

jit.gl.pix sample解説1

ここで第1 inletには「in1」を第2 inletには「norm」を入力しています。
「in1」より入力されたtextureデータは元画像に解像度に依らず(x=0.0~1.0, y=0.0~1.0)の正規座標に変換されます。
「norm」オブジェクトは(x=0.0~1.0, y=0.0~1.0)の正規座標ベクトルを出力するオブジェクトとなります。
そのため、上記jit.gl.pixでは第1 inletと第2 inletの座標が同一となるため入力全体がサンプリングされて出力されます。

(例2)
入力画像の左上半分をサンプリングしたい場合には第2 inletには以下の様な座標を指定します。

sample解説2

jit.gl.pixパッチは以下の様に記述します

jit.gl.pix sample解説2

swizにて「norm」のx座標とy座標の成分を抽出し、それぞれ0.5倍した後に「vec」オブジェクトにて統合しsampleの第2 inletに入力しています。

(例3)
サンプル範囲指定するパッチを紹介します。
下図パッチではmagX,magYにてsample範囲のサイズを指定。
またorigX,origYにてサンプル範囲の開始点のx座標とy座標を指定しています。

sampleExampleパッチ

sampleExample gen


1-2. boundmodeの指定

boundmode指定

次にsampleオブジェクトのboundmodeの指定について解説したいと思います。
サンプル範囲指定の項では(x=0.0~1.0, y=0.0~1.0)のサンプル範囲でのサンプリング方法について解説しました。もしサンプル範囲が以下の図のように1.0以上となる場合はどうなるでしょうか。

boundmode説明

サンプル範囲が1以上となる場合は「@boundmode」にて境界(bound)での処理を指定することが出来ます。
処理には以下3タイプがあります。

  • wrap:元画像を繰り返す
  • mirror:元画像を境界で反転して繰り返す
  • clamp:境界部分を保持する

それぞれの処理のサンプル画像を示します。

(wrap)
wrap

(mirror)
mirror

(clamp)
clamp

 


2.タイルエフェクト

tiling patch

tilign_jitglpix

VJエフェクト等でよく見かけるTilingエフェクトですが、sampleを用いて再現することが出来ます。

パッチ部

「tile number」でタイルの数をコントロール。「boundmode」にてwrap/mirror/clampよりboundmodeを選択。

jit.gl.pix内部

boundmode毎のsampleオブジェクトをそれぞれ用意し、「selector」にてboundmodeを選択しています。
タイルの細かさは「smaller」により指定。「norm」に対してsmallerを掛け合わせてsample範囲を拡大し、タイル数をコントロールしています。

GENオブジェクト

  • selector: 第1 inletに1~の数を入力し使用するinletを選択。また入力の数は第1引数で指定。

3.モザイクエフェクト

mosaic_patch

mosaic_jitglpix

次にモザイクエフェクトを作ってみたいと思います。こちらもsampleを用いて再現することができますが、モザイク状にサンプリング範囲を指定するために少し工夫が必要です。

sampleオブジェクトを使ったモザイク処理の考え方

モザイク処理では各モザイクのエリアをエリアの中心色で塗りつぶす必要があります。
例えば2×2のモザイク処理をかけたい場合、以下の様にモザイクのエリアは分割することが出来ます。

mosaic範囲

各モザイクエリアをそれぞれの中心色にて塗りつぶす処理は第2 inletより指定します。
以下にモザイクエリア1を例にとり、モザイク処理の概念を示します。

mosaicエリア

上図左はモザイク処理をかけなかった場合です。モザイク処理をかけない場合は各セルに対し各セル自体の画像をサンプリングするように座標を指定します。
上図右はモザイク処理をかける場合です。モザイク処理をかける場合は各セルに対してエリアの中心色(0.25, 0.25)をサンプリングする様に指定しています。

上図右の処理を各モザイクエリアに適用することでモザイク処理を行うことが出来ます。

パッチ部

「arasa」にてモザイクの細かさを変更

jit.gl.pix内部

sampleの第1 inletに「in 1」からのtextureを入力。
第2 inletにモザイク状にサンプリングする座標を入力。以下がモザイク処理用座標の計算手順になります。

  1. 「norm」を「swiz xy」でxy座標のベクトルに分割
  2. 「arasa」を掛け合わせ分割したいタイル数と同等のサイズに座標を拡大。(例:64*64のモザイク処理をかけたい場合は64をかけx=0.~64. , y=0.~64.にサイズを拡大)
  3. 「floor」を用いて小数点以下を切り捨てる。この処理により各モザイクエリア内の値が全て同一の値となる
    floor適用前:0.0, 0.1, 0.2・・・0.9, 1.0, 1.1・・・
    floor適用後:0.0, 0.0, 0.0・・・0.0, 1.0, 1.0・・・
  4. 「arasa」で割り座標サイズをx=0.0~1.0, y=0.0~1.0に戻す
  5. 「expr in1 + (1 / arasa)/2」にて各モザイクエリアの半サイズをxy成分に足し、モザイク中心の座標を参照する様にする

GENオブジェクト

  • floor: 小数点以下を切り捨て
  • expr: [+, -. *, /]等の計算式を記述可能なGENオブジェクト(詳細説明はここでは省略します)

 

いかがでしたでしょうか。sampleの基礎とそれを用いたエフェクトを紹介させて頂きました(長文になってしまいましたが。。)
sampleは応用次第でかなり多彩なエフェクトが作れるobjectだと思います。是非今回の講座を参考にして色々いじってみて下さい。

次回はマスクエフェクトについて紹介していきたいと思います。お楽しみに!

 


掲載パッチダウンロード

https://www.dropbox.com/s/io4d0r5oxb91fgb/jitglpix_02.zip?dl=0

jit.gl.pixで映像エフェクタを作ろう #2 jit.gl.pix入門その2」への1件のフィードバック

コメントを残す