12 Stimmen

Wie erstellt man ein FBO mit Stencil-Puffer in OpenGL ES 2.0?

Ich brauche einen Schablonenpuffer auf dem 3GS, um flächige Schatten zu rendern, und Polygon Offset wird nicht perfekt funktionieren, hat immer noch Z-Kampf Problem. Also benutze ich Schablonenpuffer, um den Schatten zu korrigieren, es funktioniert auf dem Win32-Gles2 Emulator, aber nicht auf dem iPhone. Nachdem ich einen Post-Effekt auf die ganze Szene hinzugefügt. Die Schablone Puffer wird nicht funktionieren, auch auf win32 gles2 Emulator.

Und ich habe versucht, einen Schablonenpuffer an FBO anzuhängen, aber der Bildschirm wird schwarz. Hier ist mein Code,

   glGenRenderbuffers(1, &dbo); // depth buffer
   glBindRenderbuffer(GL\_RENDERBUFFER, dbo);
   glRenderbufferStorage(GL\_RENDERBUFFER, GL\_DEPTH\_COMPONENT24\_OES,
widthGL, heightGL);

   glGenRenderbuffers(1, &sbo); // stencil buffer
   glBindRenderbuffer(GL\_RENDERBUFFER, sbo);
   glRenderbufferStorage(GL\_RENDERBUFFER, GL\_STENCIL\_INDEX8, widthGL,
heightGL);

   glGenFramebuffers(1, &fbo);
   glBindFramebuffer(GL\_FRAMEBUFFER, fbo);

   glFramebufferTexture2D(GL\_FRAMEBUFFER, GL\_COLOR\_ATTACHMENT0,
GL\_TEXTURE\_2D, tex, 0);
   glFramebufferRenderbuffer(GL\_FRAMEBUFFER, GL\_DEPTH\_ATTACHMENT,
GL\_RENDERBUFFER, dbo);
   glFramebufferRenderbuffer(GL\_FRAMEBUFFER, GL\_STENCIL\_ATTACHMENT,
GL\_RENDERBUFFER, sbo); // this make the whole screen black.

Der eglContext wird mit STENCIL_SIZE=8 erstellt, er funktioniert ohne RTT.

Ich habe versucht, den RenderbufferStorage sowohl für den Tiefenpuffer als auch für den Schablonenpuffer zu ändern, aber keiner von ihnen funktioniert.

Gibt es etwas, das ich übersehen habe? Ist der Schablonenpuffer mit dem Tiefenpuffer? (Ich kann Dinge wie GL_DEPTH24_STENCIL8 nicht finden ...)

15voto

Anton Punkte 5761

In OpenGL ES 2.0 auf iOS müssen Sie einen kombinierten Tiefen- und Schablonen-Renderbuffer mit GL_DEPTH24_STENCIL8_OES erstellen und ihn dann dem gebundenen Framebuffer als GL_DEPTH_ATTACHMENT und GL_STENCIL_ATTACHMENT anhängen.

glGenRenderbuffers(1, &depthStencilRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);

3voto

Zennichimaro Punkte 4976

Nur ein Hinweis: Wenn Sie GLKView verwenden, ist es so einfach wie

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

wo die Aussicht ist: GLKView*

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X