2010-06-29 2 views
7

С буфером трафарета в opengl-es для Android я просто пытаюсь замаскировать часть чертежа. Я думаю, что я правильно настроил его, но он не маскирует незашифрованные части. Ниже приводится извлечение кода для того, что я делаю.Получение буфера трафарета 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); 

Любое пятно ничего плохого с этим? В основном это рисовать поле, например, на половине экрана (это работает, если у меня включен цвет), который устанавливает буфер трафарета в 1 для этой области. И в конце я рисую на весь экран. Я хочу, чтобы он рисовал только верхнюю половину, но он рисует все.

Заранее спасибо.

+2

ли конфигурация контекста [есть трафарет буфера битов] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

Это не так. Спасибо, я думал, что это необходимая функция. Кажется, что это не так. – Moncader

ответ

4

Причина в том, что я не настроил EGLConfig надлежащим образом для поддержки буфера трафарета.

+8

больше информации было бы хорошо –

5

Вы должны установить шаблон трафарета с помощью setEGLConfigChooser. Обратите внимание, что разные телефоны имеют разные поверхности, которые могут поддерживать или не поддерживать это.

Например:

// 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

Странно. Почему я не заметил этого ответа раньше? Во всяком случае, у меня был точно такой же вопрос, и я ответил почти так же :-) – hirschhornsalz

2

Вы должны явно запросить буфер трафарета с GLSurfaceView.setEGLConfigChooser:

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

Цифры красный, зеленый, синий, альфа, глубина, трафаретные бит. RGB565 с 16-битной глубиной и 8-битным трафаретом - это минимум, который поддерживается каждым устройством, поддерживающим EGL.

+0

+1 Это минимальная поддерживаемая битовая глубина для буферов визуализации, но вы нашли какую-либо документацию, в которой говорится, что это также минимальные битовые глубины для поверхности окон? –

0

Этот ответ отправляется по ссылке, приведенной ниже. Это зафиксировало ошибку OpenGL ES2.0 в образце для меня.

«Необходимо установить трафарет маски glStencilMask (0xff) перед вызовом glClear (GL_STENCIL_BUFFER_BIT), чтобы очистить все биты буфера трафарета.»

android opengl 2.0 stencil buffer not working

Смежные вопросы