2010-04-12 13 views
9

Necesito el cliché del esténcil en 3GS para renderizar la sombra planar, y el desplazamiento del polígono no funcionará correctamente, todavía tiene un problema de lucha z. Así que uso stencil buffer para hacer la sombra correcta, funciona en el emulador win32 gles2 , pero no en el iPhone. Después agregué un efecto de publicación a toda la escena . La memoria intermedia de esténcil no funcionará incluso en el emulador win32 gles2.¿Cómo crear un FBO con buffer de estarcido en OpenGL ES 2.0?

Y traté de adjuntar un buffer de esténcil a FBO, buf la pantalla se convierte en negro. Aquí está mi código,

 
    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. 

El eglContext se crea con STENCIL_SIZE = 8, funciona sin un RTT.

Intenté cambiar RenderbufferStorage para el buffer de profundidad y stencil buffer, pero ninguno funciona.

¿Hay algo que me he perdido? ¿El paquete de memoria de la plantilla tiene buffer de profundidad? (No puedo encontrar cosas como GL_DEPTH24_STENCIL8 ...)

+0

Se puede comprobar el valor de retorno de glCheckFramebufferStatus() para obtener más información –

+0

Está COMPLETO, no se informó de ningún error. – Xiaobin

+0

Encontré GL_OES_packed_depth_stencil definido en OpenGLES.framework. Pero no lo encontré en el emulador PVG OpenGLES2 en Win32 :(Intentaré que funcione en el dispositivo mañana. – Xiaobin

Respuesta

13

En OpenGL ES 2.0 en iOS, usted tiene que crear una profundidad combinada y de la plantilla renderbuffer usando GL_DEPTH24_STENCIL8_OES y, a continuación, adjuntarlo al uso de este dispositivo enlazado ya que tanto GL_DEPTH_ATTACHMENT y 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

Me pregunto por qué incluso proporcionan 'GL_STENCIL_INDEX8' y' GL_STENCIL_INDEX8_OES' si estos no se implementan realmente y no funcionan. – bobobobo

+3

¡gracias! pero ¿de dónde sacaste esta información? – MatterGoal

+0

@bobobobo Podrían funcionar, si no quieres usar el buffer de profundidad/esténcil al mismo tiempo – heLomaN

3

Sólo una nota, si está utilizando GLKView, es tan simple como

view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

donde la vista es: GLKView*

Cuestiones relacionadas