OpenGL: Perché le cose sono vincolate invece di essere passate direttamente come parametri?

5

In OpenGL devi associare un oggetto al contesto da utilizzare nelle chiamate successive, invece di usarlo come argomento in quelle chiamate.

Ad esempio, in OpenGL scrivi questo

glGenBuffers( 1, &vbo );
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, verts.size(), verts.data(), GL_STATIC_DRAW );

Invece di qualcosa di simile:

glGenBuffers( GL_ARRAY_BUFFER, 1, &vbo );
glBufferData( vbo, verts.size(), verts.data(), GL_STATIC_DRAW );

Mi chiedo, qual è stata la ragione di questa decisione? C'era una ragione tecnica per questo?

    
posta Hedede 17.11.2016 - 10:01
fonte

1 risposta

7

Perché legacy. Quasi tutte le funzionalità del moderno opengl sono nate come un'estensione (opzionale) che doveva funzionare correttamente quando è lì, ma non utilizzata. Ciò significa che molte delle funzionalità sono basate sullo stato persistente.

Le versioni opengl più vecchie che avevano glDrawArrays non avevano nemmeno i buffer, invece il void* puntatore in glVertexAttribPointer (allora erano in realtà glVertexPointer / glNormalPointer / ...) sempre riferiti allo spazio utente memoria invece di un offset nel buffer associato a GL_ARRAY_BUFFER . Per far funzionare i buffer, devono creare i punti di collegamento per aggiungere il buffer associato come parametro nascosto ai metodi esistenti. Da lì è logico utilizzare quel bind point anche per i nuovi metodi per mantenere l'uniformità.

Un sacco di opengl è bind-to-edit, che Khronos riconosce è un cattivo design delle API. Questo è il motivo per cui le estensioni DSA sono diventate parte dell'API di base da 4.5. Questi ti permettono di fare glNamedBufferData( vbo, verts.size() * sizeof(verts[0]), verts.data(), GL_STATIC_DRAW ); per creare e caricare la tua mesh.

    
risposta data 17.11.2016 - 12:36
fonte

Leggi altre domande sui tag