Начало работы трафаретного буфера OpenGL-ES - PullRequest
7 голосов
/ 29 июня 2010

С помощью буфера трафарета в opengl-es для Android я просто пытаюсь замаскировать рисованную часть экрана. Я думаю, что я настроил это правильно, но это не маскировка не трафаретных частей. Ниже приведено извлечение кода для того, что я делаю.

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 для этой области. И в конце я рисую на весь экран. Я хочу, чтобы он рисовал только верхнюю половину, но он рисует все.

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

Ответы [ 4 ]

5 голосов
/ 15 июня 2011

Вы должны установить stencilSize, используя 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);
4 голосов
/ 01 июля 2010

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

2 голосов
/ 21 июня 2012

Вам необходимо явно запросить буфер трафарета с помощью GLSurfaceView.setEGLConfigChooser:

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

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

0 голосов
/ 18 января 2016

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

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

трафаретный буфер android opengl 2.0 не работает

...