一个简单的Context3D的Demo

 1 package
 2 {
 3 import com.adobe.utils.AGALMiniAssembler;
 4 
 5 import flash.display.Sprite;
 6 import flash.display3D.Context3D;
 7 import flash.display3D.Context3DProgramType;
 8 import flash.display3D.Context3DVertexBufferFormat;
 9 import flash.display3D.IndexBuffer3D;
10 import flash.display3D.Program3D;
11 import flash.display3D.VertexBuffer3D;
12 import flash.events.Event;
13 import flash.geom.Matrix3D;
14 import flash.geom.Vector3D;
15 import flash.utils.getTimer;
16 
17 public class HelloTriangleColored extends Sprite
18 {
19 protected var context3D:Context3D;
20 protected var program:Program3D;
21 protected var vertexbuffer:VertexBuffer3D;
22 protected var indexbuffer:IndexBuffer3D;
23 
24 public function HelloTriangleColored()
25 {
26 stage.stage3Ds[0].addEventListener( Event.CONTEXT3D_CREATE, initMolehill );
27 stage.stage3Ds[0].requestContext3D();
28 
29 addEventListener(Event.ENTER_FRAME, onRender);
30 }
31 
32 protected function initMolehill(e:Event):void
33 {
34 context3D = stage.stage3Ds[0].context3D;
35 context3D.configureBackBuffer(800, 600, 1, true);//!!!!!!!!!挺重要的
36 
37 var vertices:Vector.<Number> = Vector.<Number>([
38 -0.3,-0.3,0, 1, 0, 0, // x, y, z, r, g, b
39 -0.3, 0.3, 0, 0, 1, 0,
40 0.3, 0.3, 0, 0, 0, 1]);
41 
42 // Create VertexBuffer3D. 3 vertices, of 6 Numbers each
43 vertexbuffer = context3D.createVertexBuffer(3, 6);
44 // Upload VertexBuffer3D to GPU. Offset 0, 3 vertices
45 vertexbuffer.uploadFromVector(vertices, 0, 3);
46 
47 var indices:Vector.<uint> = Vector.<uint>([0, 1, 2]);
48 
49 // Create IndexBuffer3D. Total of 3 indices. 1 triangle of 3 vertices
50 indexbuffer = context3D.createIndexBuffer(3);
51 // Upload IndexBuffer3D to GPU. Offset 0, count 3
52 indexbuffer.uploadFromVector (indices, 0, 3);
53 
54 var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
55 vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,
56 "m44 op, va0, vc0\n" + // pos to clipspace
57 "mov v0, va1" // copy color
58 );
59 
60 var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();
61 fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,
62 
63 "mov oc, v0"
64 );
65 
66 program = context3D.createProgram();
67 program.upload( vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
68 }
69 
70 protected function onRender(e:Event):void
71 {
72 if ( !context3D )
73 return;
74 
75 context3D.clear ( 1, 1, 1, 1 );
76 
77 // vertex position to attribute register 0
78 context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
79 // color to attribute register 1
80 context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_3);
81 // assign shader program
82 context3D.setProgram(program);
83 
84 var m:Matrix3D = new Matrix3D();
85 m.appendRotation(getTimer()/40, Vector3D.Z_AXIS);
86 context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, m, true);
87 
88 context3D.drawTriangles(indexbuffer);
89 
90 context3D.present();
91 }
92 }
93 }
94   

 

posted @ 2017-05-04 21:10  Star阿七  阅读(573)  评论(0编辑  收藏  举报