2

私はいくつかのOpenGLコードをOpenGLESに移植することを検討していて、このコードが正確に何をするのか疑問に思っていました。

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)

glPushClientAttribはOpenGLESに存在しないため。OpenGLステートマシンの状態を保存することは知っていますが、GL_CLIENT_VERTEX_ARRAY_BITフラグの正確なメカニズムを見つけることができないようです。

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

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

編集:明確にするために:

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

1 に答える 1

5

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

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

OpenGL ESの場合、最後の状態に戻りたい場合は、自分で状態を追跡する必要があります。または、終了後にすべてをデフォルト値に設定することをお勧めします(有効なすべての頂点配列に対してglDisableClientを呼び出すだけで十分です)。

于 2012-04-30T12:30:02.220 に答える