// opcodes 操作码 ?? 用寄存器 作数据运算?
//[opcode][destination][source1][source2 or sampler]
//[操作码] [目标] [source1] [source2或采样器]
private static const MOV:String = "mov"; //数据牵移
private static const ADD:String = "add"; //数据加法
private static const SUB:String = "sub"; //数据减法
private static const MUL:String = "mul"; //数据乘法
private static const DIV:String = "div"; //除法
private static const RCP:String = "rcp"; //倒数
private static const MIN:String = "min"; //比较 较小值
private static const MAX:String = "max"; //比较 较大值
private static const FRC:String = "frc"; //取小数。。
private static const SQT:String = "sqt"; //开方
private static const RSQ:String = "rsq"; //开方倒数
private static const POW:String = "pow"; //数幂指数
private static const LOG:String = "log"; //log运算
private static const EXP:String = "exp"; //e的运算 e^2
private static const NRM:String = "nrm"; //标准化
private static const SIN:String = "sin"; //sin运算
private static const COS:String = "cos"; //cos运算
//cross product destination.x = source1.y * source2.z - source1.z * source2.y destination.y = source1.z * source2.x - source1.x * source2.z
private static const CRS:String = "crs"; //叉乘运算
private static const DP3:String = "dp3"; //点乘运算。。向量间投影
private static const DP4:String = "dp4"; //四向量点乘
private static const ABS:String = "abs"; //数的绝对值
private static const NEG:String = "neg"; //取相反数
private static const SAT:String = "sat"; //取数与0的最大值 maximum(minimum(source1,1),0),
private static const M33:String = "m33"; //33矩阵乘法
private static const M44:String = "m44"; //44矩阵乘法
private static const M34:String = "m34"; //34矩阵乘法
private static const IFZ:String = "ifz";
private static const INZ:String = "inz";
private static const IFE:String = "ife";
private static const INE:String = "ine";
private static const IFG:String = "ifg";
private static const IFL:String = "ifl";
private static const IEG:String = "ieg";
private static const IEL:String = "iel";
private static const ELS:String = "els";
private static const EIF:String = "eif";
private static const REP:String = "rep";
private static const ERP:String = "erp";
private static const BRK:String = "brk";
private static const KIL:String = "kil"; // 关闭 显卡显示?kil 0x27 kill / discard (fragment shader only)
private static const TEX:String = "tex"; // 贴图 texture sample (fragment shader only)
private static const SGE:String = "sge"; //destination = source1 >= source2 ? 1 : 0 进行设置
private static const SLT:String = "slt"; //destination = source1 < source2 ? 1 : 0 进行设置
private static const SGN:String = "sgn";
//六种寄存器
//1.属性寄存器 顶点着色器 ———— 顶点缓冲数据 有8个属性寄存器 Context3D:setVertexBufferAt(index) 通过as调用 agal访问 va0(8个)
//2.常量寄存器 作用:从as向着色器 传参。Context3D::setProgramConstants() as 调用 agal访问 顶点着色器 vc0 (128个) 片段着色器 fc0(28个)
//3.临时寄存器 作用:用于临时计算 agal访问 顶点着色器 vt0(8个) 片段着色器 ft0(8个)
//4.输出寄存器 作用:用于输出顶点着色器(输出顶点坐标)、片段着色器(输出像素颜色值)的计算数据 顶点着色器 op(1个) 片段着色器 oc(1个)
//5.变寄存器 作用:从顶点着色器传输数据到片段着色器 (数据通常为顶点颜色 或 用于贴图的UV数据) agal访问 v0(8个)
//6.贴图采样寄存器(纹理寄存器) 作用: 据UV数据从贴图中获取颜色值 Context3D::setTextureAt() as调用 (纹理寄存器用来从纹理中获取颜色值)
// agal访问:fs0<flags> <flags>指定多个采集样式 ?? 有几个fs寄存器呢??
// 纹理尺寸: 2d, 3d, cube
// mip投影:nomip, mipnone, mipnearest, mipnone
// 纹理滤镜: nearest,linear(线性)
// 纹理拷贝: repeat, wrap, clamp.
//“tex ft1, v0, fs0 <2d,linear,nomip> “ 纹理操作码 利用v0中的UV数据 从纹理寄存器0中获取颜色值 并存到临时寄存器ft1中。
// registers
//寄存器。
private static const VA:String = "va";//属性寄存器 存储顶点坐标 va0 (8)
private static const VC:String = "vc";//as 传参 用于顶点着色器 vc0 (128)
private static const VT:String = "vt";//临时寄存 用于顶点着色器 vt0 (8)
private static const OP:String = "op"; //输出寄存器 用于顶点着色器 op
private static const V:String = "v"; //变寄存器 用于数据传输 v0 (8)
private static const FC:String = "fc"; //as传参 用于片段着色器 fc0 (8)
private static const FT:String = "ft"; //临时寄存 用于片段着色器 ft0 (8)
private static const FS:String = "fs"; //纹理寄存器 用于纹理中获取颜色 fs0
private static const OC:String = "oc"; //输出寄存器 用于片段着色器 oc
// samplers
//采样器
//纹理尺寸
private static const D2:String = "2d";
private static const D3:String = "3d";
private static const CUBE:String = "cube";
//mip投影
private static const MIPNEAREST:String = "mipnearest";
private static const MIPLINEAR:String = "miplinear";
private static const MIPNONE:String = "mipnone";
private static const NOMIP:String = "nomip";
//纹理滤镜
private static const NEAREST:String = "nearest";
private static const LINEAR:String = "linear";
//这是干嘛地?
private static const CENTROID:String = "centroid";
private static const SINGLE:String = "single";
private static const DEPTH:String = "depth";
//纹理拷贝
private static const REPEAT:String = "repeat";
private static const WRAP:String = "wrap";
private static const CLAMP:String = "clamp";
----------------------------------初始化数据
//配置背景缓冲区
context3D.configureBackBuffer(stage.stage3Ds[0].viewPort.width, stage.stage3Ds[0].viewPort.height, 1, true);
//几何体数据 及UV纹理对应数据
var vertices:Vector.<Number> = Vector.<Number>([
-0.5,-0.5,0, 0, 0, // x, y, z, u, v
-0.5, 0.5, 0, 0, 1,
0.5, 0.5, 0, 1, 1,
0.5, -0.5, 0, 1, 0]);
//顶点缓冲 区 VertexBuffer3D
//将顶点数据放在顶点缓冲区中。。。
//将顶点坐标数据放入va0 寄存器
//调用:context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
//将顶点UV数据 放入va1寄存器 1, vertexbuffer, 3 从发索引3开始 读取UV数据
//调用:context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_2);
vertexbuffer = context3D.createVertexBuffer(4, 5); //创建四个顶点数据 每天顶点数据5个数据
vertexbuffer.uploadFromVector(vertices, 0, 4); //上传顶点数 从0开始 到 4
//索引缓冲区 IndexBuffer3D
//对顶点建立索引 (用于绘制三角形面片)
//面片绘制 context3D.drawTriangles(indexBuffer);
indexBuffer = context3D.createIndexBuffer(6);
indexBuffer.uploadFromVector (Vector.<uint>([0, 1, 2, 2, 3, 0]), 0, 6);
//纹理帖图 Texture
//创建2D纹理
//调用 context3D.setTextureAt(0, texture); 将纹理数据放入纹理寄存器fs0
var bitmap:Bitmap = new TextureBitmap();
texture = context3D.createTexture(bitmap.bitmapData.width, bitmap.bitmapData.height, Context3DTextureFormat.BGRA, false);
texture.uploadFromBitmapData(bitmap.bitmapData);
//创建 顶点着色器和片段着色器
//汇编指令
//"m44 op, va0, vc0\n" 将顶点进行投影 va0 顶点缓冲区数据
//vc0数据导入 变幻矩阵 context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, matrix, true);
//"mov v0, va1" 将UV数据 copy到变寄存器
//tex ft1, v0, fs0 <2d,linear,nomip>\n" + 依据顶点索引 从纹理寄存器中获取颜色 并存到临时寄存器中
//"mov oc, ft1" 将颜色值放到输出寄存器
//当调用 context3D.present(); 进行渲染
var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,
"m44 op, va0, vc0\n" + //将顶点进行投影 vc0数据导入
"mov v0, va1" // copy uv
);
var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();
fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,
"tex ft1, v0, fs0 <2d,linear,nomip>\n" +
"mov oc, ft1"
);
//着色器的封装
program = context3D.createProgram();
program.upload( vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
----------------------------------循环帧处理
context3D.clear ( 0, 0, 0, 1 );
//将顶点缓冲区数据 传入属性寄存器va0
context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
//将UV数据 传入数性寄存器va1
context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_2);
//将纹理数据传入纹理寄存器 fs0
context3D.setTextureAt(0, texture);
//设置着色器
context3D.setProgram(program);
var m:Matrix3D = new Matrix3D();
m.appendRotation( getTimer()/50, Vector3D.Z_AXIS);
//设置变换矩阵 存入vc0
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, m, true);
//绘制三角形面片
context3D.drawTriangles(indexBuffer);
//进行渲染
context3D.present();