Получение буфера трафарета OpenGL-ES
с буфером трафарета в 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 ответов
вы должны установить 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);
вам нужно явно запросить буфер трафарета с помощью 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.
этот ответ пересылается из ссылки, показанной ниже. Это исправило OpenGL ES2.0 ошибка в образце для меня.
" необходимо установить маску трафарета glStencilMask(0xff) перед вызовом glClear (GL_STENCIL_BUFFER_BIT), чтобы очистить все биты буфера трафарета. "