2012-06-18 10 views
6

Jedes Mal, nachdem ich glClear(GL_COLOR_BUFFER_BIT); aufrufen, erhalte ich den OpenGL-Fehler "ungültiger Framebuffer-Betrieb".OpenGL ungültiger Framebuffer-Vorgang nach glClear (GL_COLOR_BUFFER_BIT);

Der Anruf scheint gut zu funktionieren, und nichts scheint falsch. Ich rufe glClear(GL_COLOR_BUFFER_BIT); erste Sache in der ::paintGL() Methode.

Huh? Sollte ich diesen Fehler einfach ignorieren?

+0

Haben Sie eine klare Farbe eingestellt? – cmannett85

+0

@ cbamber85: Nein, aber ich habe gerade eine 'glClearColor (0,0,0,0)' eingefügt, um zu sehen, ob es einen Unterschied macht, und die andere ist immer noch da. – houbysoft

+0

Sehr wahrscheinlich wurde der Fehler durch einen vorherigen OpenGL-Aufruf ausgelöst, den der Code nicht überprüft hat. Stellen Sie sicher, dass alle OpenGL-Vorgänge durch die Fehlerprüfung geschützt sind. –

Antwort

4

Meine beste Vermutung ist, dass Ihr Framebuffer nicht vollständig ist und der Aufruf glClear auf einem unvollständigen Framebuffer wirft den Fehler.

Überprüfen Sie den Status des Framebuffers mit glCheckFramebufferStatus und stellen Sie sicher, dass es zurückgibt.

+0

Ich habe den gleichen Fehler wie das Original-Poster, und ich verifizierte meine Framebuffers ** sind ** abgeschlossen. Ich benutze OpenGL-ES3 auf dem iPhone und die Textur, die gelöscht wird, ist eine sRGB-Textur - wenn ich diese auf eine normale "rgb" -Textur umstelle, stoppt der Fehler "ungültiger Framebuffer-Betrieb" auf glClear. Aus den Informationen, die das OP liefert, kann ich nicht sagen, ob dies in diesem Fall das gleiche ist, aber in beiden Fällen kann dies einen Hinweis für jemand anderen geben, der auf dieses Problem stößt. – kalmiya

+0

Update: in meinem Fall srgb8 wird nicht als "ColorRenderable" unterstützt (mit GL_SRGB8_ALPHA8 als Alternative funktioniert). Wie James sagte, sollte glCheckFrameBufferStatus ** einen Fehler zurückgegeben haben, aber das ist nicht der Fall, was bedeutet, dass es einen Fehler in der OpenGL-Implementierung gibt, die ich verwende (OpenGL-ES3 in xcode 7.3 auf osx). – kalmiya

2

Ich hatte dieses Problem auf osx mit NSOpenGLView mit einem CVDisplayLink, um den Render-Callback auszulösen.

für Sie verhandelten NSOpenGLView warten voll vor dem Start-Wiedergabe angezeigt werden, das heißt:

-(void)viewDidAppear { 
    [super viewDidAppear]; 

    CVDisplayLinkStart(_displayLink); 
} 

es in viewDidLoad tun zu früh.

Verwandte Themen