テクスチャシステム
v3.3.0+
のPixelsWorldを持っていることを確認してください
この章を通じて、PixelsWorld
のテクスチャシステムの使い方をすばやく学ぶことができます。
- newTex
- delTex
- getSize
- swapTex
- drawTo
- castTex
- blendTex
- copyTex
- fetchTex
- savePNG,loadPNG,saveEXR,loadEXR,saveRAW,loadRAW
- rotateTex,flipTex,resizeTex,trimTex
テクスチャID
PixelsWorld
では、テクスチャは整数(テクスチャID)で表されます。PixelsWorld
が提供する基本的なテクスチャIDは以下の通りです:
テクスチャID | Luaモードグローバル定数 | GLSLモードグローバル定数 | Shadertoyモードグローバル定数 | 説明 |
---|---|---|---|---|
-3 |
OUTPUT |
アクセス不可 | アクセス不可 | 出力テクスチャ |
-2 |
TEMP |
PW_TEMP_LAYER |
_PixelsWorld_PW_TEMP_LAYER |
バッファテクスチャ |
-1 |
INPUT |
AE_INPUT_LAYER |
_PixelsWorld_AE_INPUT_LAYER |
入力テクスチャ |
0 |
PARAM0 |
0 |
0 |
パラメーターレイヤー0 |
1 |
PARAM1 |
1 |
1 |
パラメーターレイヤー1 |
... |
PARAM... |
... |
... |
... |
9 |
PARAM9 |
9 |
9 |
パラメーターレイヤー9 |
テクスチャIDを自分で作成することもできます。方法は後述します。
基本的な流れ
通常、Ae
は1枚の画像をPixelsWorld
に送信し、PixelsWorld
はまずその画像をINPUT
に配置します。そして、計算結果をOUTPUT
テクスチャに置き、すべての命令が終了した後、OUTPUT
テクスチャをAe
に結果として送信します。
TEMPの役割
OpenGL
は同じテクスチャを同時に読み書きすることをサポートしていないため、PixelsWorld
はTEMP
を提供して、前回のglsl,shadertoyなどの関数での描画結果を保存します。シェーダー内でgetColor(PW_TEMP_LAYER,uv);
を使用してTEMP
の色をサンプリングすることができます。
テクスチャの作成
newTex(width,height)
を使用してテクスチャを作成し、テクスチャID(ランダムな整数値)を返します。
テクスチャの削除
delTex(id)
を使用して指定したテクスチャを削除します。
通常、手動で削除する必要はありませんが、
PixelsWorld
は毎フレーム終了時にすべてのテクスチャを削除します。しかし、不要になったテクスチャを事前に解放し、そのメモリを開放することは良い習慣です。
サイズの取得
getSize(id)
を使用してテクスチャのサイズを取得します。
getSize.lua
version3()
mytex = newTex(512,256)
w,h = getSize(mytex)
println("Width of mytex is: " .. w)
println("Height of mytex is: " .. h)
テクスチャの交換
swapTex(id1,id2)
を使用してid1
とid2
が指すテクスチャを交換します。
swapTex.lua
version3()
tex1 = newTex(128,128)
tex2 = newTex(256,256)
w,h = getSize(tex1)
println("tex1 size: " .. w .. ", ".. h)
swapTex(tex1,tex2)
w,h = getSize(tex1)
println("tex1 size after swapped: " .. w .. ", ".. h)
描画先の設定
drawTo(id)
を使用して描画先テクスチャを変更します。描画先テクスチャはデフォルトでOUTPUT
です。PixelsWorldは最終的にOUTPUT
を結果としてAe
に送信することに注意してください。以下の3つの方法で他のテクスチャの結果をOUTPUT
に渡すことができます:
テクスチャの投射
castTex(toTexId,fromTexId)
を使用して、fromTexId
からtoTexId
にピクセルを投射します。たとえば、パラメーターレイヤー0 PARAM0
を出力テクスチャOUTPUT
に投射できます:
castTex.lua
version3()
castTex(OUTPUT,PARAM0)
また、投射するテクスチャの範囲を指定することができます(テクスチャの左上を原点とします):
castTex(toTexId,fromTexId,to1x,to1y,to2x,to2y)
castTex(toTexId,fromTexId,to1x,to1y,to2x,to2y,from1x,from1y,from2x,from2y)
範囲を省略した場合はテクスチャ全体が使用されます。
テクスチャの混合
blendTex(toTexId,fromTexId,blendRule)
を使用して、混合ルールblendRule
を使用してテクスチャfromTex
をテクスチャtoTex
に貼り付けます。
blendRule
はNORMAL,ADD,SUBTRACT,MULTIPLY,DIVIDE,MAX,MIN
のいずれかを指定できます。blendRule
は文字列にもでき、以下のように指定します:A
はtoTexId
の入力ピクセルを表しますB
はfromTexId
の入力ピクセルを表しますC
はtoTexId
の出力ピクセルを表します たとえば、次のコードを使用して入力テクスチャとパラメーターレイヤー0の画像を加算混合することができます。
blendRule.lua
version3()
castTex(OUTPUT,INPUT) -- まずINPUTテクスチャをOUTPUTにキャスト。
blendTex(OUTPUT,PARAM0,"C=A+B") -- PARAM0をOUTPUTに混合。
実際には、ここでの文字列はGLSLコードに処理され、"C=A+B"
は内部で以下のコードに変換されます:
blendRuleGLSL.frag
#version 330 core
out vec4 outColor;
in vec2 uv;
in vec2 uv2;
uniform sampler2D inLayerA;
uniform sampler2D inLayerB;
void main(){
vec4 A = texture(inLayerA,uv);
vec4 B = texture(inLayerB,uv2);
vec4 C = A;
C=A+B // あなたの混合ルールはこちらに結合されます。
;
outColor = C;
}
castTex
と同様に、blendTex
もテクスチャ範囲の指定に対応しています:
blendTex(toTexId,fromTexId,blendRule,to1x,to1y,to2x,to2y)
blendTex(toTexId,fromTexId,blendRule,to1x,to1y,to2x,to2y,from1x,from1y,from2x,from2y)
テクスチャのコピー
copyTex(refTexId)
を使用してテクスチャをコピーし、コピーされた新しいテクスチャを返します。
任意の時間におけるレイヤーピクセルの取得
fetchTex(layerId, time)
を使用して、指定した時間の特定のレイヤーのテクスチャを取得し、取得したテクスチャIDを返します。
- layerId:
PARAM0~PARAM9
のみが入力可能です。 - time: レイヤーの時間(浮動小数点数、単位は秒)
- 注意: この関数を使用すると、Aeのキャッシュにエラーが発生する可能性があります。定期的にキャッシュをクリアするようにしてください。
v3.4.3+
で新しく追加された関数です。
テクスチャの読み込みと保存
savePNG(utf8Path,texId)
,loadPNG(utf8Path)
を使用して、PNG画像を保存および読み込みます。
saveEXR(utf8Path,texId)
,loadEXR(utf8Path)
を使用して、EXR画像を保存および読み込みます。
saveRAW(utf8Path,texId)
,loadRAW(utf8Path)
を使用して、MiLaiの未圧縮のオリジナルメモリ画像を保存および読み込みます。
以下は、PixelsWorldがサポートする画像仕様の詳細です:
形式 | 使用するライブラリ | サポートされる圧縮方法 | 画像カラー規格 |
---|---|---|---|
PNG | cute_headers | DEFLATE準拠デコンプレッサzlib(RFC 1950) | RGBA、各チャネル毎に8ビットの符号なし整数。 |
EXR | tinyexr | NONE,RLE,ZIP,ZIPS,PIZ,ZFP | RGBA、各チャネル毎にHDR 32ビット浮動小数点。 |
RAW | (なし) | MiLai独自形式。(以下の図参照) | RGBA、各チャネル毎にHDR 32ビット浮動小数点。 |
シーンにPNG画像を読み込む:
loadPNG.lua
version3()
local mypng = loadPNG([[d:\test.png]]) -- あなたのパスに置き換えてください。
castTex(OUTPUT,mypng) -- mypngからOUTPUTにピクセルをキャスト。
PNG画像をローカルに保存する:
savePNG.lua
version3()
--OUTPUTに何かを描画
move(width/2,height/2)
rotate(time)
triangle()
--描画終了。
savePNG([[d:\test.png]],OUTPUT) -- OUTPUTをPNGとしてローカルディスクに保存。ここで自分のパスに置き換えてください。
PNG
をEXR
に変えると、EXR画像の保存と読み込みが可能になります。- 一部の場所に保存するには管理者権限が必要です。
テクスチャの修整
rotateTex(texId,times)
を使用して90*times
度テクスチャを回転させます。rotateTex(texId)
はrotateTex(texId,1)
と同等です。
flipTex(texId,flipV)
を使用してテクスチャを反転します。flipV
はブール値で、flipV
がtrue
の場合は垂直反転、false
の場合は水平反転です。
resizeTex(texId,width,height)
を使用してテクスチャを縮小します。
trimTex(texId,p1x,p1y,p2x,p2y)
を使用してテクスチャをトリミングします。p1x,p1y,p2x,p2y
はテクスチャ左上を原点とした座標です。