在OpenGL ES 2.0中加厚纹理

Raf*_*fay 5 java opengl-es stencil-buffer opengl-es-2.0 libgdx

我一直试图在Libgdx项目中做一些模板.到目前为止,我只能模板化多边形(插图后的代码).

问题:我如何在OpenGL ES 2.0中模板化非多边形形状?(即我不希望将透明像素绘制到模板缓冲区)

如何在不使用GL_ALPHA_TEST的情况下实现这一目标(因为OpenGL ES 2.0不允许)?

非常感谢任何帮助或指示,并提前感谢.

编辑:如果您能提供一些代码示例以供理解,那将非常有用.

请考虑下图:

在此输入图像描述

这是渲染代码:

@Override
public void render(float delta) {
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_STENCIL_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );


    stage.act();
    stage.draw();

    Gdx.gl20.glColorMask(false, false, false, true);
    Gdx.gl20.glDepthMask(false);

    Gdx.gl20.glClearStencil(0x0);

    Gdx.gl20.glEnable(GL20.GL_STENCIL_TEST);

    Gdx.gl20.glStencilFunc(GL20.GL_ALWAYS, 0x1, 0x1);
    Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_REPLACE);      

    batch.begin();
    batch.draw(heart, 0, i+50);
    batch.end();

    Gdx.gl20.glColorMask(true, true, true, true);
    Gdx.gl20.glDepthMask(true);

    Gdx.gl20.glStencilFunc(GL20.GL_NOTEQUAL, 0x1, 0x1);
    Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_KEEP);

    batch.begin();
    batch.draw(heart, 0, i);
    batch.end();

    Gdx.gl20.glDisable(GL20.GL_STENCIL_TEST);
}
Run Code Online (Sandbox Code Playgroud)

bri*_*dir 0

我没有使用 libgdx 的经验,但在常见情况下,您可以在片段着色器中模拟 alpha 测试:

if (pixelColor.a <= ALPHA_THRESHOLD) // threshold should be 0 for good visual results
        discard;
Run Code Online (Sandbox Code Playgroud)