1

では、2 つの頂点バッファーがあるとします。1 つは私が描きたい実際の形状を記述し、もう 1 つは最初の形状に影響を与えることができます。

だから、私が実際にできるようにしたいのは、次のようなものです:

uniform VBO second_one;

void main()
{
  for (int i = 0; i < size_of_array(second_one); ++i)
    Do things with second_one[i] to alter the values
  create the output informations
}

私がやりたいことは重力かもしれません.second_oneの各ポイントがポイントを少し近づけてドラッグしようとし、ポイントが調整された後、マトリックスを適用して実際の位置を取得します。

それが可能であるか、それに近いものであることに本当に驚きます。しかし、要点は、2 番目の VBO を使用できるようにすること、またはそれを vec3 タイプのユニフォームとして作成して、アクセスできるようにすることです。

4

1 に答える 1

1

あなたが欲しいもののために、あなたは3つのオプションがあります。

  1. ユニフォームの配列。GLSLを使用するとuniform vec3 stuff[50];。また、GLSLの配列には.length()メソッドがあるため、配列の大きさを確認できます。もちろん、使用するユニフォームの数には制限がありますが、20〜30個を超える必要はありません。それ以上のものを使用すると、パフォーマンスの低下を実感できます。
  2. 均一なバッファオブジェクト。これらは、非ブロックユニフォームよりも少し多くのデータを格納できますが、それでも制限があります。そして、ストレージはバッファオブジェクトから来ています。ただし、ハードウェアによっては、それらへのアクセスは直接ユニフォームへのアクセスよりもわずかに遅くなります。
  3. バッファテクスチャ。これは、バッファオブジェクトをテクスチャにアタッチする方法です。これにより、シェーダー内から大量のメモリにアクセスできます。ただし、注意が必要です。アクセスが高速ではありません。上記のいずれかの方法で期限を迎えることができる場合は、そうしてください。

#2と#3は、GL3.x以降をサポートできるハードウェアでのみ検出されることに注意してください。つまり、DX10クラスのハードウェアです。

于 2012-03-05T17:11:22.190 に答える