AGAL のバイトコード形式

AGAL のバイトコードは、Endian.LITTLE_ENDIAN 形式を使用する必要があります。

バイトコードのヘッダー

AGAL バイトコードは、7 バイトのヘッダーで始める必要があります。

A0 01000000 A1 00 -- for a vertex program 
A0 01000000 A1 01 -- for a fragment program

オフセット(バイト)

サイズ(バイト)

名前

説明

0

1

magic

必ず 0xa0

1

4

バージョン

必ず 1

5

1

シェーダータイプ ID

必ず 0xa1

6

1

シェーダータイプ

頂点プログラムの場合は 0、フラグメントプログラムの場合は 1

トークン

ヘッダーの直後に任意数のトークンが続きます。すべてのトークンは 192 ビット(24 バイト)のサイズであり、必ず次の形式に従います。

[opcode][destination][source1][source2 or sampler]

オペコードによっては、これらのフィールドすべてを使用しない場合もあります。未使用のフィールドには 0 を設定する必要があります。

オペレーションコード

[opcode] フィールドは 32 ビットのサイズであり、次のいずれかの値を設定できます。

名前

オペコード

処理

説明

mov

0x00

移動

同じ成分ごとに、source1 から destination にデータを移動します

add

0x01

追加

destination = source1 + source2、同じ成分ごと

sub

0x02

減算

destination = source1 - source2、同じ成分ごと

mul

0x03

乗算

destination = source1 * source2、同じ成分ごと

div

0x04

除算

destination = source1 / source2、同じ成分ごと

rcp

0x05

逆数

destination = 1/source1、同じ成分ごと

min

0x06

最小

destination = minimum(source1,source2)、同じ成分ごと

max

0x07

最大

destination = maximum(source1,source2)、同じ成分ごと

frc

0x08

少数

destination = source1 - (float)floor(source1)、同じ成分ごと

sqt

0x09

平方根

destination = sqrt(source1)、同じ成分ごと

rsq

0x0a

逆数平方根

destination = 1/sqrt(source1)、同じ成分ごと

pow

0x0b

累乗

destination = pow(source1,source2)、同じ成分ごと

log

0x0c

自然対数

destination = log_2(source1)、同じ成分ごと

exp

0x0d

指数

destination = 2^source1、同じ成分ごと

nrm

0x0e

正規化

destination = normalize(source1)、同じ成分ごと(3 成分の結果だけを生成、destination は .xyz 以下にマスクすることが必要)

sin

0x0f

正弦波

destination = sin(source1)、同じ成分ごと

cos

0x10

余弦波

destination = cos(source1)、同じ成分ごと

crs

0x11

クロス積

destination.x = source1.y * source2.z - source1.z * source2.y

destination.y = source1.z * source2.x - source1.x * source2.z

destination.z = source1.x * source2.y - source1.y * source2.x

(3 つの成分の結果のみを生成、destination には .xyz またはそれより小さいマスクを適用することが必要)

dp3

0x12

ドット積

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z

dp4

0x13

ドット積

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z + source1.w*source2.w

abs

0x14

絶対

destination = abs(source1)、同じ成分ごと

neg

0x15

ネゲート

destination = -source1、同じ成分ごと

sat

0x16

飽和

destination = maximum(minimum(source1,1),0)、同じ成分ごと

m33

0x17

マトリックス乗算 3x3

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z)

(3 つの成分の結果のみを生成、destination には .xyz またはそれより小さいマスクを適用することが必要)

m44

0x18

マトリックス乗算 4x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

destination.w = (source1.x * source2[3].x) + (source1.y * source2[3].y) + (source1.z * source2[3].z) + (source1.w * source2[3].w)

m34

0x19

マトリックス乗算 3x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

(3 つの成分の結果のみを生成、destination には .xyz またはそれより小さいマスクを適用することが必要)

kil

0x27

停止/破棄(フラグメントシェーダーのみ)

source のスカラー成分の 1 つが 0 未満の場合、フラグメントは破棄され、フレームバッファーには描画されません(destination のレジスタはすべて 0 に設定する必要があります)。

tex

0x28

テクスチャサンプル(フラグメントシェーダーのみ)

destination は、座標 source1 でテクスチャ source2 から読み込む値と等しくなります。この場合、source2 は sampler 形式で指定する必要があります。

sge

0x29

以上を設定

destination = source1 >= source2 ? 1 : 0、同じ成分ごと

slt

0x2a

未満を設定

destination = source1 < source2 ? 1 : 0、同じ成分ごと

seq

0x2c

等しいを設定

destination = source1 == source2 ? 1 : 0、同じ成分ごと

sne

0x2d

等しくないを設定

destination = source1 != source2 ? 1 : 0、同じ成分ごと

AGAL2 には次のオペコードが導入されています。

名前

オペコード

処理

説明

ddx

0x1a

X における偏微分

source1 の X における偏微分を destination に読み込みます。

ddy

0x1b

Y における偏微分

source1 の Y における偏微分を destination に読み込みます。

ife

0x1c

等しい

source1 が source2 に等しい場合にジャンプします。

ine

0x1d

等しくない

source1 が source2 に等しくない場合にジャンプします。

ifg

0x1e

以上

source1 が source2 以上の場合にジャンプします。

ifl

0x1f

未満

source1 が source2 未満の場合にジャンプします。

els

0x20

else

else ブロック

eif

0x21

Endif

if ブロックまたは else ブロックを終了します。

destination フィールドのフォーマット

[destination] フィールドのサイズは 32 ビットです。

31.............................0 
----TTTT----MMMMNNNNNNNNNNNNNNNN

T = レジスタタイプ(4 ビット)

M = 書き込みマスク(4 ビット)

N = レジスタ番号(16 ビット)

- = 未定義、必ず 0

source フィールドのフォーマット

[source] フィールドのサイズは 64 ビットです。

63.............................................................0 
D-------------QQ----IIII----TTTTSSSSSSSSOOOOOOOONNNNNNNNNNNNNNNN

D = 直接は 0/間接は1、直接の場合 Q と I は無視(1 ビット)

Q = インデックスレジスタのコンポーネント選択(2 ビット)

I = インデックスレジスタのタイプ(4 ビット)

T = レジスタタイプ(4 ビット)

S = スウィズル(8 ビット、コンポーネントあたり 2 ビット)

O = 間接オフセット(8 ビット)

N = レジスタ番号(16 ビット)

- = 未定義、必ず 0

サンプラーフィールドのフォーマット

tex オペコードの 2 番目の source フィールドは、サイズ 64 ビットの [sampler] フォーマットでなければなりません。

63.............................................................0 
FFFFMMMMWWWWSSSSDDDD--------TTTT--------BBBBBBBBNNNNNNNNNNNNNNNN

N = サンプラーレジスタ番号(16 ビット)

B = テクスチャの level-of-detail(LOD)バイアス、符号付き整数、スケール 8。使用される浮動小数点値は b/8.0(8 ビット)

T = レジスタタイプ、必ず 5、サンプラー(4 ビット)

F = フィルター(0 = 最も近いもの、1 = リニア)(4 ビット)

M = ミップマップ(0 = 無効、1 = 最も近いもの、2 = リニア)

W = 折り返し(0 = クランプ、1 = 繰り返し)

S = 特殊フラグビット(必ず 0)

D = 次元(0 = 2 次元、1 = 3 次元)

プログラムレジスタ

使用するレジスタの数は、使用する Context3D プロファイルによって異なります。レジスタの数とその使用方法を次の表に示します。

名前

AGAL

AGAL2

AGAL3

使用方法

フラグメントプログラムあたりの数

頂点プログラムあたりの数

フラグメントプログラムあたりの数

頂点プログラムあたりの数

フラグメントプログラムあたりの数

頂点プログラムあたりの数

コンテキスト 3D プロファイルサポート

標準以下

標準

標準を拡張

SWF バージョン

25 未満

25

28 以上

属性

0

N/A

8

N/A

8

N/A

16

頂点シェーダー入力。Context3D.setVertexBufferAt() を使用して、指定された頂点バッファーから読み取ります。

定数

1

28

128

64

250

200

250

シェーダー入力。Context3D.setProgramConstants() 関数ファミリーを使用して設定します。

一時

2

8

8

26

26

26

26

計算のための一時レジスタ。プログラム外からはアクセスできません。

出力

3

1

1

1

1

1

1

シェーダー出力。頂点プログラムでは、出力はクリップ空間の位置。フラグメントプログラムでは、出力はカラー。

可変

4

8

8

10

10

10

10

頂点シェーダーとフラグメントシェーダーの間で補間データを転送します。頂点プログラムの変化するレジスタが、フラグメントプログラムへの入力として適用されます。値は、三角形の頂点からの距離に基づいて補間されます。

サンプラー

5

8

N/A

16

N/A

16

N/A

フラグメントシェーダー入力。Context3D.setTextureAt() を使用して、指定されたテクスチャから読み取ります。

フラグメントレジスタ

6

N/A

N/A

1

N/A

1

N/A

書き込み専用であり、頂点シェーダーに書き込まれた z 値(深度値)を書き直すために使用します。

トークン

200

1024

2048

最新の AGAL Mini Assembler は このページ で入手できます。