关于AGAL

// 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();
posted @ 2012-04-19 10:28  peony3d  阅读(699)  评论(0)    收藏  举报