仮想バッファ

lua.txtの記述

◇描画先を仮想バッファに変更する
obj.setoption("drawtarget","tempbuffer"[,w,h])
w,h 仮想バッファのサイズ(省略時は初期化しません)
描画先を仮想バッファにするとobj.draw(),obj.drawpoly()での描画が仮想バッファに対して行われます。
この場合はオブジェクトの持っている座標等の設定は反映せず引数の座標そのままで描画されます。
サイズを指定すると仮想バッファを透明色で初期化します。
※「obj.setoption("dst","tmp")」は「obj.setoption("drawtarget","tempbuffer")」に変更されましたが、現バージョンでも使用可能です。

◇仮想バッファ
仮想バッファから読み込みます。
※仮想バッファはobj.copybuffer(),obj.setoption()で作成することが出来ます。
obj.load("tempbuffer"[,x,y,w,h])
x,y,w,h 仮想バッファから取得する範囲(省略時は全体)

◇合成モード
obj.setoption("blend",value)
value 以下は仮想バッファ専用の合成モードです。
"alpha_add"=色情報は加重平均してアルファ値は加算します
"alpha_max"=色情報は加重平均してアルファ値は大きい方を採用します
"alpha_sub"=色情報は何もせずにアルファ値を減算します

◇描画先をフレームバッファに変更する
obj.setoption("drawtarget","framebuffer")
obj.draw(),obj.drawpoly()の描画先をフレームバッファにします。
フレームバッファに対してdraw()等で描画を行っていない場合にはsetoption()で変更しなくてもスクリプト終了後には自動的にフレームバッファに対しての描画となります。

◇コピーバッファ
obj.copybuffer(dst,src)
画像バッファをコピーします。
※コピー先の画像バッファのサイズはコピー元のサイズに変更されます。
dst コピー先のバッファ("tmp"=仮想バッファ)
src コピー元のバッファ("frm"=フレームバッファ / "obj"=オブジェクト)





解説

仮想バッファとは、仮想のキャンバスを別途用意し、そこに画像を描画するイメージです。仮想なので、画面には表示されません。
仮想バッファに描画すると、複数の画像を一つの画像としてまとめることができ、
ひとつの画像としてフィルタ効果やスクリプトを適用することが可能になります。

全体的な流れとしては、まず仮想バッファにオブジェクトを描画し、次にobj.loadで画像を呼び出して使用します。
tempbuf01.png

仮想バッファにオブジェクトを描画

仮想バッファにオブジェクトを描画するには、まず仮想バッファを初期化&作成し、そこに描画する処理を行います。
※なお、仮想バッファに描画する処理は目には見えないので、AviUtlのメイン画面上では変化はありません。

  • 仮想バッファの初期化・作成
obj.setoption("drawtarget","tempbuffer",w,h)でw,hの引数を記述した場合、仮想バッファが初期化されます。
また横幅w、縦幅hのサイズの仮想キャンバスが作成されることになります。
【400x300の仮想キャンバスを作成するケース】
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)

  • 描画処理
obj.draw系で描画することにより仮想バッファに描画されます。
obj.drawの中の引数で、仮想キャンバス上で描画される座標が指定されます。
なお、仮想キャンバスのサイズを超えた範囲に描画された画像は、超えた部分が切り取られることに注意が必要です。
【仮想キャンバス上の(100,50)の座標に描画するケース】
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.draw(100,50)

  • 画像を追加
obj.setoption("drawtarget","tempbuffer")でw,hの引数を省略した場合、仮想バッファが初期化されないため、
仮想バッファに複数の画像を描画することが出来るようになります。
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.load("figure","円")
obj.draw(25,0)

obj.setoption("drawtarget","tempbuffer")  --キャンバスサイズを入力しない
obj.load("figure","円")
obj.draw(-25,0)



obj.loadで読み込み

obj.load("tempbuffer")により仮想バッファの画像をAviUtlのメイン画面に読み込みます。
この画像に「縁取り」フィルタ等を適用すると、ひとつの画像としてまとめられていることが分かると思います。
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.load("figure","円")
obj.draw(25,0)

obj.setoption("drawtarget","tempbuffer")
obj.load("figure","円")
obj.draw(-25,0)

obj.load("tempbuffer")


  • 一部分のみ読み込むケース
仮想バッファの一部分の範囲のみを読み込むことが出来ます。
obj.load("tempbuffer"[,x,y,w,h])では、
x,yは読み込む範囲の左上の座標で、仮想キャンバスの左上が原点(0,0)となります。
また、w,hは読み込む範囲の横幅,縦幅を表します。
【仮想バッファの右上4分の1を読み込むケース】
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.load("figure","円")
obj.draw()
obj.load("tempbuffer",w/2,0,w/2,h/2)


合成モードを変更

obj.setoption("blend",value)では仮想バッファ専用の合成モードがあります。
"alpha_add" 画像を敷き詰めて描画するケースで、微妙な隙間ができてしまうことがあります。
"alpha_add"を加えることでその隙間を埋めることが出来る場合があります。
"alpha_sub" 図形のアルファ値で減算するので、図形の形で穴を空けることが出来ます。
マスクフィルタでマスクを反転したイメージに近いです。非常に応用性のある機能です。


描画先をフレームバッファに変更する

obj.setoption("drawtarget","framebuffer")を使用すると、それ以降のobj.draw系すべてに適用されてしまいます。
そこでobj.setoption("drawtarget","framebuffer")を使用することで、通常の描画に切り替えます。
w=400 h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.load("figure","円")
obj.draw()
obj.setoption("drawtarget","framebuffer")  --これがないと次のobj.drawでも仮想バッファに描画してしまう
obj.load("tempbuffer")
obj.draw(-150,-20)


obj.copybuffer

obj.copybufferを使用すると、次の処理が一度にされます。
  • obj.copybuffer("tmp","obj")
・仮想バッファを初期化
・オブジェクトの大きさで仮想のキャンバスを作成
・仮想バッファに描画
obj.copybuffer("tmp","obj")
obj.load("tempbuffer")


  • obj.copybuffer("tmp","frm")
・仮想バッファを初期化
・フレームバッファの大きさで仮想のキャンバスを作成
・仮想バッファに描画
obj.copybuffer("tmp","frm")
obj.load("tempbuffer")



  • 最終更新:2011-12-17 01:53:33

このWIKIを編集するにはパスワード入力が必要です

認証パスワード