2012-07-08 15 views
5

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

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

+0

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

+1

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

Odpowiedz

1

Wystarczy, problemem jest to, że jesteś po prostu rysunek tekstury na scenę, nie robiąc żadnych badań, co jest w fakturze. Bufor szablon nie dba o kolorach w fakturze, po prostu sprawdza:

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

pan fragment rysunku dla każdego piksela swojej strukturze, więc każdy efekt maski w fakturze jest bezużyteczny.

Jeśli chcesz maskować z teksturą, musisz odrzucić odrzucić wszystkie fragmenty, których nie chcesz aktualizować w buforze szablonu.

To jest albo zrobić z discard słów kluczowych w cieniującego lub glAlphaTest/glAlphaFunc w OpenGLES 1.1

Powiązane problemy