2015-04-06 56 views
0

我簡單的頂點着色器:有道申請翻譯頂點

m44 op, va0, vc0 
mov v0, va1 

和片段着色器:

mov oc, v0 

我通過這個頂點到它:

x  y z w r g b 
-0.3, -0.3, 0, 1, 1, 0, 0, 
0, 0.3, 0, 1, 0, 1, 0, 
0.3, -0.3, 0, 1, 0, 0, 1 

結果三角形看起來像我所期望的。現在我想將一些翻譯應用於結果三角形。我已經聲明瞭一個矩陣,調用appendTranslation(0.2, 0, 0)並將它傳遞給頂點着色器。問題是三角形保持在相同的位置,但具有不同的頂點位置。它看起來像這樣:

Bad triangle

爲什麼我得到這樣的結果,什麼是應用翻譯頂點的正確方法?

這是我的計劃全碼:

package tests 
{ 
    import com.adobe.utils.AGALMiniAssembler; 
    import flash.display.Sprite; 
    import flash.display3D.Context3D; 
    import flash.display3D.Context3DProgramType; 
    import flash.display3D.Context3DRenderMode; 
    import flash.display3D.Context3DVertexBufferFormat; 
    import flash.display3D.IndexBuffer3D; 
    import flash.display3D.Program3D; 
    import flash.display3D.VertexBuffer3D; 
    import flash.events.Event; 
    import flash.geom.Matrix3D; 
    import flash.utils.ByteArray; 

    [swf(width="500", height="500")] 
    public class Stage3dTest extends Sprite 
    { 
     private var _context:Context3D; 
     private var _vertexBuffer:VertexBuffer3D; 
     private var _indexBuffer:IndexBuffer3D; 
     private var _program:Program3D; 
     private var _mat:Matrix3D; 

     public function Stage3dTest() { 
      if (stage) { 
       onAddedToStage(); 
      } else { 
       addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
      } 
     } 
     private function onAddedToStage(event:Event = null):void { 
      this.stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onStage3dContext3DCreate); 
      this.stage.stage3Ds[0].requestContext3D(Context3DRenderMode.SOFTWARE); 
     } 
     private function onStage3dContext3DCreate(event:Event):void { 
      _mat = new Matrix3D(); 
      _mat.appendTranslation(0.2, 0, 0); 
      _context = this.stage.stage3Ds[0].context3D; 
      _context.configureBackBuffer(500, 500, 0, false); 
      _vertexBuffer = _context.createVertexBuffer(3, 7); 
      _indexBuffer = _context.createIndexBuffer(3); 
      var p:Number = 0.3; 
      var vertexData:Vector.<Number> = new <Number>[ 
       -p, -p, 0, 1, 1, 0, 0, 
       0, p, 0, 1, 0, 1, 0, 
       p, -p, 0, 1, 0, 0, 1 
      ]; 
      _vertexBuffer.uploadFromVector(vertexData, 0, 3); 
      _indexBuffer.uploadFromVector(new <uint>[0, 1, 2], 0, 3); 
      createAndCompileProgram(); 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 
     private function createAndCompileProgram():void { 
      _program = _context.createProgram(); 
      var assembler:AGALMiniAssembler = new AGALMiniAssembler(); 
      var code:String = ""; 
      code += "m44 op, va0, vc0\n"+ 
        "mov v0, va1\n"; 
      var vertexShader:ByteArray = assembler.assemble(Context3DProgramType.VERTEX, code); 
      code = "mov oc, v0\n"; 
      var fragmentShader:ByteArray = assembler.assemble(Context3DProgramType.FRAGMENT, code); 
      _program.upload(vertexShader, fragmentShader); 
     } 
     private function onEnterFrame(event:Event):void { 
      _context.clear(0.9, 0.9, 0.9, 1); 
      _context.setProgram(_program); 
      _context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, _mat); 
      _context.setVertexBufferAt(0, _vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_4); 
      _context.setVertexBufferAt(1, _vertexBuffer, 4, Context3DVertexBufferFormat.FLOAT_3); 
      _context.drawTriangles(_indexBuffer); 
      _context.present(); 
     } 
    } 
} 
+0

如何/你在哪裏調用'appendTranslation()'?你確定最終的轉換矩陣是否用於着色器的頂點常量?小心顯示代碼行如何設置翻譯到您的矩陣? – bigp

+0

只是加載不同的頂點並呼叫目前,這就是你如何翻譯它們。如果你想用矩陣做它,然後加載一個新的矩陣並調用存在。如果您不更改數據並致電現在,則沒有任何內容會被翻譯。 – BotMaster

+0

感謝您的回覆傢伙。我已更新我的問題,請檢查它。 – patrick

回答

1

你需要矩陣轉置的。您可以手動完成,或者你可以在這裏傳遞參數:

_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, _mat, true);