2012-07-08 14 views
5

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

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

+0

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

+1

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

risposta

1

Semplicemente, il problema è che si sta solo disegnando una texture alla scena senza fare alcun test di ciò che è nella texture. Il buffer di stencil non si preoccupa di colori nella trama, controlla solo:

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

si sta disegnando un frammento per ogni pixel della vostra struttura, in modo che qualsiasi effetto maschera nella texture è inutile.

Se si desidera mascherare con una trama, è necessario scartare eventuali frammenti che non si desidera aggiornare nel buffer stencil.

Questo può essere fatto con discard parola chiave in shader o glAlphaTest/glAlphaFunc in OpenGLES 1.1

Problemi correlati