2010-06-29 13 views
7

Za pomocą bufora szablonu w opengl-es na Androida po prostu próbuję maskować część rysunku. Myślę, że mam to ustawione poprawnie, ale to nie maskuje nieplamionych części. Poniżej znajduje się ekstrakcja kodu dla tego, co robię.Uzyskiwanie buforowego bufora szablonów OpenGL-ES

gl.glEnable(GL10.GL_STENCIL_TEST); 
gl.glClearStencil(0); 
gl.glClear(GL10.GL_STENCIL_BUFFER_BIT); 
gl.glColorMask(false, false, false, false); 
gl.glDepthMask(false); 
gl.glStencilFunc(GL10.GL_ALWAYS, 1, 1); 
gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); 

drawMask(); //I have confirmed this draws to the correct location by allowing colour to show. Trust that this draws the mask to the correct location. 

gl.glColorMask(true, true, true, true); 
gl.glDepthMask(true); 
gl.glStencilFunc(GL10.GL_EQUAL, 1, 1); 
gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); 

drawItems(); //Draw everything. Only items inside the masked area should be drawn. But everything is drawn with this code... 

gl.glDisable(GL10.GL_STENCIL_TEST); 

Ktoś coś z tym nie tak? Zasadniczo wystarczy narysować pole, powiedzmy, połowę ekranu (działa to, jeśli miałem włączony kolor), który ustawia bufor szablonu na 1 dla tego obszaru. I na koniec rysuję na całym ekranie. Chcę, aby rysował tylko do górnej połowy, ale rysuje wszystko.

Z góry dziękuję.

+2

Czy konfiguracja kontekst [jakieś bity bufor szablonowy] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

Nie. Dziękuję, pomyślałem, że jest to wymagana funkcja OpenGL. Wydaje się, że tak nie jest. – Moncader

Odpowiedz

4

Powód był taki, że nie ustawiłem poprawnie EGLConfig w celu obsługi bufora szablonu.

+8

więcej informacji byłoby miło –

5

Musisz ustawić rozmiar szablonu za pomocą setEGLConfigChooser. Zwróć uwagę, że różne telefony mają różne powierzchnie, które mogą lub nie mogą tego obsługiwać.

Na przykład

// void android.opengl.GLSurfaceView.setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) 
    mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8); 
+0

Dziwne. Dlaczego wcześniej nie zauważyłem tej odpowiedzi? W każdym razie miałem dokładnie to samo pytanie i odpowiedziałem prawie w taki sam sposób :-) – hirschhornsalz

2

Należy wyraźnie zwrócić bufor szablon z GLSurfaceView.setEGLConfigChooser:

public class MyActivity extends Activity { 
    GLSurfaceView view; 
    ... 
    onCreate(... 
     view.setEGLConfigChooser(5,6,5,0,16,8); 
     view.setRenderer(... 

Numery czerwony, zielony, niebieski, bity alfa, głębokość wzornika. RGB565 z 16-bitową głębią i 8-bitowym szablonem to minimum obsługiwane przez każde urządzenie z systemem Android obsługującym EGL.

+0

+1 To są minimalne obsługiwane głębokości bitowe dla buforów renderowania, ale czy znalazłeś dokumentację, która mówi, że są to również minimalne głębia bitów dla powierzchnie okien? –

0

Ta odpowiedź została przesłana z linku poniżej. Naprawiłem błąd OpenGL ES2.0 w próbce dla mnie.

„Konieczne jest, aby ustawić szablon maska ​​glStencilMask (0xFF) przed wywołaniem glClear (GL_STENCIL_BUFFER_BIT), aby usunąć wszystkie bity bufor szablonowy”.

android opengl 2.0 stencil buffer not working

Powiązane problemy