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