2011-12-18 9 views
10

私は私が学んだと思いますが、わからない程度だいくつかのことをレイアウトしたいと思います:glEnableClientState(glVertexAttribPointerなど)

  • VBOs移動する方法です。それらはglGenBuffersglBufferDataで作成されています。最大限の柔軟性を
  • 、それは一般的な頂点ではなくglVertexglNormalなどよりも、glVertexAttribPointerでシェーダに属性を渡すのがベストです。..
  • glDrawElementsは、効率的に共有のたくさんのジオメトリをレンダリングするために頂点バッファとインデックスバッファを使用することができますランドスケープメッシュなどの頂点。

ここまでのことがすべて正しいと仮定すると、ここに私の質問があります。最新のOpenGLについて読んだチュートリアルのすべては、glEnableClientStateを完全に省略しています。しかし、OpenGLのmanページはglEnableClientStateせず、glDrawElementsは何もしないだろうと言う:

http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

キー通路がある:「GL_VERTEX_ARRAYが有効になっていない場合、幾何学的プリミティブが構築されていません」

これは、次の質問に私をリード:チュートリアルの

  • なしglDrawElementsを呼び出す前にglEnableClientStateを使用していません。これは、マニュアルページが間違っているか、古くなったことを意味しますか?
  • GL_VERTEX_ARRAYは、glVertexPointerを使用する場合に有効にするものと思われ、同様にGL_NORMAL_ARRAYglNormalPointerを使用するなどのようになります。しかし、私がこれらの関数を使用しておらず、代りにglVertexAttribPointerで一般的な頂点属性を使用しているのであれば、なぜGL_VERTEX_ARRAYを有効にする必要がありますか?

答えて

20

GL_VERTEX_ARRAYが有効でない場合、ジオメトリプリミティブは構築されません。 manページが間違っですのでです

。マニュアルページはGL 2.1をカバーしています(それでもやはり間違っています)。何らかの理由で、マニュアルページを更新している人は古いGLバージョンをバグ修正のために更新することを拒否します。

GL 2.1では、汎用属性インデックス0またはGL_VERTEX_ARRAYのいずれかを使用する必要があります。 GL 3.1以降では、特定の属性インデックスを使用する必要はありません。

これは、3.1より前のGLバージョンでは、すべての配列レンダリング関数が、即時モードベースのレンダリングを使用したglArrayElementの呼び出しに関して定義されていたためです。つまり、何かが必要なことを意味する頂点。即時モードでは、glVertex*()を呼び出すと頂点の位置が設定されるだけでなく、他の属性とともに頂点が送信されることにも注意してください。 glVertexAttrib*(0, ...)を呼び出すことも同じことです。そのため、旧バージョンでは、属性0またはGL_VERTEX_ARRAYのいずれかを使用する必要があります。

GL 3.1+では、一度イミディエイトモードを解除すると、配列レンダリングを別に指定する必要がありました。そのため、属性0を使用することに自分自身を限定する必要はありませんでした。

コアGL 3.3用のAPIドキュメントが必要な場合は、the actual API docs for core GL 3.3をご覧ください。正直言って、私はちょうどあなたが正確な情報をしたい場合は、仕様を見てみましょう。これらのドキュメントには、多くの誤解があります。そしてそれらは実際にはwikiページではないので、その情報は決してが訂正されます。

+0

"GL 2.1では、汎用属性インデックス0"を使用する必要があります。つまり、GLSLプログラムが属性0を使用していない場合、 "幾何プリミティブは作成されません"というようなものです。ところで、私はMac互換のために2.1を使用しています、そして私のプログラムはglEnableClientStateなしで正常に動作しています。しかし、私はジェネリックアトリビュート0を使用しているという事実を知っています。なぜなら、私のジオメトリがまだレンダリングされている理由がわかっているからです。 – rlkw1024

+0

OpenGLのドキュメントを更新したいと思っています... – Tara

1

VBOSが行く方法です。それらはglGenBuffersと glBufferDataで作成されています。

VBOは、高性能アプリケーションでよく使用されます。最初にもっと簡単なことをしたいかもしれません。頂点配列はすぐに始めるための良い方法です。 VBOは頂点配列の最上部に位置するため、VBOに切り替えるときには同じコードを使用することになります。まず、頂点配列またはインデックス付き頂点配列を使用してテストを実行するとよいでしょう。最大限の柔軟性を

は、それは...一般的な頂点がglVertexAttribPointerはなく、glVertex、glNormal、 などとのシェーダに 属性渡すために良い方法があります

をお勧めします。

glDrawElementsは、 風景メッシュなどの共有頂点のたくさんのジオメトリをレンダリング効率 に頂点バッファおよびインデックスバッファと一緒に使用することができます。

おそらく。しかし、頂点が本当に共有されていることを確認する必要があります。同じ位置にあり、異なる標準(例えば、平らな陰影)を有する頂点は、真に共有されない。

+0

すべての有用な情報ですが、実際に*質問*には答えません。 –

+0

はい、ニコールは正しいです。しかし、情報をありがとう!間違いなく助けになります。私はVBOとglVertexAttribPointerを持っているので、それらに固執します。 glDrawElementsについてのあなたの主張はよく理解されています - 私は、このアプローチが機能するためには、どのようにvertsがまったく同じ属性を持つ必要があるのか​​を理解しています。 – rlkw1024

+0

OH、右、質問。 「私がこのことについて間違っていると誰かが私に知らせることができたかもしれない」と私は分断されていた。ごめんなさい。 – Gravity

2

最初の3点が正しいです。そしてあなたの質問の最後の半分に答えるために、最新のOpenGLにはglEnableClientStateを使わないでください。コーディングを開始してください!

関連する問題