2011-08-04 10 views
2

は、これらの線は、メッシュを描画する前に使用されています。 glEnableClientState(GL10.GL_VERTEX_ARRAY); glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);クライアント状態を有効にする目的は何ですか?私が見てきたすべての例で

、時にはglEnableClientState(GL10.GL_NORMAL_ARRAY);

そしてこれらは、常に各描画呼び出しの終わりに再び無効になっていますメッシュ。

私は彼らが実際に何をしているのか、なぜそれを無効にしたいのか理解していません。私は配列から三角形を描画したり、テクスチャを使用したり、ライティングを使用している場合は、おそらくそれらをオンにする必要があることを知っています。しかし、私はいつそれらをオフにする必要があるのか​​分かりません。

あなたがそうする必要がない場合は、シーンの各メッシュに対してこれらを無効にして再度有効にしない方がよいと思います。あなたはいつもそれらを放置することができますか?どのような状況でそれらを無効にする必要がありますか?

私はこれらのクライアント状態の実際の意味についての説明を見つけることができませんでしたので、どこで安全にコードをオンまたはオフにできるかはわかりません。

答えて

4

いつでもそれらを残すことができますか?

はい、必要な場合、すべてのプリミティブが有効にしているすべての配列を使用している場合。

どのような状況でそれらを無効にする必要がありますか?ない次の図面まで又は混乱を破壊するために

たとえば、ノーマルを使用するプリミティブがあるとします。glEnableClientState(GL_NORMAL_ARRAY)を呼び出して有効にし、OpenGLに普通のデータがglNormalPointer()であることを伝えます。 GL_NORMAL_ARRAYを無効にしないと、あなたの次のプリミティブは、あなたの前のプリミティブと同じ通常の配列を使用します。次の来るべきプリミティブが法線を使用しない場合、これは結果をもたらすかもしれません。

したがって、プリミティブの描画が完了したときにOpenGLの状態を復元することをお勧めします。つまり、すべてのプリミティブが有効になっているすべての配列を使用している場合は、アプリケーションを実行している間にGL_TEXTURE_2Dを有効にしたままにしておくと、それらを有効にしておくことができます。それはです。私は頻繁にテクスチャを使用することを知っていますし、すべてのオブジェクトの描画呼び出しでそれを有効/無効にする理由はありません。アプリケーションのパフォーマンスが低下します。

+0

テクスチャのようなものです。ポインタが有効になりますが、実際の配列を設定する別の行があります: 'glTexCoordPointer(2、GL10.GL_FLOAT、0、textureBuffer);'。実際には、別のバッファーに更新している限り、メッシュからメッシュに移動することはできますか? – Tenfour04

+0

@ TenFour04:はい。 – Wroclai

2

glEnableClientState(GL_VERTEX_ARRAY)

あなたは上記のように宣言すると、それが頂点配列

から頂点を使用するためにOpenGLを可能それ以外のOpenGLいけないが、それはなるように頂点を表示するために使用しているものの配列を知っていますそれは何も表示されません

関連する問題