6

学習目的で、3つの方法を使用して球を描くことにしました

  1. ディスプレイリスト
  2. Voa Vbo(GL_TRIANGLE_STRIPE)
  3. Vao VboとIbo(GL_TRIANGLES)

iboを使用するとプログラムの実行が速くなると読みましたが、これは本当に本当ですか?100スライスと100スタックの球の場合、2番目の方法では40400の頂点が生成され、3番目の「のみ」は19802になります。これにより、32バイト=659136バイトごとに20598の頂点が節約されます。

  1. verticesSize =(slices * 4)*(stacks + 1);

  2. IBO verticesSize =(slices * 2)*(stacks-1)+2;

ただし、この場合は118800(すべての面を作成するために必要なインデックスの数)* 4(unsignedintのサイズ)=475200バイトのインデックスの配列を作成する必要があります。2番目の方法では15fpsで1000個の球がレンダリングされますが、3番目の方法ではわずか6pfsで1000個の球がレンダリングされます。

  1. インデックス配列をGL_TRIANGLESからGL_TRIANGLE_STRIPに変換すると、2番目の方法よりも効率的な方法が提供されますか?
  2. iboを使用して球をレンダリングすることは悪い考えですか?
  3. なぜ遅いのですか?インデックス配列の順序は重要ですか?

または多分私は私のコードを完全に間違って書いたので、なぜそれはとても苦労します:(誰かが興味を持っているなら、ここに私のコードがありますhttp://pastebin.com/raw.php?i=74jLKV5M

4

1 に答える 1

1

glDrawElements 呼び出しが間違っています。count パラメータは、4 の倍数ではなく、インデックスの数である必要があります。それを変更してみてください。

トライアングル ストリップの代わりにインデックスを使用すると、ほとんどの場合高速になります。実際、ドライバーがバックグラウンドでインデックスを使用してトライアングル ストリップをレンダリングしていたとしても、私は驚かないでしょう。

また、コメントで述べたように、インデックスの順序がパフォーマンスに影響を与える可能性があります。ただし、使用している球体では、使用しているインデックス作成パターンがおそらく最適であり、それでも違いはわずかです。

于 2012-09-19T14:42:57.040 に答える