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

http://planetpixelemporium.com/earth.html
からearthmap1k.jpgをダウンロードし、srcディレクトリに置く。

プロジェクトのプロパティを開き、OutputタブのGeneral/Dimensionsを1024x512pxにする。

Main.as
package 
{
    import com.adobe.utils.AGALMiniAssembler;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display3D.Context3D;
    import flash.display3D.Context3DProgramType;
    import flash.display3D.Context3DTextureFormat;
    import flash.display3D.Context3DVertexBufferFormat;
    import flash.display3D.IndexBuffer3D;
    import flash.display3D.Program3D;
    import flash.display3D.textures.Texture;
    import flash.display3D.VertexBuffer3D;
    import flash.events.Event;
    import flash.geom.Matrix;
 
    public class Main extends Sprite 
    {
        private var context3D:Context3D;
        private var program:Program3D;
        private var vertexBuffer:VertexBuffer3D;
        private var indexBuffer:IndexBuffer3D;
 
        [Embed(source="earthmap1k.jpg")]
        private const TextureBitmap:Class;
        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 
        {
            context3D = stage.stage3Ds[0].context3D;
            context3D.configureBackBuffer(1024, 512, 2, true);
 
            // vertexBuffer
            const vertices:Vector.<Number> = Vector.<Number>([
            //  x,  y,  u, v,
                -1, -1, 0, 1, // LB
                -1, 1, 0, 0, // LT
                1, 1, 1, 0, // RT
                1, -1, 1, 1, // RB
            ]);
            const perVertex:int = 4;
            const numVertices:int = vertices.length / perVertex;
            vertexBuffer = context3D.createVertexBuffer(numVertices, perVertex);
            vertexBuffer.uploadFromVector(vertices, 0, numVertices);
 
            // indexBuffer
            const indices:Vector.<uint> = Vector.<uint>([0, 1, 2, 2, 3, 0]);
            indexBuffer = context3D.createIndexBuffer(indices.length);
            indexBuffer.uploadFromVector(indices, 0, indices.length);
 
            // texture
            var bitmap:Bitmap = new TextureBitmap();
            var bitmapData:BitmapData = new BitmapData(1024, 512);
            bitmapData.draw(bitmap.bitmapData,
                new Matrix(1024 / 1000, 0, 0, 512 / 500), null, null, null, true);
            texture = context3D.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>\n" +
                "mov oc ft0\n"
            );
 
            program = context3D.createProgram();
            program.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
 
            // va0 : xy
            context3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
            // va1 : uv
            context3D.setVertexBufferAt(1, vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
            // fs0 : texture sampler
            context3D.setTextureAt(0, texture);
            context3D.setProgram(program);
 
            onRender(null);
        }
 
        private function onRender(e:Event):void 
        {
            if (!context3D) return;
 
            context3D.clear();
            context3D.drawTriangles(indexBuffer);
            context3D.present();
        }
 
    }
 
}
 
最終更新:2014年06月17日 00:07