libGDX - 如何剪辑

时间:2014-03-22 10:46:44

标签: libgdx clipping

我的游戏中有一个SpriteBatch,我在batch.begin()batch.end()之间绘制...

  1. 大型静态背景图片

  2. 几个游戏精灵

  3. 我想剪切看到精灵的区域,我已经阅读了ScissorStack

    问题是ScissorStack似乎会剪切发送到GPU的整个 SpriteBatch。结果是它剪辑了我的游戏精灵背景图片。

    问题:

    我必须有两个单独的batch.begin()batch.end()周期,一个没有裁剪背景,另一个有精灵剪裁吗?或者有没有一种方法可以在不使用ScissorStack的情况下剪切精灵?

    如果是前者,那么为了削减一些精灵,它是不是很昂贵地冲洗SpriteBatch两次,或者在性能方面真的没什么可担心的?

    相关问题:

    最新源代码中的calculateScissors()方法有比我在任何地方记录的参数更多的参数......

    calculateScissors(camera, viewportX, viewportY, viewportWidth, viewportHeight, batchTransform, area, scissor)

    viewportX, viewportY, viewportWidth, viewportHeight在复制camera的视口和区域信息时是什么目的,并且在任何文档中都没有提及?

    基本上,我真的很困惑......甚至在测试了每个参数的不同值的行为之后(或特别是之后!)。

    寻求任何建议。

1 个答案:

答案 0 :(得分:5)

而不是使用ScissorStack我使用glScissor来获得我需要的结果。

@Override
public void render(float delta) {
    GameStage.INSTANCE.act(Gdx.graphics.getDeltaTime());
    GameStage.INSTANCE.setViewport(GameGeometry.width, GameGeometry.height,
            true);
    GameStage.INSTANCE.getCamera().translate(
            -GameStage.INSTANCE.getGutterWidth(),
            -GameStage.INSTANCE.getGutterHeight(), 0);

    Gdx.gl.glScissor(
            (int) GameStage.INSTANCE.getGutterWidth() * 2,
            (int) GameStage.INSTANCE.getGutterHeight(),
            (int) Gdx.graphics.getWidth()
                    - (int) (GameStage.INSTANCE.getGutterWidth() * 4),
            (int) Gdx.graphics.getHeight());
    Gdx.gl.glDisable(GL10.GL_SCISSOR_TEST);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    Gdx.gl.glEnable(GL10.GL_SCISSOR_TEST);
    GameStage.INSTANCE.draw();
}

希望这有帮助。