AGAL

AGAL

AGAL(Adobe Graphics Assembly Language)是Adobe開發的圖形彙編語言,彙編語言是僅高於計算機二進制機器碼的低級語言,可以精確地操控機器硬體比如可程式顯示卡,PC的Direct9、MAC的OpenGL以及移動設備中的OpenGL ES 2都是可程式顯示卡,並且都支持AGAL。通過Adobe官方提供的編譯器AGALMiniAssembler(實際上是一個AS類庫),我們可以通過字元串指令來獲得一個AGAL二進制流,再通過context3D上傳給顯示卡的編程管線。對於頂點以及片段的運算都是通過AGAL交由顯示卡來處理的,這就是GPU硬體加速

),最新的測試版flash player 11中提供了可調用顯示卡資源來渲染圖形API,即Molehill現名stage3D

基本介紹

  • 中文名:AGAL
  • 外文名:Adobe Graphics Assembly Language
  • 屬於:圖形彙編語言
  • 包含:僅高於計算機二進制機器碼語言
AGAL操作碼,複製數據,代數操作碼,數學操作碼,三角學操作碼,條件操作碼,向量和矩陣操作碼,暫存器,1、頂點屬性暫存器,2、常量暫存器,3、暫存暫存器,4、輸出暫存器,5、變數暫存器,6、紋理樣本,一般編譯步驟,1、創建AGALMiniAssembler類對象,2、編譯AGAL代碼如,3、創建Shader如,

AGAL操作碼

複製數據

mov:destination=source :將數據從源暫存器複製到目標暫存器

代數操作碼

min:destination=min(source1 , source2) : 兩個暫存器之間的較小值,分量形式
max:destination=max(source1 ,source2): 兩個暫存器之間的較大值,分量形式
sqt:destination=sqrt(source):一個暫存器的平方根,分量形式
rsq:destination=1/sqrt(source) 一個暫存器的平方根倒數,分量形式
pow:destination=pow(source1 ,source2):source1的source2次冥,分量形式
log:destination=log(source1)一個暫存器以2為底的對數,分量形式
exp:destination=2^source1:2的source1次方,分量形式
nrm:destination=normalize(source1):將一個暫存器標準化為長度1的單位向量
abs:destination=abs(source1):一個暫存器的絕對值,分量形式
sat:destination=max(min(source1,1),0):將一個暫存器鎖0-1的範圍里

數學操作碼

add:destination=source1+source2:兩個暫存器相加,分量形式
sub:destination=source1-source2:兩個暫存器相減,分量形式
mul:destination=source1*source2:兩個暫存器相乘,分量形式
div:destination=source1/source2:兩個暫存器相除,分量形式
rcp:destination=1/source1:一個暫存器的倒數,分量形式
frc:destination=source1-(float)floor(source1)一個暫存器的分數部分,分量形式
neg:destination=-source1:一個暫存器取反,分量形式

三角學操作碼

sin:destination=sin(source1):一個暫存器的正弦值,分量形式
cos:destination=cos(source1):一個暫存器的餘弦值,分量形式

條件操作碼

kill:如果暫存器有任意一個分量小於0,則丟棄該像素不進行繪製(只適用於片段著色器)
sge:destination = source1>=source2 ? 1 : 0 類似三元操作符 分量形式
slt:destination = source1<source2 ? 1 : 0 同上
seq:destination= source1==source2 ? 1 : 0 同上
sne:destination=source1!=source2 ? 1:0 同上

向量和矩陣操作碼

crs:兩個暫存器間的叉積
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
dp3:兩個暫存器間的點積,3分量
destination=source1.x*source2.x+source1.y*source2.y+source1.z*source2.z
dp4:兩個暫存器間的點積,4分量
destination=source1.x*source2.x+source1.y*source2.y+source1.z*source2.z+source1.w+source2.w
m33:由一個3*3的矩陣對一個3分量的向量進行矩陣乘法
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)
m34:由一個3*4的矩陣對一個4分量的向量進行矩陣乘法
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)
m44:由一個4*4的矩陣對一個4分量的向量進行矩陣乘法
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)

暫存器

AGAL共有6種暫存器

1、頂點屬性暫存器

(Vertex Attribute Registers):va0,va1,....,va7
·共有8個頂點屬性暫存器,每個暫存器能放4個float型,所以總共有32個Number的數據可以使用(對於每個頂點);
·頂點屬性暫存器的內容通過 Context3D::setVertexBufferAt() 函式將值上載; ·例如,指令 “m44 op, va0, vc0 ” 的意義就是:將va0(頂點屬性) 乘上 vc0(變形矩陣)後,將結果放到 op(位置輸出暫存器);

2、常量暫存器

(Constant Registers)
·用於Vertex Program: vc0,vc1,....,vc127 共128個。主要用來保存位置變換等常量,如變換矩陣,用 Context3D::setProgramConstantsFromMatrix() 函式將值上載,例如,指令 “m44 op, va0, vc0 ” 中的 vc0 保存的就是變換矩陣。
·用於Fragment Program:fc0,fc1,....,fc27 共28個。主要用來保存顏色數據等常量,用該暫存器可以在運行時動態改變顏色數據。同樣地,用 Context3D::setProgramConstantsFromVector() 函式將值上載

3、暫存暫存器

(Temporary Registers) ·用於Vertex Program :vt0,vt1,...,vt7 ·用於Fragment Program :ft0,ft1,...,ft7 暫存數據

4、輸出暫存器

(Output Registers)
·位置輸出暫存器 op,為 Vertex Program 所用; ·顏色輸出暫存器 oc,為 Fragment Program 所用;
·例如,指令“m44 op, va0, vc0 ” 是將計算後的位置信息,放到op 輸出;指令 “mov oc, ft1” ,將ft1中的顏色信息放到oc 中輸出

5、變數暫存器

(Varying Registers):v0,v1,...,v7
用於從 Vertex Program 向 Fragment Program 傳遞數據,例如,UV坐標是通過 Context3D::setVertexBufferAt() 上載到頂點屬性暫存器 va1 ,指令“mov v1, va1”則將va1中的uv坐標數值移到v1中,以便Fragment Program可以訪問到,如 "tex ft0, v1, fs0<2d, repeat, miplinear>" 指令,意義為:將fs0中的紋理數據,通過UV坐標裁剪後放到 ft0 暫存暫存器

6、紋理樣本

(Texture Sampler):fs0,fs1,...,fs7
用來存放紋理數據,通過函式 Context3D::setTextureAt() 函式將值載入,使用時,如上 "tex ft0, v1, fs0<2d, repeat, miplinear>" 指令。 *關於AGAL暫存器的幾點說明:
1、每個暫存器占16個字,即4個float型,在AS3里則表現為4個Number型;
2、通過 x,y,z,w 或 r,g,b,a 可以訪問暫存器中的4個float型數值(元素),如va1.x 和 va1.r 都表示va1中的第一個元素,暫存器運算時各個元素對應;
3、在vertex shader中我們一般用 x,y,z,w 來訪問,在fragment shader中用 r,g,b,a 訪問

一般編譯步驟

1、創建AGALMiniAssembler類對象

(AGALMiniAssembler 是Adobe提供的用來將字元串格式的AGAL指令編譯成二進制碼的工具類),如:
var vertexShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();
var fragmentShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();

2、編譯AGAL代碼如

vertexShaderAssembler.assemble(Context3DProgramType.VERTEX,
"m44 op, va0, vc0\n" +
"mov v0, va0\n" +
"mov v1, va1\n" +
"mov v2, va2\n" );
fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT,
"tex ft0, v1, fs0<2d, repeat, miplinear>\n" +
"mov oc, ft0\n" );

3、創建Shader如

var shaderProgram:Program3D = _context3D.createProgram();
4、將編譯後的AGAL代碼上載給Shader ,如:
shaderProgram.upload(vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);

相關詞條

熱門詞條

聯絡我們