2013-02-05 151 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; 
    

如果您的问题消失,它会提示你没有发出正确的常数。恢复到您的旧代码,并确保您正确上传常量。