Próbuję użyć "bufora szablonu", aby wyświetlić część mojego renderowania z tekstury, ale mój render jest wyświetlany bez efektu maski.Użyj bufora szablonu z iOS
To dla projektu 2D iOS z OpenGL ES 2.0 To jest zaniepokojony część mojego kodu:
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);
Każda pomoc będzie bardzo mile widziane!
(jak zwykle dla francuskiego dewelopera, przepraszam za mój angielski!)
precyzją: „_maskTexture” to czarno-biały obraz &.
Rozwiązanie:
I finnaly rozwiązać mój problem ze wskazaniami rotoglub i tim. Dziękuję wam obojgu.
1/Bufor wzorcowy nie został utworzony poprawnie. Należy zainicjowany tak:
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
GL_DEPTH24_STENCIL8_OES,
backingWidth,
backingHeight);
Jest to główny powód, dlaczego mój renderowania nie została dotknięta przez moją maską.
2/Aby móc użyć tekstury jako maski, zastąpiłem czarny kolor kanałem alfa i włączam mieszanie w moim renderowaniu.
Moja ostatnia kod renderowania wygląda następująco:
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);
Wystarczy opisujących problem jak * nie działa * nie jest bardzo pomocna. Ale przypuszczam, że twój problem został rozwiązany w innym pytaniu: http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengles- 2- 0 – rotoglup
Dziękuję za komentarz. Przez "nie działa" rozumiem, że "_viewTexture" był wyświetlany bez efektu maski "_maskTexture". Postaram się być bardziej konkretny w przyszłości. W odniesieniu do postu, o którym wspomniałeś, już to przeczytałem, ale jeśli się nie mylę, rozwiązał swój problem za pomocą modułu cieniującego i porzucił bufor szablonu. – EricD
Podczas czytania wpisu rozwiązania, myślę, że nadal masz problemy (być może na razie ukryte): test szablonu jest wyłączony dla drugiego przebiegu renderowania, więc obserwowane maskowanie nie może zostać wywołane przez ten test. Ponadto mieszanie nie powinno być użyteczne w przypadku testu szablonu, a jedynie test alfa. Myślę, że obserwujesz maskowanie, które chciałeś, ale prawdopodobnie z innego powodu. – rotoglup