2012-03-05 9 views
1

私は2つの頂点バッファを持っているとしましょう。私が描きたいと思っている実際の形を描写し、もう一つは最初のものに影響を与えることができます。頂点シェーダで2番目のVBOをループすることはできますか?

だから、私は実際に行うことができるようにしたいことは、このようなものです:私がやりたいかもしれない物事はsecond_oneのその各点が少しにポイントをドラッグしようとしていること、重力することができ

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 
} 

それに近づいてポイントを調整した後、実際の位置を持つようにマトリックスを適用します。

私はそれが可能であるか、それに近いものが本当に驚きでしょう。しかし、全体のポイントは、2番目のVBOを使用すること、またはvec3型の制服として作ることで、アクセスできるようにすることです。

+0

[配列](http://www.opengl.org/wiki/GLSL_Types#Arrays)に問題がありますか? – KillianDS

+0

非常に速いので、変換のフィードバックを使って1つのVBOを使いたいということです。 VBOをユニフォームとして渡すことができれば、同じデータをユニフォームに転送することを避けることができます。 – widgg

答えて

1

希望するものには3つのオプションがあります。

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

#2および#3は、GL 3.x以上をサポートできるハードウェアでのみ検出されることに注意してください。だからDX10クラスのハードウェア。

+0

ありがとう!最初の選択肢が最も速いのは、それが一定の記憶に入るからです。 2番目のものはおそらく大域的な記憶にあります。ゆっくりとしていますが、私がしようとしているものに近いでしょう。最後のものはテクスチャメモリに入ります! – widgg

関連する問題