Everyday Stage3D (一)

 
 
总结来说,Stage3D是跟GPU打交道的技术。涉及到几方面的知识:
1、渲染的过程,3d管线的概念。有vertex shader,有fragment shader,这连个是管线里边提供接口出来,可供自定义编程的
     http://hi.baidu.com/haorui1130/item/aa65dcceceaebf3f4494167b
2、Stage3D的context3d是核心,负责跟gpu打交道,上传顶点信息xy、纹理信息uv、常量等。初始化时,每个xy对应一个uv
3、编写两个shader(利用AGAL),将上传的信息计算出最后的结果值;
vertex shader负责计算图形的大小变化、位置、旋转;
fragment shader负责计算贴图
 
需要注意的是:
  • vertex shader对整个绘图区域,以中心点为原点,y轴向上,范围[-1, 1];而普通stage坐标是,左上角为原点,y轴向下
  • fragment shader的纹理坐标又不一样,左上角为原点,y轴向下,范围是[0, 1]
 
AGAL的指令,可以跟PixelBender的做比较,略有类似。
两段程序,如果要执行片段shader,那么在顶点shader的代码最后需要把顶点位置信息传到v0,以供片段shader取出来用
GPU会对每个顶点信息执行这两个代码,这就类似于PixelBender执行每一个像素
指令的相似:一样用xyzxw存取float4,而float4跟float可以直接相乘,出来的还是float4。float4也可以乘以float4,出来的还是float4,是x和x,y和y分别相乘。
 
矩阵计算:
Matrix3D可以不断乘以新的矩阵,等于多个变换集合在一起。比flash原来的Matrix好使多了。AGAL对Matrix3D的使用,其实跟flash普通sprite的matrix是同一个道理。
函数是append和prepend,两者区别,打印矩阵一看就懂了
 
 
例子
利用Matrix3d和Vertex shader实现变形:
var matrix:Matrix3D = new Matrix3D();
matrix.appendScale(0.5, 0.5, 1); //缩小一倍
matrix.appendTranslation(0.5, 0.25, 0); //x移动0.5,也就是1/4,y移动0.25
matrix.appendRotation(45, new Vector3D(0,0,1)); //平时Sprite的旋转45度
for (var i:int = 0; i < matrix.rawData.length; i+=4)
{
trace(matrix.rawData[i] + "\t" + matrix.rawData[i + 1] + "\t" + matrix.rawData[i + 2] + "\t" + matrix.rawData[i + 3]);
} _context3d.setProgramConstantsFromMatrix( "vertex", 0, matrix, true); //这里需要注意,涉及到位移,这里需要把矩阵转置一下,true表示先转置一下。否则计算结果有问题 private var _vertexProgram:String = "m44 op, va0, vc0\n" +
"mov v0, va1"; //传递给片段shader坐标值
利用Matrix3d和Fragment Shader实现sepia效果(旧照片滤镜):
private var _fragmentProgram:String = "tex ft1, v0, fs0<2d,linear,nomip>\n" +
"m44 ft2, ft1, fc1\n" + //颜色变换
"mul ft2, ft2, fc0.x\n" + //效果图跟原图做multiply,向量float4 * float = float4,类似PixelBender
"mul ft1, ft1, fc0.y\n" +
"add ft2, ft2, ft1\n" +
"mov oc, ft2" ;
//multiple比例
_context3d.setProgramConstantsFromVector( "fragment" , 0, new<Number>[1, 0, 0, 0]);
//颜色矩阵
_context3d.setProgramConstantsFromMatrix( "fragment" , 1, new Matrix3D( new <Number>[
0.393, 0.768, 0.189, 0,
0.349, 0.686, 0.168, 0,
0.272, 0.534, 0.13, 0,
0, 0, 0, 1
]));

最新文章

  1. jquery的$().each,$.each的区别
  2. Magento Connector: Error: Please check for sufficient write file permissions
  3. 经典排序算法 - 冒泡排序Bubble sort
  4. STL_关联容器 VS C++ hashmap
  5. Ext通过后台校验字段是否重复
  6. 关于JQuery与AJAX验证
  7. 破解之关键CALL与关键跳查找方法
  8. Getting Text Metrics in Firemonkey(delphiscience的博客)
  9. vc 获取当前时间
  10. git切换远程
  11. Infinite scroll has been called autopagerize, unpaginate, endless pages
  12. Linux指令--route
  13. HyperLedger Fabric 1.1 手动部署单机单节点
  14. ●BZOJ 2149 拆迁队
  15. selinux学习
  16. PHP(基础语法:执行原理)
  17. 03 基于umi搭建React快速开发框架(封装列表增删改查)
  18. js setInterval参数设置
  19. datagridview 获取选中行的索引
  20. 使用eclipse构建Maven项目及发布一个Maven项目

热门文章

  1. Adding an instance to a MEF container
  2. datagrid在MVC中的运用06-固定连续列
  3. 微软Silverlight欲攻占iPhone和Android手机
  4. DWZ学习记录--关闭loading效果
  5. 《逆袭大学:传给IT学子的正能量》
  6. [Git] 技术的热门度曲线
  7. CVPR 2015 papers
  8. ubuntu下用户的创建、修改
  9. T-sql语句修改数据库逻辑名、数据库名、物理名
  10. 倒计时 总结 Timer Handler CountDownTimer RxJava MD