让OpenGL-ES模板缓冲区工作

时间:2010-06-29 07:35:29

标签: java android opengl-es stencil-buffer

对于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。最后我画到了整个屏幕。我希望它只画到上半部分,但它会吸引所有东西。

提前致谢。

4 个答案:

答案 0 :(得分:5)

您必须使用setEGLConfigChooser设置stencilSize。请注意,不同的手机具有不同的表面,可能支持也可能不支持。

例如:

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

答案 1 :(得分:4)

最后原因是我没有正确设置EGLConfig来支持模板缓冲区。

答案 2 :(得分:2)

您需要使用GLSurfaceView.setEGLConfigChooser显式请求模板缓冲区:

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

数字为红色,绿色,蓝色,alpha,深度,模板位。 RGB565具有16位深度和8位模板是每个支持EGL的Android设备支持的最小值。

答案 3 :(得分:0)

此答案将从下面显示的链接转发。这为我修复了样本中的OpenGL ES2.0错误。

"在调用glClear(GL_STENCIL_BUFFER_BIT)清除模板缓冲区的所有位之前,必须设置模板掩码glStencilMask(0xff)。 "

test the event.type