libGDX - 如何裁剪

7
我在我的游戏中有一个 SpriteBatch,在其 batch.begin() 和 batch.end() 之间我绘制了一个大的静态背景图像和几个游戏精灵。我想剪切看到精灵的区域,我已经阅读过可以使用 ScissorStack 来完成。但问题在于 ScissorStack 似乎会裁剪发送到 GPU 的整个 SpriteBatch。这导致它剪切了我的游戏精灵和背景图像。
问:必须要有两个单独的 batch.begin() 和 batch.end() 周期,一个用于背景而没有剪切,另一个用于精灵而有剪切吗? 或者是否有一种方法可以仅剪切精灵而不使用 ScissorStack?
如果是前者,那么为了剪切一些精灵而将 SpriteBatch 刷新两次是否非常耗费资源,或者从性能方面考虑真的无需担心?
相关问题:最新源代码中的 calculateScissors() 方法具有比我在任何文档中看到的更多参数...
calculateScissors(camera、viewportX、viewportY、viewportWidth、viewportHeight、batchTransform、area、scissor)
当它们似乎重复 camera 的 viewport 和 area 信息,并且没有在任何文档中提到时,viewportX、viewportY、viewportWidth、viewportHeight 的目的是什么?
基本上,我很困惑......即使在测试每个参数不同值的行为之后仍然如此。任何建议都会好受。

1
关于你的第二个问题:如果你不使用任何视口,那么你可以使用没有这些参数的方法。对于带参数的方法,请查看此链接 https://github.com/libgdx/libgdx/wiki/Viewports。相机本身没有视口。如果你决定使用视口,请使用 viewport.calculateScissors() - noone
为什么要执行剪裁?如果您想这样做是为了不渲染您看不到的东西,您也可以使用视锥体剔除。 - Robert P
我对剪裁和裁剪的理解是,裁剪将绘制任何部分在边界内的对象的整个内容。而我只想绘制在边界内的对象的那一部分。目前,我已通过将背景绘制到我的spriteBatch并刷新它,然后应用剪刀,绘制我的剪裁对象,并再次刷新来实现所需的效果(直到更好的解决方案出现为止 :-))。 - Bumpy
1个回答

6

我没有使用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();
}

希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接