Cerco di utilizzare il "buffer stencil" per visualizzare una parte del mio rendering da una texture, ma il mio rendering viene visualizzato senza alcun effetto maschera.Usa stencil buffer con iOS
E 'per un progetto 2D iOS, con OpenGL ES 2.0 questa è la parte interessata del mio codice:
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);
Qualsiasi aiuto sarebbe molto apprezzato!
(Come al solito per uno sviluppatore francese, mi spiace per il mio inglese!)
precisione: "_maskTexture" è un nero & immagine in bianco.
Soluzione:
ho finnaly risolto il mio problema con le indicazioni del rotoglub e tim. Grazie ad entrambi.
1/Il buffer degli stencil non è stato creato correttamente. Dovrebbe essere inizializzato in questo modo:
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
GL_DEPTH24_STENCIL8_OES,
backingWidth,
backingHeight);
E 'la ragione principale per cui la mia prestazione non è stata influenzata dalla mia maschera.
2/Per poter utilizzare una texture come maschera, ho sostituito il colore nero con un canale alfa e abilitato il blending nel rendering.
Il mio codice di rendering finale è simile al seguente:
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);
Basta che descrivono il problema come * non funzionano * non è davvero utile. Ma suppongo che il tuo problema sia quello risolto in questa altra domanda: http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengl-es-2- 0 – rotoglup
Grazie per il tuo commento. Con "non funziona", intendevo che "_viewTexture" era visualizzato senza alcun effetto maschera di "_maskTexture". Cercherò di essere più specifico in futuro. Per quanto riguarda il post che hai citato, ho già letto, ma se non sbaglio, ha risolto il suo problema con uno shader e ha abbandonato il buffer degli stencil. – EricD
Durante la lettura del post della soluzione, penso che tu abbia ancora problemi (forse per il momento nascosto): il test dello stencil è disabilitato per il tuo secondo passaggio di rendering, quindi il mascheramento che osservi non può essere provocato da questo test. Inoltre, la fusione non dovrebbe essere utile per il test dello stencil, ma solo per il test alfa. Penso che tu osservi il mascheramento che volevi, ma probabilmente per un altro motivo che stencil. – rotoglup