Stage3D学习笔记(二):使用GPU绘制一个三角形

我们需要使用到Adobe自家提供的AGALMiniAssembler代码类,可以在网下进行下载;

关于AGAL的入门知识可以参考下面的文章:

AGAL介绍系列文章(第一部分)
AGAL介绍系列文章(第二部分)
AGAL介绍系列文章(第三部分)

最终效果如下:

直接上代码了,亲们请查看相关的注释说明:

  1 package
  2 {
  3     import com.adobe.utils.AGALMiniAssembler;
  4
  5     import flash.display.Sprite;
  6     import flash.display.Stage3D;
  7     import flash.display3D.Context3D;
  8     import flash.display3D.Context3DProfile;
  9     import flash.display3D.Context3DRenderMode;
 10     import flash.display3D.Context3DVertexBufferFormat;
 11     import flash.display3D.IndexBuffer3D;
 12     import flash.display3D.Program3D;
 13     import flash.display3D.VertexBuffer3D;
 14     import flash.events.ErrorEvent;
 15     import flash.events.Event;
 16
 17     [SWF(width=800, height=600, frameRate=60)]
 18     public class DrawTriangle extends Sprite
 19     {
 20         //3D 场景对象
 21         private var _stage3D:Stage3D;
 22         //3D 上下文渲染对象
 23         private var _context3D:Context3D;
 24
 25         //顶点缓冲数据
 26         private var _vertexBuffer:VertexBuffer3D;
 27         //索引缓冲数据
 28         private var _indexBuffer:IndexBuffer3D;
 29
 30         //着色器对象
 31         private var _program3D:Program3D;
 32
 33         public function DrawTriangle()
 34         {
 35             addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
 36         }
 37
 38         private function addedToStageHandler(event:Event):void
 39         {
 40             removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
 41
 42             //3D 场景存在, 一般存在 4 个 3D 场景对象
 43             if(stage.stage3Ds.length > 0)
 44             {
 45                 //使用最下层的 3D 场景
 46                 _stage3D = stage.stage3Ds[0];
 47                 //请求 3D 上下文渲染对象
 48                 _stage3D.addEventListener(ErrorEvent.ERROR, stage3DErrorHandler);
 49                 _stage3D.addEventListener(Event.CONTEXT3D_CREATE, context3DCreateHandler);
 50                 _stage3D.requestContext3D(Context3DRenderMode.AUTO, Context3DProfile.BASELINE);
 51             }
 52         }
 53
 54         private function stage3DErrorHandler(event:ErrorEvent):void
 55         {
 56             trace("Context3D对象请求失败:", event.text);
 57         }
 58
 59         private function context3DCreateHandler(event:Event):void
 60         {
 61             initContext3D();
 62             initBuffer();
 63             initProgram();
 64
 65             //每帧进行渲染
 66             addEventListener(Event.ENTER_FRAME, render);
 67         }
 68
 69         private function initContext3D():void
 70         {
 71             //获取 3D 渲染对象
 72             _context3D = _stage3D.context3D;
 73             //调整 3D 舞台位置
 74             _stage3D.x = 50;
 75             _stage3D.y = 50;
 76             //设置后台缓冲区
 77             _context3D.configureBackBuffer(700, 500, 2);
 78         }
 79
 80         private function initBuffer():void
 81         {
 82             //顶点数据
 83             var vertexData:Vector.<Number> = Vector.<Number>(
 84                 [
 85                 //  x, y, z, r, g, b
 86                     0, 0, 0, 1, 0, 0,
 87                     1, 1, 0, 0, 1, 0,
 88                     1, 0, 0, 0, 0, 1
 89                 ]);
 90
 91             //创建顶点缓冲对象, 参数设定存在几组数据和每组数据的个数
 92             _vertexBuffer = _context3D.createVertexBuffer(vertexData.length / 6, 6);
 93             //上传顶点数据到GPU, 参数设定从第几组数据开始上传和上传多少组数据
 94             _vertexBuffer.uploadFromVector(vertexData, 0, vertexData.length / 6);
 95
 96             //索引数据
 97             var indexData:Vector.<uint> = Vector.<uint>(
 98                 [
 99                     0, 1, 2
100                 ]);
101
102             //创建索引缓冲对象, 每个索引对应顶点数据中的相对应的一组数据,
103             //每3个索引组成一个会被绘制出来的三角形, 参数指定索引的长度
104             _indexBuffer = _context3D.createIndexBuffer(indexData.length);
105             //上传索引数据到GPU, 参数设定从第几个数据开始上传和上传多少个数据
106             _indexBuffer.uploadFromVector(indexData, 0, 3);
107         }
108
109         private function initProgram():void
110         {
111             //顶点着色器代码, 每个上传的顶点前都会执行一次该代码
112             var vertexArr:Array =
113                 [
114                     //op 代表位置输出寄存器, 无论对顶点进行多少次的运算最终都要将结果
115                     //赋值给他, 这里我们不进行运行, 直接赋值
116                     "mov op, va0",
117                     //片段着色器需要用的数据要在这里通过 v0 中转一下, 因为片段着色器不
118                     //能直接读取 va0 和 va1 的数据
119                     "mov v0, va1"
120                 ];
121
122             //片段着色器代码, 每个可以显示的像素都会执行一次该代码
123             var fragmentArr:Array =
124                 [
125                     //oc 代表颜色输出寄存器, 每个顶点的颜色数据都要赋值给他
126                     "mov oc, v0"
127                 ];
128
129             //使用 Adobe 自己提供的编译器编译代码为程序可使用的二进制数据
130             var assembler:AGALMiniAssembler = new AGALMiniAssembler();
131             _program3D = assembler.assemble2(_context3D, 1, vertexArr.join("\n"), fragmentArr.join("\n"));
132         }
133
134         private function render(event:Event):void
135         {
136             //清除已绘制过的 3D 图像
137             _context3D.clear(0, 0, 0);
138             //指定着色器代码的 va0 代表的数据段, 以一组顶点数据为基础来看
139             _context3D.setVertexBufferAt(0, _vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
140             //指定着色器代码的 va1 代表的数据段, 以一组顶点数据为基础来看
141             _context3D.setVertexBufferAt(1, _vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_3);
142             //指定当前使用的着色器对象
143             _context3D.setProgram(_program3D);
144             //通过顶点索引数据绘制所有的三角形
145             _context3D.drawTriangles(_indexBuffer);
146             //将后台缓冲的图像显示到屏幕
147             _context3D.present();
148         }
149     }
150 }
时间: 2024-11-08 23:20:49

Stage3D学习笔记(二):使用GPU绘制一个三角形的相关文章

GDI+学习笔记(五)绘制一个正方体

本文将介绍如何利用GDI+绘制一个正方体. (一)准备阶段 想象一下,高中的时候,我们在学立体几何的时候是怎样画一个正方体的,我们在一张纸上利用投影的思路将其绘制在一张纸上,对吧,这计算投影的部分,我们暂且忽略.下图是我用windows的画图绘制的一个正方体: 我们计算出这些点在平面上的坐标如下: Point A(100,200); Point B(200,200); Point C(100,300); Point D(200,300); Point E(100+50*1.414, 200-50

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

Objective-c 学习笔记(二)

面向对象编程(一) 面向过程编程 c语言便是一种面向过程编程的语言.举一段程序代码来更加深刻的认识面向过程. 绘制集合图形: // // main.m // oc // // Created by Tron on 14-8-8. // Copyright (c) 2014年 Tron. All rights reserved. // #import <Foundation/Foundation.h> typedef enum { circle, rectangle, egg } ShapeTy

基于Qt的OpenGL可编程管线学习(1)- 绘制一个三角形

0.写在前面的话 这里只是学习的时候做的笔记记录方便日后的查看,如果有大神看到觉得有问题的地方希望能给予指出,方便日后的学习,谢谢! 我是用的Qt版本为Qt5.6,开发环境为Qt Creator 1.QOpenGLWidget 在Qt开发环境下,使用OpenGL的可编程管线绘制一个三角形 效果如下图所示: 这里使用QOpenGLWidget进行绘制的,在QOpenGLWidget中需要重写 void initializeGL(void); void resizeGL(int w, int h);

qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516201 qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等) 本学章节笔记主要详解Item元素(上半场主要涉及anchors锚),因为所有可视化的界面元素都继承于Item,熟悉Item后,不同的继承子类,有其定制的属性(从几个到几十个不等). <Qt实用技巧:在Qt Gui程

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它