【发布时间】:2014-07-02 20:22:35
【问题描述】:
我正在尝试使用精灵作为剪辑实体。这意味着我希望它的所有子实体都被剪辑,以便只有与剪辑实体(父)重叠的子实体部分可见。
我正在尝试使用 OpenGL 模板功能来做到这一点。在我的模拟器上我让它工作了,但在我的安卓手机上却没有。我做错了什么?
GLES20.glEnable(GLES20.GL_STENCIL_TEST);
GLES20.glClearStencil(0);
GLES20.glStencilMask(1);
GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT);
// pre draw
GLES20.glStencilFunc(GLES20.GL_NEVER, 1, 1);
GLES20.glStencilOp(GLES20.GL_REPLACE, GLES20.GL_KEEP, GLES20.GL_KEEP);
// draw clip-entity (this) (sprite)
this.draw();
// post draw
GLES20.glStencilFunc(GLES20.GL_LESS, 2, 1);
GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_KEEP);
// draw children of clip-entity (this) which should now be clipped
this.drawChildren();
GLES20.glDisable(GLES20.GL_STENCIL_TEST);
【问题讨论】:
-
在设备上运行时是否检查过模板缓冲区存在?
-
是的,请检查您的
setEGLConfigChooser()呼叫,并确保您请求了模板缓冲区。当您请求深度缓冲区时,某些设备会自动为您提供模板缓冲区,因为深度/模板通常组合在同一个缓冲区中。但并非所有设备都如此。 -
非常感谢你们两位的快速回答!我真的很感谢你的帮助。我已经调用 view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);在 onSetContentView 但遗憾的是没有成功。还有其他想法吗?顺便说一句:我应该基本上避免使用 OpenGL 模板还是这是一种稳定的方式来实现我想要的?
-
setEGLConfigChooser()重载的最后一个参数是stencilSize。使用 8 作为最后一个参数的值。 -
感谢您回复我!我现在调用 this.mRenderSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8);但它仍然不起作用?无论如何,使用模板是个好主意吗? - 他们在大多数设备上都能正常工作吗?感谢你的帮助。谢谢
标签: java android opengl-es opengl-es-2.0 andengine