1

我有一个 Flex 4.5 AIR 项目,我想创建一个使用 stage3D 的组件。我可以设法让三角形示例在 Flash 播放器的 Actionscript 项目中工作,但我也无法让它与干净的 Flex 项目一起工作。它进入渲染循环,但不可见:

主要的mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark"  creationComplete="application1_initializeHandler(event)"
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        protected function application1_initializeHandler(event:FlexEvent):void
        {
            addEventListener(Event.ADDED_TO_STAGE, init)

        }

        protected function init(e:Event=null):void {
            addElement(new triangle1(stage))
        }

    ]]>
</fx:Script>

triangle.as: 包 { 导入 com.adobe.utils.AGALMiniAssembler;

import flash.display.Sprite;
import flash.display.Stage;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.Rectangle;
import flash.geom.Vector3D;
import flash.utils.getTimer;

import mx.core.UIComponent;

public class triangle1 extends UIComponent
{
    protected var context3D:Context3D;
    protected var program:Program3D;
    protected var vertexbuffer:VertexBuffer3D;
    protected var indexbuffer:IndexBuffer3D;

    public function triangle1(stage:Stage)
    {           
        super();
        stage.stage3Ds[0].addEventListener( Event.CONTEXT3D_CREATE, initMolehill );
        stage.stage3Ds[0].requestContext3D();

        addEventListener(Event.ENTER_FRAME, onRender);

    }

    protected function initMolehill(e:Event):void
    {
        context3D = stage.stage3Ds[0].context3D;            
        context3D.configureBackBuffer(800, 600, 1, true);

        var vertices:Vector.<Number> = Vector.<Number>([
            -0.3,-0.3,0, 1, 0, 0, // x, y, z, r, g, b
            -0.3, 0.3, 0, 0, 1, 0,
            0.3, 0.3, 0, 0, 0, 1]);

        // Create VertexBuffer3D. 3 vertices, of 6 Numbers each
        vertexbuffer = context3D.createVertexBuffer(3, 6);
        // Upload VertexBuffer3D to GPU. Offset 0, 3 vertices
        vertexbuffer.uploadFromVector(vertices, 0, 3);              

        var indices:Vector.<uint> = Vector.<uint>([0, 1, 2]);

        // Create IndexBuffer3D. Total of 3 indices. 1 triangle of 3 vertices
        indexbuffer = context3D.createIndexBuffer(3);           
        // Upload IndexBuffer3D to GPU. Offset 0, count 3
        indexbuffer.uploadFromVector (indices, 0, 3);           

        var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
        vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,
            "m44 op, va0, vc0\n" + // pos to clipspace
            "mov v0, va1" // copy color
        );          

        var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();
        fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,

            "mov oc, v0"
        );

        program = context3D.createProgram();
        program.upload( vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
    }   

    protected function onRender(e:Event):void
    {
        if ( !context3D ) 
            return;

        context3D.clear ( 1, 1, 1, 1 );

        // vertex position to attribute register 0
        context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
        // color to attribute register 1
        context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_3);
        // assign shader program
        context3D.setProgram(program);

        var m:Matrix3D = new Matrix3D();
        m.appendRotation(getTimer()/40, Vector3D.Z_AXIS);
        context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, m, true);

        context3D.drawTriangles(indexbuffer);

        context3D.present();            
    }
}
}

有任何想法吗?没有错误,它跟踪 onRender,所以它只是不可见..:S

4

2 回答 2

2
 <s:Application ....  backgroundAlpha="0"

解决它 :)

于 2012-09-27T13:39:35.650 回答
1

mx:Container 中 Stage3D 的好主意,我不需要担心 mx:Application with backgroundAlpha 0 .. 可能吗?谢谢你。

我将 PaperVision 3D 改进为 Stage3D……因为它比 Away3D 快得多……

于 2015-08-04T07:32:45.693 回答