`

[转] MoleHill操作AGAL的Helper类之一

阅读更多

本帖最后由 sleep2death 于 2011-4-20 16:49 编辑


应7yue大大的要求,贴写小东西.
package shader {
        import flash.display3D.*;
        import flash.display3D.textures.*;
        import flash.geom.Matrix3D;

        import com.adobe.utils.*;

        public class AGALHelper {
                public  static var context : Context3D;
                public static var program : Program3D;

                public static var vaNames    : Vector.<String> = new Vector.<String>(8); // MAX 8
                public static var fsNames    : Vector.<String> = new Vector.<String>(8); // MAX 8

                public static var vcNames    : Vector.<String> = new Vector.<String>(128); // MAX 128
                public static var fcNames    : Vector.<String> = new Vector.<String>(28); // MAX 28

                public static var vtNames    : Vector.<String> = new Vector.<String>(8); // MAX 8
                public static var ftNames    : Vector.<String> = new Vector.<String>(8); // MAX 8

                public static var vNames    : Vector.<String> = new Vector.<String>(8); // MAX 8

                public static const FLOAT  : uint = 0;
                public static const FLOAT2 : uint = 1;
                public static const FLOAT3 : uint = 2;
                public static const FLOAT4 : uint = 3;

                public static const VERTEX  : uint = 0;
                public static const FRAMENT : uint = 1;

                public static function getAttributeIndex(name : String) : int {
                        var insertIndex : int = vaNames.indexOf(name);

                        if(insertIndex < 0) {
                                insertIndex = vaNames.indexOf(null);
                                vaNames[insertIndex] = name;

                                trace("assign " + name + " to va" + insertIndex);
                        }

                        return insertIndex;

                }

                public static function setAttribute(name : String, buffer : VertexBuffer3D, offset : uint = 0, format : String = "float4") : void {
                        context.setVertexBufferAt(getAttributeIndex(name), buffer, offset, format);
                }

                public static function getVertexConstantIndex(name : String) : int {
                        var insertIndex : int = vcNames.indexOf(name);

                        if(insertIndex < 0) {
                                insertIndex = vcNames.indexOf(null);
                                vcNames[insertIndex] = name;

                                trace("assign " + name + " to vc" + insertIndex);
                        }

                        return insertIndex;
                }

                public static function setVertexConstant(name : String, value : *) : void {
                        if(value is Vector.<Number>){
                                context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, getVertexConstantIndex(name), value);
                        }else if(value is Matrix3D){
                                context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, getVertexConstantIndex(name), value, true);
                        }
                }

                public static function getFragmentConstantIndex(name : String) : int {
                        var insertIndex : int = fcNames.indexOf(name);

                        if(insertIndex < 0) {
                                insertIndex = fcNames.indexOf(null);
                                fcNames[insertIndex] = name;

                                trace("assign " + name + " to fc" + insertIndex);
                        }

                        return insertIndex;

                }

                public static function setFragmentConstant(name : String, value : *) : void {
                        if(value is Vector.<Number>){
                                context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, getVertexConstantIndex(name), value);
                        }else if(value is Matrix3D){
                                context.setProgramConstantsFromMatrix(Context3DProgramType.FRAGMENT, getVertexConstantIndex(name), value, true);
                        }
                }

                public static function getSampleIndex(name : String) : int {
                        var insertIndex : int = fsNames.indexOf(name);

                        if(insertIndex < 0) {
                                insertIndex = fsNames.indexOf(null);
                                fsNames[insertIndex] = name;

                                trace("assign " + name + " to fs" + insertIndex);
                        }

                        return insertIndex;
                }

                public static function setSample(name : String, value : Texture) : void {
                        context.setTextureAt(getSampleIndex(name), value);
                }

                public static function getIndexByName(vf : String, type : String, name : String) : uint {
                        
                        var first : String = type == "v" ? "v" : vf + type;        
                        var names : Vector.<String> = AGALHelper[first + "Names"];

                        var insertIndex : int = names.indexOf(type + "_" + name);

                        if(insertIndex < 0) {
                                insertIndex = names.indexOf(null);
                                names[insertIndex] = type + "_" + name;

                                trace("assign " + type + "_" + name + " to " + first  + insertIndex);
                        }

                        return insertIndex;
                }

                public static var v_code : String = new String();

                public static function addVertexCode(op_code : String, out : String, in1 : String ,in2 : String = null, extra : String = null) : void {
                        if(op_code == "len"){
                                ExtraCode_len(out, in1);
                        }else{
                                v_code += op_code + " " + parseParam(out, "v")  + ", " + parseParam(in1, "v");
                                if(in2 != null) v_code += " " + parseParam(in2, "v");
                                if(extra != null) v_code +=" " + extra;
                                
                                v_code += " \n";
                        }
                }

                public static var f_code : String = new String();

                public static function addFragmentCode(op_code : String, out : String, in1 : String ,in2 : String = null, extra : String = null) : void {
                        f_code += op_code + " " + parseParam(out, "f")  + ", " + parseParam(in1, "f");
                        if(in2 != null) f_code += " " + parseParam(in2, "f");
                        if(extra != null) f_code +=" " + extra;
                        
                        f_code += " \n";
                }

                private static var v_assembler : AGALMiniAssembler = new AGALMiniAssembler();
                private static var f_assembler : AGALMiniAssembler = new AGALMiniAssembler();

                public static function uploadCode() : void {
                        v_assembler.assemble(Context3DProgramType.VERTEX, v_code);
                        f_assembler.assemble( Context3DProgramType.FRAGMENT, f_code);

                        if(!program){
                                program = context.createProgram();
                                context.setProgram(program);
                        }

                        program.upload(v_assembler.agalcode, f_assembler.agalcode);
                }

                public static function printCode() : void {
                        trace("========  VERTEX     ========");
                        trace(v_code);
                        trace("========  FRAGMENT   ========");
                        trace(f_code);
                }

                private static function parseParam( code : String, vf : String ) : String {
                        var prop : Array = code.split(".");
                        var prop_str : String;

                        if(prop.length > 1) {
                                code = prop[0];
                                prop_str = "."+prop[1];
                        }else{
                                prop_str = "";
                        }

                        var codes : Array = code.split("_");

                        if(codes.length > 1)
                                return (codes[0] == "v" ?"" : vf) + codes[0] + getIndexByName(vf, codes[0], codes[1]) + prop_str;

                        return code + prop_str;
                }

                private static function ExtraCode_len(out : String, in1 : String) : void {
                        addVertexCode("dp3", out, in1, in1);
                        addVertexCode("sqr", out, out);
                }
        }
}


如何使用呢?

先用helper设置一些属性:
AGALHelper.setVertexConstant("c_a1", Vector.<Number>([1.025]));
AGALHelper.setAttribute("a_vb", vertexBuffer));
然后写汇编
                        AGALHelper.addVertexCode("mov", "t_vb", "a_vb");
                        AGALHelper.addVertexCode("mov", "t_uvb", "a_uvb");
                        AGALHelper.addVertexCode("mov", "t_nb", "a_nb");

                        AGALHelper.addVertexCode("sub", "t_v3Ray", "t_vb", "c_v3CameraPos.xyz");
                        AGALHelper.addVertexCode("len", "t_fFar.xyz", "t_v3Ray");

                       
                        AGALHelper.addVertexCode("m44", "op", "t_vb", "c_proj");

                        AGALHelper.addVertexCode("mov", "v_uvb", "t_uvb");
                        AGALHelper.addVertexCode("mov", "v_nb", "t_nb");

                        AGALHelper.addFragmentCode("mov", "t_uvb", "v_uvb");
                        AGALHelper.addFragmentCode("tex", "t_day", "t_uvb", "s_day", "<2d, clamp, linear>");
                        AGALHelper.addFragmentCode("mov", "oc", "t_day");

                        AGALHelper.printCode();
                        AGALHelper.uploadCode();

好处是你再也不要去记ft0, fc1到底是啥了...另外可以新增一些方法,比如length等等
分享到:
评论

相关推荐

    flash3d的molehill参考资料

    5. **跨平台兼容**:Molehill和Stage3D的设计目标之一就是跨平台兼容,确保在支持Flash Player的不同操作系统和浏览器上都能提供一致的3D体验。 6. **游戏开发**:Molehill的出现极大地推动了Flash平台上的3D游戏...

    Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide

    《Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide》是一本针对初学者的指南书籍,旨在帮助读者通过ActionScript 3 (AS3) 和 Adobe GPU Accelerated Library (AGAL) 学习如何利用Adobe Flash ...

    源码Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide

    《源码Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide》是针对初学者的一本深入解析Adobe Flash 11中的Stage3D(Molehill)技术的游戏编程指南。这本书通过一系列章节的示例代码,旨在帮助...

    Adobe Flash 11 Stage3D Molehill Game Programming Beginners Guide

    《Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide》是一本专为初学者设计的3D游戏编程指南。本书由资深游戏开发者克里斯特·凯蒂拉(Christer Kaitila)编写,他拥有超过17年的专业经验,...

    as3 molehill实例

    在数字媒体和游戏开发领域,Flash曾经是引领潮流的工具之一,特别是在2D动画和交互式内容制作方面。然而,随着技术的进步,用户对更加立体和真实感的3D体验的需求日益增长。于是,Adobe推出了AS3 Molehill API,为...

    Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide.pdf

    综上所述,《Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide》是一本全面介绍如何使用Adobe Flash 11 和 Stage3D (Molehill) 技术开发3D游戏的入门书籍。它不仅涵盖了必要的理论知识,还提供...

    Adobe Molehill Stage3d 编译器AGALMiniAssembler

    通过Adobe官方提供的编译器AGALMiniAssembler(实际上是一个AS类库),我们可以通过字符串指令来获得一个AGAL二进制流,再通过context3D上传给显卡的编程管线。对于顶点以及片段的运算都是通过AGAL交由显卡来处理的...

    Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner 书源码

    5. **渲染上下文**:使用`flash.display3D.Context3D`类建立渲染上下文,这是所有Stage3D操作的基础。 6. **纹理映射**:将2D图像应用到3D对象表面,增加视觉效果。 7. **光照和着色**:学习如何添加光源并应用...

    [转]M2D的介绍——针对Flash ‘Molehill’ API的GPU加速2D框架

    在这个背景下,M2D(Molehill 2D)应运而生,它是一个专门针对Molehill API设计的2D框架,旨在利用现代硬件的优势,提高2D图形的渲染速度。 M2D框架的主要目标是简化开发者的工作,通过提供易于使用的接口来实现GPU...

    [转]Flash ‘Molehill’ API上的GPU加速2D框架-M2D

    **标题解析:**“Flash ‘Molehill’ API上的GPU加速2D框架-M2D”指的是一项技术,它利用了Adobe Flash平台中的Molehill API来实现2D图形的GPU加速。M2D(可能是“Molehill 2D”的缩写)引擎是一个专门设计用于提高2...

    Molehill API分析

    Molehill API 主要包括 Stage3D API 和 AGAL(Adobe Graphics Assembly Language)。 #### 二、Stage3D API Stage3D API 是 Molehill API 的核心部分,它为开发者提供了一种全新的方式来访问和控制 GPU 的功能。...

    在Flash Builder中搭建Molehill的开发测试环境

    在Flash Builder中搭建Molehill的开发测试环境;在Flash Builder中搭建Molehill的开发测试环境

    FlashDevelop + FlashPlayer11(Molehill) + Away3D 4.0 Alpha配置

    ### FlashDevelop + FlashPlayer11(Molehill) + Away3D 4.0 Alpha 配置详解 #### 一、前言 随着3D技术在Web领域的应用日益广泛,Adobe Flash平台也推出了针对3D图形处理的支持。其中,FlashPlayer11通过引入代号为...

    Packt.Adobe.Flash.11.Stage3D.(Molehill).Game.Programming.Beginner's.Guide

    Flash Stage3D,又名Molehill,是Adobe引入的一个重要的图形加速技术,它显著提升了Flash在网页上运行3D图形的能力,使得游戏开发者能够创建出更加逼真、流畅的游戏体验。 Stage3D是ActionScript 3.0的一个关键特性...

Global site tag (gtag.js) - Google Analytics