2013-02-05 105 views
0

我想這個着色器轉換:這是AGAL輸出是否正確?

<script id="shader-vs" type="x-shader/x-vertex"> 
      attribute vec2 pos; 
      attribute vec4 aVertexColor; 

      varying vec4 vColor; 

      void main(void) { 
       gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); 
       vColor = aVertexColor; 
      } 

     </script> 

<script id="shader-fs" type="x-shader/x-fragment"> 
     precision mediump float; 

     varying vec4 vColor; 

     void main(void) { 
      gl_FragColor = vColor; 
     } 

     </script> 

有結果(這是否輸出看起來不錯,你還是我失去了一些東西):

mov vt0.zw, vc0.xyyy 
mov vt0.x, va0.x 
mov vt0.y, va0.y 
mov op, vt0 
mov v0, va1 

and

mov oc, v0 

但我不能顯示任何東西,如果我改變AGAL頂點着色器的東西很多簡單的工作:

mov op, va0n 
mov v0, va1n 

我將常數,當我通過GLSL轉換爲AGAL:

var constval:Array; 
       for (var constant:String in result.consts) { 
        trace(constant, result.consts[constant]); 
        constval = result.consts[constant]; 
        context.setProgramConstantsFromVector(type, int(constant.slice(2)), Vector.<Number>([constval[0], constval[1], constval[2], constval[3]]))  
       } 

我準備好所有這樣的緩衝器:

var vertices:Vector.<Number> = Vector.<Number>([ 
     -0.3,-0.3,0, 1, 0, 0, // x, y, z, r, g, b 
     -0.3, 0.3, 0, 0, 1, 0, 
     0.3, 0.3, 0, 0, 0, 1]); 


    const dataPerVertex:int = 6; 
    vertexbuffer = context.createVertexBuffer(vertices.length/dataPerVertex, dataPerVertex); 
    vertexbuffer.uploadFromVector(vertices, 0, vertices.length/dataPerVertex);   

    var indices:Vector.<uint> = Vector.<uint>([0, 1, 2]); 
    indexbuffer = context.createIndexBuffer(3);   
    indexbuffer.uploadFromVector (indices, 0, 3);  

    context.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3); //Defines shader input va0 as the position data 
    context.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_3);//Defines shader input va1 as the position data 

有什麼建議?

+0

我認爲至少這一行是錯誤的:「mov vt0.zw,vc0.xyyy」。據我所知,src和dst必須具有相同的類型,但這裏的src是float4,dst是float2。你想在這條線上做什麼? – skozin

回答

0

有許多不一致的,我可以看到:

  1. 你是哪裏在constval設定值是多少?將矢量([constval [0],constval [1],constval [2],constval [3]])賦值給一個變量並在調試器中檢查它。
  2. 數組值是否有x = 0.0和y = 1.0?
  3. 是否在設置頂點緩衝區之前設置常量?有可能你的常量可能被其他渲染代碼覆蓋。
  4. 您的頂點緩衝區是位置和顏色的FLOAT_3格式,但您的頂點着色器要求vec2屬性的位置和vec4的顏色。

這很可能是常數是問題。您可以測試,如果你的常量是在你的位置矢量硬編碼他們指責,像這樣:

  1. 硬編碼常數0.0和1。0

    var vertices:Vector.<Number> = Vector.<Number>([ 
        -0.3,-0.3, 0.0, 1.0, 1, 0, 0, // x, y, z=0.0, w=1.0, r, g, b 
        -0.3, 0.3, 0.0, 1.0, 0, 1, 0, 
        0.3, 0.3, 0.0, 1.0, 0, 0, 1]); 
    
  2. 更改您的頂點數據的大小,以匹配

    const dataPerVertex:int = 7; 
    
  3. 更改您的緩衝區設置,以反映新的大小和偏移量

    context.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_4); //Defines shader input va0 as the position data 
    context.setVertexBufferAt(1, vertexbuffer, 4, Context3DVertexBufferFormat.FLOAT_3);//Defines shader input va1 as the position data 
    
  4. 現在這裏改變你的腳本:

    attribute vec4 pos; 
    
  5. 在這裏:

    gl_Position = pos; 
    

如果您的問題消失,它會提示你沒有發出正確的常數。恢復到您的舊代碼,並確保您正確上傳常量。