2010-04-12 12 views
9

Ho bisogno del buffer stencil su 3GS per rendere l'ombra planare e l'offset del poligono non funziona come prefetto, ha ancora problemi di z-fighting. Quindi io uso il buffer di stencil per rendere l'ombra corretta, funziona sull'emulatore win32 gles2 , ma non su iPhone. Dopo ho aggiunto un effetto post all'intera scena . Il buffer degli stencil non funzionerà nemmeno con l'emulatore gles2 win32.Come creare un FBO con buffer stencil in OpenGL ES 2.0?

E ho provato ad associare un buffer stencil all'FBO, ma lo schermo diventa nero nero. Ecco il mio codice,

 
    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. 

L'eglContext viene creato con STENCIL_SIZE = 8, che funziona senza un RTT.

Ho provato a modificare il RenderbufferStorage per il buffer di profondità e il buffer di stencil , ma nessuno di questi funziona.

C'è qualcosa che ho perso? Il buffer stencil include un buffer di profondità ? (Non riesco a trovare le cose come GL_DEPTH24_STENCIL8 ...)

+0

Si potrebbe verificare il valore restituito da glCheckFramebufferStatus() per ulteriori informazioni –

+0

È COMPLETO, nessun errore segnalato. – Xiaobin

+0

Ho trovato GL_OES_packed_depth_stencil definito in OpenGLES.framework. Ma non l'ho trovato nell'emulatore PVR OpenGLES2 su Win32 :(Cercherò di farlo funzionare sul dispositivo domani – Xiaobin

risposta

13

In OpenGL ES 2.0 su iOS, è necessario creare una profondità combinato e stencil renderbuffer utilizzando GL_DEPTH24_STENCIL8_OES, e poi collegarlo al framebuffer legato sia come GL_DEPTH_ATTACHMENT e GL_STENCIL_ATTACHMENT.

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); 
+2

Mi chiedo perché forniscano anche 'GL_STENCIL_INDEX8' e' GL_STENCIL_INDEX8_OES' se questi non sono effettivamente implementati e non funzionano – bobobobo

+3

grazie! ma dove hai ottenuto queste informazioni? – MatterGoal

+0

@bobobobo Potrebbero funzionare, se non vuoi usare il depth/stencil buffer allo stesso tempo – heLomaN

3

Solo una nota, se si sta utilizzando GLKView, è semplice come

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

dove vista è: GLKView*