0

頂点のデータ セットごとに合計8 個の float値しか渡せないということですか?

これは、次のいずれかしか持てないということですか?

  • FLOAT_4の2 つの入力。
  • FLOAT_2の4 つの入力。
  • FLOAT_1の8 つの入力。
  • 合計で8 つの float値になる混合物はありますか?

これは事実ですか?もしそうなら、ドキュメントで8つの入力を使用できると言うのは本当に誤解を招くからです。

データを正しくフォーマットしていないために問題が発生している可能性がありますが、次のようにverticesごとに9 個の floatを使用しようとしています。

  • va0 は FLOAT_4 になりオフセットは0に設定されます。
  • va1はFLOAT_4になり、オフセットは4に設定されます。
  • va2はFLOAT_1になり、オフセットは8に設定されます。

しかし、この実験では画面には何も表示されません。VertexShader の入力制限を超えていますか?

4

2 に答える 2

0

制限は頂点のサイズではなく、GLSLシェーダーの頂点属性の数にあると思います。

私はStage3Dにあまり精通していませんが、これはOpenGLの質問です。純粋なOpenGLでは、関数を使用して頂点属性を有効にする必要がありますglEnableVertexAttribArray(int)。この制限が意味するのは、このメソッドの有効な数値は0から7のみであるということです。

独自のコードと照合するのが簡単な方法で、これは頂点シェーダーでは許可されていません。

attribute vec4 in_one;
attribute vec4 in_two;
attribute vec3 in_three;
attribute vec2 in_four;
attribute vec4 in_five;
attribute vec3 in_six;
attribute vec4 in_seven;
attribute vec2 in_eight;
attribute vec4 in_nine;
...
void main()
{
    ...
}

注:属性のサイズ(vec2-4)は重要ではありません。9つの属性があるという事実は、制限を超えています。

于 2011-12-31T04:01:10.237 に答える
0

さて、問題が見つかりました。

この形式から変更を加えるなど、頂点データ (頂点ごと) にさらに値を定義する場合:

position: x  va0.x
          y  va0.y
          z  va0.z
          w  va0.w
color:    r  va1.r
          g  va1.g
          b  va1.b
          a  va1.a

このようなものに:

position: x  va0.x
          y  va0.y
          z  va0.z
          w  va0.w
color:    r  va1.r
          g  va1.g
          b  va1.b
          a  va1.a
uv:       u  va2.x
          v  va2.y

素晴らしい...ミックスに新しいレジスタを追加しました。しかし、あなたがしなければならないことは次のとおりです。

  • 次の場所に正しい値を渡すようにしてください。

    context3D.createVertexBuffer(numOfVertices, vertexDataLength);と...

    uploadFromVector(_vertexData, 0, numOfVertices);

  • 次の呼び出しで正しいオフセットを設定してください。

    context3D.setVertexBufferAt(2, vertexBuffer, 8, Context3DVertexBufferFormat.FLOAT_4);

  • 最後になりましたが、(まさに私が見逃していたものです)... シェーダーでそのレジスターを使用してください!

新しい頂点属性を追加しても、AGAL コードで使用しない場合は、レンダリングされません!

これにより、他の人がシェーダーのどこで問題を起こしたのか疑問に思う時間を節約できることを願っています!

注: 当たり前のことですが、何かを作成した場合、とにかくそれを使用しないのはなぜですか? 以前のシェーダーがまだ余分なデータで機能するかどうかをテストしていました。ミックスで新しい頂点属性 (va2) を割り当てない限り、そうです。したがって、テストする場合setVertexBufferAt(...)は、実際に使用する入力レジスタのみを使用してください。

于 2011-12-31T05:32:22.597 に答える