0

このシェーダーを変換しようとしています:

<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

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

助言がありますか?

4

1 に答える 1

0

私が見ることができるいくつかの矛盾があります:

  1. constval のどこに値を設定していますか? Vector.([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;
    

問題が解決した場合は、正しい定数を送信していないことが示唆されます。古いコードに戻り、定数を適切にアップロードしていることを確認してください。

于 2013-07-02T17:29:53.817 に答える