AGAL 的学习记录
记录作者:Jave.Lin
原贴:http://blog.csdn.net/linjf520/article/details/8758954
首先:AGAL缩放的,全拼意思:Adobe Graphics Assembly Language:Adobe 图形图像汇编语言
先记录一下:常用的寄存器的名称表列(缩写=>全拼),大部份名称都是按自己的喜欢来定而使用,因为用在不一样的公式,计算,都会用不一样的结果:
顶点着色器(Vertex Shader/Program)
va=>Vertex Attribute=>直译:顶点属性;
vc=>Vertex Constant=>直译:顶点常量,一般常量都不可以再改,但这里我们在CPU层上,是怎么改都可以的;但便与我们在使用AGAL中的习惯来用;
vt=>Vertex Temporary=>直译:顶点临时变量,同上,也是习惯而用;
op=>Output Position=>直译:顶点输出位置,在“顶点着色器”的代码中都有用到的寄存器名称;存放最终GPU用于渲染时的顶点位置数据变量
片段着色器(Fragment Shader/Program)
fc=>Fragment Constant=>直译:片段常量;
ft=>Fragment Temporary=>直译:片段临时变量;
fs=>Fragment Texture Sampler=>直译:片段纹理采样(采样:你懂的,不懂就百度一下)
oc=>Output Color=>直译:片段输出颜色:存放最终决定渲染时的像素颜色数据变量;
向量、矩阵的操作码
1、m44的用法:
m44 dest, v, m
dest=>Vector3D(x,y,z,w);
v=>Vector.<Number>[x,y,z,w];
m=>Vector.<Number>(
[
m11,m12,m13,m14,
m21,m22,m23,m24,
m31,m32,m33,m34,
m41,m42,m43,m44
]
);
m44 运算是,展开来看,就是下面的过程;
dest.x=v.x*m.m11+v.y*m.m12+v.z*m.m13+v.w*m.m14;
dest.y=v.x*m.m21+v.y*m.m22+v.z*m.m23+v.w*m.m24;
dest.z=v.x*m.m31+v.y*m.m32+v.z*m.m33+v.w*m.m34;
dest.w=v.x*m.m41+v.y*m.m42+v.z*m.m43+v.w*m.m44;
作用是:将v顶点的原数据,与m矩阵转换(点乘、点积,或是理解成:m有4个顶点,每个点与v点积的结果,等于第N维对应的数据)后的结果,存放到:dest顶点中
示例:
以下是assemble(programeType,agalStr)方法中agalStr就是AGAL:var vertexShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();vertexShaderAssembler.assemble(Context3DProgramType.VERTEX,// 4x4矩阵乘以相机角度"m44 op, va0, vc0\n"+// 告诉片段着色器x,y,z的值//"mov v0, va0\n"+//因为:v0在片段着色器中没有用到,先暂时注释掉// 告诉版段着色器u,v的值"mov v1, va1\n");var fragmentShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT,// 使用存于v1中的u,v坐标,从纹理fs0中取得纹理的颜色"tex ft0, v1, fs0 <2d, repeat, miplinear>\n"+// 使用fc0 烘焙 颜色到纹理
// "mul ft1, fc0, ft0\n"+//mul dest, src1, src2中,src1与src2的位置是可以无序的;加、乘法,都可以交换的,大家都懂的;其它的就不一样喔;"mul ft1, ft0, fc0\n"+// 将结果输出"mov oc, ft1\n");如何在CPU层上的代码设置呢?va0,vc0,va1,fs0,等;如下:// set va0, position register : x, y ,zcontext3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);// set va1, color register : r, g, b, acontext3D.setVertexBufferAt(1, vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_3);// set fs0, texture sample registercontext3D.setTextureAt(0, myTexture);// set fc0 valuecontext3D.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,Vector.<Number>([Math.sin(t/60), Math.sin(t/10), 1, 1]));
最后自己总结:
AGAL,的语法取决于,这个编译器:
AGALMiniAssembler.as
这个类可以在官网,或是其它地弄成到,总之,大家去搜一下总弄找到;(最简单,直接对GitHub,肯定有)
而这个迷你编译器,最后是把我们输入的字符串“如: vs : "m44 op va0 vc0", fs/ps "move oc fs0";(其实很个m44,dp3,dp4,add,mul,move,等这些命令,到最后,都为转码ByteArray的一个OpCode:操作码,的标识,具体值,我看文档介绍也没有,不过你可以参考:AGALMiniAssembler.as内的代码,里面有对应的枚举定义)
这两个shader都是最后编译成:ByteArray,然后通后,底层的Stage3D.Context3D.program.unload(ByteArray);
也就说,我们可以完也不用官网的这个迷你编译器;而自己写一个;
不过这个你得先了解,这个ByteArray的结构,与Stage3D.context.program,与别的HLSL,或是GLSL有什么支持与不支持的关系;
这样你就完全可以自己写一个基于:Stage3D 的GPU汇编语言了;
如果你能否强大于,可以写个:这个语言的IDE,像VS那么厉害,可以高亮代码,智能提示,调试,那就不得了了;
至于,program接受你传的ByteArray操作码的二进制数据结构,你可以参考我这里提供的两个.pdf:
以别的CG语言与AGAL的简单比较
官方提供的AGAL的ByteArray结构
最后,给大家一些AGAL基础相关,比较有用的网址:
A闪网:(个人比较推荐这个,说得挺详细易懂,大部都是源码注释+博文说明)
http://ashan.org/post-309.html#comment-17360
官方网的一些文章:(中文滴喔,大家好好看这个)
http://www.adobe.com/cn/devnet/flashplayer/articles/what-is-agal.html
Flashache:
http://www.flashache.com/2012/09/19/stage3d-agal-intro-1/
纳金网,3D分栏:--AGAL语法,其实就是别的英文文档的翻译
http://www.narkii.com/club/thread-297505-1.html
以上大部分的中文.pdf都是英文翻译资源;
建议大家都看英文文档;
唉,现在才知道,以前没学好,英文,数学,物理,是多悲催的一件事;
AGAL 的学习记录相关推荐
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
- HTML5与CSS3权威指南之CSS3学习记录
title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...
- springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis
本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...
- 【Cmake】Cmake学习记录
Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...
- ASP.NETCore学习记录(一)
ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.N ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX
Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...
- java之字符串学习记录
java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...
- Redis的学习记录
Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...
最新文章
- HP存储raid5两块硬盘离线lvm下vxfs文件系统恢复数据过程
- MySQL-binlog格式对主从复制的影响MySQL主从复制的过程
- 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?
- rdp协议打开 windows_ubuntu客户端使用RDP协议连接windows服务器
- Laravel学习笔记(四)数据库 数据库迁移案例
- Docker最全教程——从理论到实战(九)
- 实时体积云渲染(地平线):二.Perlin噪声和Worley噪声
- java sin函数图像_java中怎样绘制正弦函数图象
- 动易cms5.0如何安装在远程服务器上,动易PowerEasy_SiteWeaver_CMS6.8安装教程
- c# 小票打印机打条形码_C# Code 128条形码打印的问题
- Windows自带的几种截图快捷键使用方法记录
- 如何设置快速启动栏 win7 快速启动栏 快速启动栏不见了.
- implode 与 explode 区别
- 2018年7月北航举办软件工程师师资培训札记
- RTL8723BU wifi 及 热点移植和测试
- “跳槽”一词的来历竟然是这样!汗
- Shell中的date命令
- This beta version of Typora is expired, please download and install a newer version. 解决方案
- 祝贺 上海建桥学院,潘笑卓获得2021ACA世界大赛中国赛区季军
- ffmpeg 添加-bsf:a aac_adtstoasc 参数的方法