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]

不是每個 opcode 都會用到所有欄位。未使用的欄位必須設定為 0。

作業程式碼

[opcode] 欄位的大小為 32 位元且可以接受下列其中一個值:

名稱

Opcode

作業

說明

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 個組件結果,目標必須遮蓋為 .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 個組件結果,目標必須遮蓋為 .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 個組件結果,目標必須遮蓋為 .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 個組件結果,目標必須遮蓋為 .xyz 以下)

kil

0x27

刪除/捨棄 (僅限片段著色器)

如果單一純量來源組件小於零,則片段會被捨棄且不會繪製至影格緩衝區 (目的地暫存器必須設定為全 0)。

tex

0x28

紋理樣本 (僅限片段著色器)

destination 等於從紋理 source2 載入,座標為 source1。在這個情況中,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 中,已經引入下列 opcode:

名稱

Opcode

作業

說明

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] 欄位的大小是 32 位元:

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

T = 暫存器類型 (4 位元)

M = 寫入遮色片 (4 位元)

N = 暫存器編號 (16 位元)

- = 未定義,必須是 0

來源欄位格式

[source] 欄位的大小是 64 位元:

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

D = Direct=0/Indirect=1 代表直接 Q 和 I 會被忽略,1 位元

Q = 索引暫存器組件選取 (2 位元)

I = 索引暫存器類型 (4 位元)

T = 暫存器類型 (4 位元)

S = 拌和 (8 位元,每個組件各 2 位元)

O = 間接偏移 (8 位元)

N = 暫存器編號 (16 位元)

- = 未定義,必須是 0

取樣程式欄位格式

tex opcode 的第二個來源欄位必須採用 [sampler] 格式,其大小為 64 位元:

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

N = 取樣程式暫存器編號 (16 位元)

B = 紋理細緻程度 (LOD) 偏差值,正負號整數,縮放值 8。使用的浮點值為 b/8.0 (8 位元)

T = 暫存器,必須是 5,取樣程式 (4 位元)

F = 濾鏡 (0=最接近,1=線性) (4 位元)

M = MIP 映射 (0=停用,1=最接近,2=線性)

W = 換行 (0=固定,1=重複)

S = 特殊旗標位元 (必須是 0)

D = 維度 (0=2D,1=立方體)

程式暫存器

使用的暫存器數目取決於使用的 Context3D 描述檔。下列表格定義暫存器數目及其用法:

名稱

AGAL

AGAL2

AGAL3

用法

每個片段程式的數目

每個頂點程式的數目

每個片段程式的數目

每個頂點程式的數目

每個片段程式的數目

每個頂點程式的數目

Context 3D 描述檔支援

標準之下

標準

超出標準

SWF 版本

25 之下

25

28 以上

特質

0

NA

8

NA

8

NA

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

NA

16

NA

16

NA

片段著色器輸入;從使用 Context3D.setTextureAt() 指定的紋理讀取。

片段暫存器

6

NA

NA

1

NA

1

NA

唯寫且用來重新撰寫已寫在頂點著色器內的 z 值 (或深度值)。

驗證權杖

200

1024

2048

最新的 AGAL Mini Assembler 可以在 這裡 找到。