2012-06-18 8 views
6

Ogni volta che chiamo glClear(GL_COLOR_BUFFER_BIT);, ottengo l'errore OpenGL "operazione framebuffer non valida".Operazione framebuffer non valida OpenGL dopo glClear (GL_COLOR_BUFFER_BIT);

La chiamata sembra funzionare correttamente e nulla sembra sbagliato. Io chiamo glClear(GL_COLOR_BUFFER_BIT); la prima cosa nel metodo ::paintGL().

Huh? Dovrei semplicemente ignorare questo errore?

+0

Hai impostato un colore chiaro? – cmannett85

+0

@ cbamber85: no, ma ho appena inserito un 'glClearColor (0,0,0,0)' per vedere se ha fatto qualche differenza, e l'altro è ancora lì. – houbysoft

+0

Molto probabilmente l'errore è stato sollevato da una precedente chiamata OpenGL che il codice non ha verificato. Verificare che tutte le operazioni OpenGL siano protette dal controllo degli errori. –

risposta

4

La mia ipotesi migliore è che il framebuffer non sia completo e chiamare glClear su un framebuffer incompleto sta generando l'errore.

Controllare lo stato del framebuffer utilizzando glCheckFramebufferStatus e assicurarsi che restituisca GL_FRAMEBUFFER_COMPLETE.

+0

Ho ricevuto lo stesso errore del poster originale e ho verificato che i miei framebuffer ** sono ** completi. Sto eseguendo OpenGL-ES3 su iPhone e la texture che viene cancellata è una texture sRGB - quando la si modifica in una normale "rgb" -texture, l'errore "operazione framebuffer non valida" su glClear si interrompe. Dalle informazioni fornite dall'OP non posso dire se questo è lo stesso in questo caso, ma in entrambi i casi questo può fornire un suggerimento a qualcun altro che si trova in questo problema. Aggiornamento – kalmiya

+0

: nel mio caso srgb8 non è supportato come "ColorRenderable" (usando GL_SRGB8_ALPHA8 come alternativa funziona). Come ha detto James, glCheckFrameBufferStatus ** dovrebbe avere restituito un errore, ma non lo fa, il che significa che c'è un bug nell'implementazione openGL che sto usando (OpenGL-ES3 in xcode 7.3 su osx). – kalmiya

2

Avevo questo problema su osx utilizzando NSOpenGLView con un CVDisplayLink per attivare la richiamata di rendering.

Assicurarsi di attendere il NSOpenGLView di essere pienamente visualizzata prima del rendering di iniziare, vale a dire:

-(void)viewDidAppear { 
    [super viewDidAppear]; 

    CVDisplayLinkStart(_displayLink); 
} 

Farlo in viewDidLoad è troppo presto.