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
]));

Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章的更多相关文章

  1. 由浅到深理解java反射

    1.基础概念 class类: 1.1java是面向对象的,但是在java中存在两种东西不是面向对象的 一种是普通的数据类型,这也是封装数据类存在的原因. 二种是静态静态成员. 1.2所以我们首先要理解 ...

  2. 由浅到深理解ROS(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  3. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  4. 由浅到深理解ROS(3)-命名空间

    全局命名空间: /rosout前面的反斜杠“/”表明该节点名称属于全局命名空间.之所以叫做全局名称因为它们在任何地方(包括代码.命令行工具.图形界面工具等的任何地方)都可以使用.无论这些名称用作众多命 ...

  5. 由浅到深理解ROS(1)

    ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率.ROS能够提供类似传统操作系统的诸多功能,如硬件抽象.底层设备控制.常用功能 ...

  6. JavaScript基础知识从浅入深理解(一)

    JavaScript的简介 javascript是一门动态弱类型的解释型编程语言,增强页面动态效果,实现页面与用户之间的实时动态的交互. javascript是由三部分组成:ECMAScript.DO ...

  7. 由浅到深理解ROS(2)

    ROS文件系统 用户可以直接参看官网:http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem ROS文件系统中的两个最基本的概念:Packa ...

  8. 从浅入深——理解JSONP的实现原理

    由于浏览器的安全性限制,不允许AJAX访问 协议不同.域名不同.端口号不同的 数据接口,浏览器认为这种访问不安全: 可以通过动态创建script标签的形式,把script标签的src属性,指向数据接口 ...

  9. 「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader

    「游戏引擎 浅入浅出」从零编写游戏引擎教程,是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book 4.1 ...

随机推荐

  1. HDU 2604 Queuing 矩阵高速幂

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. Roundcube login via PHP script

    目前正在整合 roundcube 1.0.5 的邮件系统和其他系统,想取消登录过程,发现了这个,先赞一个! 原文地址: http://blog.philippheckel.com/2008/05/16 ...

  3. .NET:异常以及异常处理框架探析(转载)

    概述 一般情况下,企业级应用都对应着复杂的业务逻辑,为了保证系统的健壮,必然需要面对各种系统业务异常和运行时异常. 不好的异常处理方式容易造成应用程序逻辑混乱,脆弱而难于管理.应用程序中充斥着零散的异 ...

  4. Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!

    执行Maven Install打包的时候,提示以下警告信息: [WARNING] Using platform encoding (GBK actually) to copy filtered res ...

  5. Android之应用内部实现国际化

    这篇文章也提供了应用内部转换语言的方法: http://blog.csdn.net/sodino/article/details/6596709 .1和2的方法是一样的,然而还是会调整了手机的语言设置 ...

  6. 使用HTML5画饼图

    在进行数据的统计分析时, 饼图也是比较经常用到的一类统计图. 需求分析:   一个饼图一般包含以下几部分:   1.标题   2.扇形   3.份额(百分比)   4.标识器      设计:     ...

  7. C语言union关键字,union和struct区别

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  8. IE6与CSS样式兼容问题汇总

    1.PNG半透明图片的问题 虽然可以通过JS等方式解决,但依然存在载入速度等问题,所以,这个上能不要用还是尽量不要用.以达到网站最大优化. 2.IE6下的圆角 IE6不支持CSS3的圆角属性,比较好的 ...

  9. ECMAScript5之Object学习笔记(二)

    继续第二部分 Object.freeze(obj) 看字面意思就是“把一个对象冻结”. 下面我们来看个简单的例子以作说明: // a person instance var person = { na ...

  10. python 初步学习

    疑惑1:windows下的python  如何设置显示汉字 推荐几个学习网址,也方便自己以后查看: http://pmghong.blog.51cto.com/3221425/d-10 www.w3c ...