libgdx ScissorStack没有按预期工作 [英] libgdx ScissorStack not working as expected

查看:162
本文介绍了libgdx ScissorStack没有按预期工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



应该剪辑的 draw()例程:

  @Override 
public void draw(SpriteBatch batch,float parentAlpha){
Rectangle scissors = new长方形();
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(剪刀)){
super.draw(batch,parentAlpha);
ScissorStack.popScissors();
}
}
}



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


I'm trying to create a "progress bar" of sorts but the clipping doesn't seem to work the way I expect it to. Is this something I am doing wrong or something I've misinterpreted?

The draw() routine that should clip:

    @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();
        }
    }
}

Complete sample code for ClipTest group class, TestScreen and screenshot.

  • ClipTest is a subclass of group used to demonstrate the "bug".
  • ClipImage is a subclass of Image, which performs the clipping on draw().
  • ClipTest has 2 images, background and foreground.

The background is a black image and it should always be the full size of the progress bar.

The foreground is a white image and it's width is clipped depending on the percentage of the bar.

The strange result I've found is that although the foreground is using the clipping class, the background image is the one actually clipped.

The expected result was created using photoshop (as I couldn't produce it via code).

Any idea what's wrong?

解决方案

Actual drawing doesn't happen until the Batch "flushes", its not the draw call you need to wrap, as that just queues up drawing to be done later.

You need to make sure the OpenGL draw calls happen between enabling and disabling your scissors, so add a flush after the draw. See https://github.com/libgdx/libgdx/wiki/Clipping,-with-the-use-of-scissorstack

Because a draw call might cause a flush to happen, you need to keep the draw calls inside the active-scissor region. You may also need to flush or end the batch before starting the active scissor region to prevent queued draw calls from before the scissor start getting flushed inside the active scissor region.

这篇关于libgdx ScissorStack没有按预期工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆