開発環境 Apache Flex SDK 4.12.1
FlashDevelop 4.6.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 TextureTable

Main.as
package 
{
    import com.adobe.utils.*;
    import flash.display.*;
    import flash.display3D.*;
    import flash.display3D.textures.*;
    import flash.events.*;
 
    public class Main extends Sprite 
    {
        private var context:Context3D;
        private var program:Program3D;
        private var vertexBuffer:VertexBuffer3D;
        private var indexBuffer:IndexBuffer3D;
 
        private var texture:Texture;
 
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContext3DCreate);
            stage.stage3Ds[0].requestContext3D();
        }
 
        private function onContext3DCreate(e:Event):void 
        {
            // context
            context = stage.stage3Ds[0].context3D;
            context.configureBackBuffer(800, 600, 0, false);
 
            // vertexBuffer
            const vertices:Vector.<Number> = Vector.<Number>([
            //  x,  y,  u, v,
                -1, -1, 0, 0, // LB
                -1, 1, 0, 1, // LT
                1, 1, 1, 1, // RT
                1, -1, 1, 0, // RB
            ]);
            const perVertex:int = 4;
            const numVertices:int = vertices.length / perVertex;
            vertexBuffer = context.createVertexBuffer(numVertices, perVertex);
            vertexBuffer.uploadFromVector(vertices, 0, numVertices);
 
            // indexBuffer
            const indices:Vector.<uint> = Vector.<uint>([0, 1, 2, 2, 3, 0]);
            indexBuffer = context.createIndexBuffer(indices.length);
            indexBuffer.uploadFromVector(indices, 0, indices.length);
 
            // texture
            var bitmapData:BitmapData = new BitmapData(16, 1, false);
            for (var x:int = 0; x < bitmapData.width; x++) 
            {
                var color:uint = 0xff * Math.sin((x / bitmapData.width) * (Math.PI / 2));
                bitmapData.setPixel(x, 0, color);
            }
            texture = context.createTexture(
                bitmapData.width, bitmapData.height, Context3DTextureFormat.BGRA, false);
            texture.uploadFromBitmapData(bitmapData);
 
            // program
            var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler;
            vertexAssembler.assemble(Context3DProgramType.VERTEX,
                "mov op va0\n" +
                "mov v0 va1\n"
            );
 
            var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler;
            fragmentAssembler.assemble(Context3DProgramType.FRAGMENT,
                "tex ft0 v0 fs0 <2d,nearest>\n" + // nearest/linear
                "mov oc ft0\n"
            );
 
            program = context.createProgram();
            program.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
 
            // va0 : xy
            context.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
            // va1 : uv
            context.setVertexBufferAt(1, vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
            // fs0 : texture sampler
            context.setTextureAt(0, texture);
            context.setProgram(program);
 
            onRender();
        }
 
        private function onRender():void 
        {
            if (!context) return;
 
            context.clear();
            context.drawTriangles(indexBuffer);
            context.present();
        }
 
    }
 
}
 
最終更新:2014年06月19日 17:37