テクスチャシステム
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はテクスチャ左上を原点とした座標です。