2012-07-08 34 views
5

Intento utilizar el "búfer del esténcil" para mostrar una parte de mi renderizado a partir de una textura, pero mi renderización se muestra sin ningún efecto de máscara.Usar el búfer del esténcil con iOS

Es para un proyecto 2D IOS, con OpenGL ES 2.0 Esta es la parte en cuestión de mi código:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
glEnable(GL_STENCIL_TEST); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _maskTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 


// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glBindTexture(GL_TEXTURE_2D, _viewTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Cualquier ayuda sería muy apreciada!

(Como es habitual para un desarrollador francés, lo siento por mi Inglés!)

precisión: "_maskTexture" es una imagen en blanco y negro &.


Solución:


I finnaly solucionado mi problema con las indicaciones de rotoglub y tim. Gracias a los dos.

1/La memoria intermedia de esténcil no se ha creado correctamente. Debe ser inicializado como esto:

glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, 
          GL_DEPTH24_STENCIL8_OES, 
          backingWidth, 
          backingHeight); 

Es la razón principal por la cual mi traducción no fue afectada por la máscara.

2/Para poder usar una textura como máscara, reemplacé el color negro con un canal alfa y habilité la mezcla en mi renderizado.

Mi código de renderizado final es el siguiente:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 

glClearStencil(0); 
glClearColor (0.0,0.0,0.0,1); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glEnable(GL_STENCIL_TEST); 
glEnable(GL_ALPHA_TEST); 
glBlendFunc(GL_ONE, GL_ONE); 
glAlphaFunc(GL_NOTEQUAL, 0.0); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _mask); 
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 

// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glDisable(GL_STENCIL_TEST); 
glDisable(GL_ALPHA_TEST); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
+1

Sólo que describen su problema como * no funcionan * no es realmente útil. Pero supongo que su problema es el que se resuelve en esta otra pregunta: http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengl-es-2- 0 – rotoglup

+0

Gracias por tu comentario. Por "no funciona", quise decir que "_viewTexture" se mostraba sin ningún efecto de máscara de "_maskTexture". Trataré de ser más específico en el futuro. En cuanto a la publicación que mencionaste, ya la leí, pero si no me equivoco, resolvió su problema con un sombreador y abandonó el búfer de esténcil. – EricD

+1

Al leer su publicación de solución, creo que todavía tiene problemas (quizás por el momento ocultos): la prueba del estarcido está desactivada para su segundo pase de representación, por lo que esta prueba no puede provocar el enmascaramiento que observa. Además, la mezcla no debería ser útil para la prueba de esténcil, solo la prueba alfa. Creo que observas el enmascaramiento que querías, pero probablemente por otra razón, ese estarcido. – rotoglup

Respuesta

1

Simplemente, el problema es que sólo estás dibujando una textura a la escena sin hacer ninguna prueba de lo que hay en la textura. El stencil buffer no se preocupa por los colores de la textura, sólo chequea:

Did you draw a fragment ? (Update stencil buffer) : (Don't update stencil buffer);

que está dibujando un fragmento para cada píxel de la textura, por lo que cualquier efecto de máscara en la textura es inútil.

Si desea enmascarar con una textura, necesita descartar cualquier fragmento que no desee actualizar en el búfer del esténcil.

Este puede ser hecho con discard palabra clave en shader, o glAlphaTest/glAlphaFunc en OpenGLES 1.1

Cuestiones relacionadas