AGAL的解释和使用
在stage3D這個最底層的flash3D的使用時,真的說實話真的要想看到我們想看到的任何一個模型真的很蛋疼,既要給什么頂點著色器和片段著色器上傳信息,又得上傳什么紋理等等可以參考我的關于stage3D的第一篇日志:第一個關于stage3D的HelloWorld,是不很奇葩呀,反正很頭疼的!
這篇日志就真正說說那個著色其中的AGAL的使用,看上去就他媽的是什么匯編語言與寄存器打交道。下來就來打開這個蛋疼的AGAL吧。
在百度百科中對AGAL的定義是這樣的:
AGAL(Adobe Graphics Assembly Language)是Adobe開發的圖形匯編語言,匯編語言是僅高于計算機二進制機器碼的低級語言,可以精確地操控機器硬件比如可編程顯卡,PC的Dirext9、MAC的OpenGL以及移動設備中的OpenGL ES 2都是可編程顯卡,并且都支持AGAL。通過Adobe官方提供的編譯器AGALMiniAssembler(實際上是一個AS類庫),我們可以通過字符串指令來獲得一個AGAL二進制流,再通過context3D上傳給顯卡的編程管線。對于頂點以及片段的運算都是通過AGAL交由顯卡來處理的,這就是GPU硬件加速。
AGAL的使用:
基本語法:
<操作碼> <目標寄存器> <源寄存器1> ... <源寄存器2>
2. AGAL中的可用寄存器:
目標寄存器op、oc:分別針對頂點寄存器和片段寄存器的輸出信息; 臨時寄存器vt、ft:分別是暫存頂點信息和片段信息的,也就相當于我們經常使用的臨時變量; 特殊寄存器va、fs:分別針對于頂點寄存器和片段寄存器有不同的意義,va是真正存放頂點信息屬性的寄存器,fs真正存放紋理信息的寄存器; 常量寄存器vc、fc:分別是針對頂點寄存器和片段寄存器:vc是主要保存位置變化等常量、fc主要保存顏色數據等常量,其實往往我們也就只存放顏色信息; V寄存器:用于頂點寄存器與片段寄存器之間的交互。
3. 每種寄存器都有自己的數量,總的可用寄存器為198個,每個寄存器有4位
op、oc:只有一個 不存在 op1 op2...oc0 用法 ; v、vt、va、ft、fs:有8個 vt0~vt7 fs0~fs7; vc 有128個:vc0~vc127 ; fc 有28個:fc0~fc27;
4. 寄存器的傳值:寄存器俺按傳值分類可以分為兩類:不允許傳值和允許傳值的。
不允許傳值的有op、oc、vt、ft、v四個寄存器。因為op、oc是用于輸出的,只能在寄存器作為輸出結果;vt、ft為臨時的也只能在寄存器內部使用;v只是將頂點的信息方便的傳遞給片段寄存器,不允許傳入值。 允許傳值的
特殊寄存器:va傳入頂點的屬性,方式是:context3D.setVertexBufferAt(2,....);將信息傳給頂點特殊寄存器va2;
fs傳入紋理信息,方式是:context3D.setTextureAt(1,.....) 將紋理信息傳給片段特殊寄存器fs1
常量寄存器vc、fc:有三種方式:context3D.setProgramConstantsFromByteArray()
context3D.setProgramConstantsFromMatrix()
context3D.setProgramConstantsFromVector()
這3個的方法的第一個參數均為type,表示這個常量是傳給所有的頂點著色器呢還是所有的片段著色器 Context3DProgramType.VERTEX 頂
點Context3DProgramType.FRAGMENT 片段。
5.常用的操作碼:
mov 賦值 mov v0,va1 把va1的值賦給v0 add 加法 add op va1,va2 sub 減法 mul乘法 div 除法 tex材質 更多的操作碼的使用可以參照百度百科對AGAL操作碼,一半的我們用這幾個就其實已經夠了。
一個關于AGAL使用的代碼如下:
/**創建一個簡單的著色器*/
private function initShader():void{
//創建頂點著色器
var vertaxShader:AGALMiniAssembler = new AGALMiniAssembler();
vertaxShader.assemble(Context3DProgramType.VERTEX,
"m44 op,va0,vc0
"+ //讓第0個va寄存器和第0個vc寄存器進行m44運算(4*4矩陣乘法)
"mov v0,va1
" //把uv交給va1
);
//頂點著色器,每個頂點都會執行一次,也就是說,在每次執行時,va0就是當前正在處理的這個頂點的位置
//創建片段著色器
var fragmentShader:AGALMiniAssembler = new AGALMiniAssembler();
fragmentShader.assemble(Context3DProgramType.FRAGMENT,
"tex oc,v0,fs0<2d,miplinear,repeat>
"http://把紋理交給fs0 結合 uv信息v1 進行采樣運算 tex,獲得最終顏色
);
//片段著色器,每個像素點都執行一次
//合并為一個著色器提交給顯卡
shaderProgram = context3D.createProgram();
shaderProgram.upload(vertaxShader.agalcode,fragmentShader.agalcode);
}
至此,比本上就已經了解了AGAL的使用了,下來要很炫的效果就看自己對這些操作碼的使用!
總結
以上是生活随笔為你收集整理的AGAL的解释和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 CEO 纳德拉:新的 AI PC
- 下一篇: 操作系统——段式存储管理、段页式存储管理