libgdx ScissorStack没有按预期工作

我正在尝试创建各种各样的“进度条”,但裁剪似乎不像我期望的那样工作。 这是我做错了什么还是我误解了什么?

应该剪切的draw()例程:

  @Override public void draw(SpriteBatch batch, float parentAlpha) { Rectangle scissors = new Rectangle(); Rectangle clipBounds = new Rectangle(getX(), getY(), getWidth() * 0.75f, getHeight()); ScissorStack.calculateScissors( getStage().getCamera(), getStage().getGutterWidth(), getStage().getGutterHeight(), getStage().getCamera().viewportWidth, getStage().getCamera().viewportHeight, batch.getTransformMatrix(), clipBounds, scissors); if (ScissorStack.pushScissors(scissors)) { super.draw(batch, parentAlpha); ScissorStack.popScissors(); } } } 

完成ClipTest组类, TestScreen和屏幕截图的示例代码。

在此处输入图像描述

  • ClipTest是用于演示“bug”的组的子类。
  • ClipImage是Image的子类,它在draw()上执行剪切。
  • ClipTest有2个图像,背景和前景。

背景是黑色图像,它应始终是进度条的完整大小。

前景是白色图像,其宽度根据条形图的百分比进行裁剪。

我发现的奇怪结果是虽然前景是使用剪辑类,但背景图像是实际剪裁的图像。

预期的结果是使用photoshop创建的(因为我无法通过代码生成它)。

知道什么是错的吗?

实际绘图直到批处理“刷新”才会发生,它不是你需要包装的draw调用,因为它只是将绘图排队等待以后完成。

您需要确保在启用和禁用剪刀之间进行OpenGL绘制调用,因此在draw后添加flush 。 请参阅https://github.com/libgdx/libgdx/wiki/Clipping,-with-the-use-of-scissorstack

因为draw调用可能会导致刷新,所以您需要将draw调用保留在active-scissor区域内。 您可能还需要在启动活动剪刀区域之前刷新或结束批处理,以防止在剪刀开始在活动剪刀区域内刷新之前排队的绘制调用。