2012-04-30 14 views
1

は正確に行います。のOpenGL ES glPushClientAttrib

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 

glPushClientAttribは、OpenGL ESには存在しないと。私はOpenGLステートマシンの状態を保存していることを知っていますが、GL_CLIENT_VERTEX_ARRAY_BITフラグの正確な仕組みを見つけることはできません。

私は最後の頂点配列ポインタを保存すると思いますか?

詳細な調査では、VBO(頂点バッファオブジェクト)が一般的に使用されています。これにより、glVertexPointerのポインタフィールドがオフセットに変更されます。 glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)はこれとどのように動作しますか(および関連する機能glBindBuffer,glBufferData)?

EDIT: だけ明確にする:

gl*Pointer() #1 
glPushClientAttrib(*) 
gl*Pointer() #2 
glPopClientAttrib() <-- this is effectively calling #1 again or resetting to whatever #1 was 

答えて

4

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)は、すべての頂点配列属性のすべてのクライアント側の状態が保存されます。したがって、glEnableClientState/glDisableClientState関数とgl * Pointer関数で設定したものすべて。実際のデータはコピーされません。また、glBindBuffer/glBufferDataで設定されたものは、サーバ側の状態であるため保存されません。おそらく通常のOpenGL(OpenGL ESのglPushAttribもありません)のglPushAttribのenumがあります。

ここでVBOと頂点配列の違いは、VBOがグラフィックメモリに実際のデータを持ち、頂点配列を描画するときにグラフィックスカードにストリーミングする必要があることです。ただし、VBOを使用している場合でも、ポインタと有効フラグはglPushClientAttribで保存されます。

OpenGL ESの場合、最後の状態に戻る場合は、自分で状態を把握する必要があります。または、それを終了した後ですべてをデフォルト値に設定します(使用可能なすべての頂点配列に対してglDisableClientを呼び出すだけで十分です)。

+0

クール!私の元の質問のgl * Pointerの振る舞いについてのちょっとした説明。 – nehz

+0

はい、元の状態をglPushClientAttribの前からリセットしています。したがって、#1の頂点配列属性は設定され、#2の属性は(たとえそれらが異なる関数であっても)設定されません。 –