2012-09-18 22 views
5

Desidero scrivere una funzione di utilità generica che utilizzerà un oggetto FrameBuffer OpenGL per creare una trama che può essere utilizzata da qualche programma OpenGL per qualsiasi scopo che un programmatore di terze parti vorrebbe.Ripristino stato OpenGL

consente di dire per la quota argomento della funzione appare come

void createSpecialTexture(GLuint textureID) 
{ 
    MyOpenGLState state; 
    saveOpenGLState(state); 
    setStateToDefault(); 
    doMyDrawing(); 
    restoreOpenGLState(state); 
} 

Cosa dovrebbe MyOpenGLState, saveOpenGLState(state), setStateToDefault() e restoreOpenGLState(state) guarda come per garantire che doMyDrawing si comporteranno correttamente e che nulla di ciò che faccio in doMyDrawing influenzerà qualsiasi altra cosa che uno sviluppatore di terze parti potrebbe fare?

Il problema che mi ha morso è che OpenGL ha un sacco di stato implicito e non sono sicuro di catturarlo tutto.

Aggiornamento: La mia preoccupazione principale è OpenGL ES 2.0, ma ho pensato di fare la domanda più in generale

risposta

1

Non utilizzare un oggetto framebuffer per il rendering della texture. Piuttosto, crea un nuovo EGLContext ed EGLSurface. È quindi possibile utilizzare eglBindTexImage per trasformare EGLSurface in una texture. In questo modo si garantisce che lo stato da doMyDrawing non inquinerà il gl principale Contesto e viceversa.

0

Per quanto riguarda il salvataggio e il ripristino, glPushAttrib e glPopAttrib ti porterà molto lontano.

Non è tuttavia possibile ripristinare GL in uno stato predefinito. Tuttavia, poiché doMyDrawing() utilizza e/o modifica solo lo stato che dovrebbe essere noto a te, puoi semplicemente impostarlo sui valori che ti servono.

+2

non sono quelli deprecati? – KillianDS

+0

La domanda riguarda principalmente OpenGL ES 2.0, che non fa parte di 'glPushAttrib' o' glPopAttrib' (vedere http://www.khronos.org/opengles/sdk/docs/man/). – Caterpillar

0

che dipende molto da quello che fate sul vostro yo doMyDrawing();, ma fondamentalmente è necessario ripristinare tutto (tutti gli stati), che si cambia in questa funzione. Senza dare un'occhiata a ciò che accade all'interno di doMyDrawing(); è impossibile indovinare cosa è necessario ripristinare.

Se modifiche sulla matrice di proiezione o modelview vengono eseguite all'interno doMyDrawing(), ricordarsi di andare inizialmente spingere alla matrice GL_PROJECTION e GL_MODELVIEW attraverso glPushMatrix e ripristinarle dopo il disegno tramite glPopMatrix. Qualsiasi altro stato che si modifica può essere push e pop anche se glPushAttrib e l'attributo right. Ricorda anche di slegare qualsiasi texture, FBO, PBO, ecc. Che potresti legare all'interno di doMyDrawing();

+1

Nota che glPush/Pop * non esistono in OpenGLES 2.0 – Tim

Problemi correlati