// フレームアクションに書いたスクリプト import flash.display3D.Context3D; import flash.display3D.Context3DProgramType; import flash.display3D.Context3DRenderMode; import flash.display3D.Context3DTriangleFace; import flash.display3D.Context3DVertexBufferFormat; import flash.display3D.IndexBuffer3D; import flash.display3D.Program3D; import flash.display3D.VertexBuffer3D; import flash.display3D.textures.Texture; import flash.display3D.Context3DTextureFormat; import com.adobe.utils.AGALMiniAssembler; // Stage3Dの設定 var stage3D:Stage3D = stage.stage3Ds[0]; stage3D.addEventListener(Event.CONTEXT3D_CREATE, contextCreated); stage3D.requestContext3D(Context3DRenderMode.AUTO); function contextCreated(eventObject:Event):void { var context:Context3D = Stage3D(eventObject.target).context3D; // 頂点の(x, y, z)と(u, v)座標 var vertices:Vector. = new [ // x, y, z, u, v -0.5, 0.5, 0, 0, 0, // 頂点0 -0.5, -0.5, 0, 0, 1, // 頂点1 0.5, -0.5, 0, 1, 1, // 頂点2 0.5, 0.5, 0, 1, 0 // 頂点3 ]; // 三角形の頂点番号の組 var indices:Vector. = new [ 0, 1, 2, 2, 3, 0 ]; // ビットマップをテクスチャにアップロード var bitmapData:BitmapData = new Pen(); var texture:Texture = context.createTexture( bitmapData.width, bitmapData.height, Context3DTextureFormat.BGRA, false ); context.configureBackBuffer(stage.stageWidth, stage.stageHeight, 2, false); texture.uploadFromBitmapData(bitmapData); uploadShaders(context, texture, vertices, indices); } function uploadShaders(context:Context3D, texture:Texture, vertices:Vector., indices:Vector.):void { // 頂点バッファの作成とアップロード(4頂点に各5座標値) var vertexbuffer:VertexBuffer3D = context.createVertexBuffer(4, 5); vertexbuffer.uploadFromVector(vertices, 0, 4); // インデックスバッファの作成とアップロード(三角形ふたつで6インデックス) var indexbuffer:IndexBuffer3D = context.createIndexBuffer(6); indexbuffer.uploadFromVector(indices, 0, 6); // 頂点シェーダと断片シェーダのコンパイル var vertexShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler(); vertexShaderAssembler.assemble(Context3DProgramType.VERTEX, "m44 op, va0, vc0\n" + "mov v0, va1"); var fragmentShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler(); fragmentShaderAssembler.assemble(Context3DProgramType.FRAGMENT, "tex ft1, v0, fs0 <2d,linear, nomip>;\n" + "mov oc, ft1"); // 頂点シェーダと断片シェーダをアップロード var program:Program3D = context.createProgram(); program.upload(vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode); // 頂点バッファの初期設定 context.clear(1, 1, 1, 1); // 属性0: 3つの浮動小数点数(x, y, z) context.setVertexBufferAt(0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3); // 属性1: 2つの浮動小数点数(u, v) context.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_2); // テクスチャの設定 context.setTextureAt(0, texture); // シェーダプログラムの設定 context.setProgram(program); // 変換行列の作成と適用 var matrix3D:Matrix3D = new Matrix3D(); matrix3D.appendRotation(30, Vector3D.Z_AXIS); context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, matrix3D); // , true); // 三角形を描画 context.drawTriangles(indexbuffer); // バックレンダリングバッファを表示 context.present(); }