在自定义Actor (libgdx)中,渲染到FrameBuffer不能与ShapeRenderer一起工作



我尝试实现一个自定义Actor,它通过扩展Image来显示FrameBuffer的内容。在内部,我想使用ShapeRenderer进行绘制。

public class CustomActor extends Image {
    private FrameBuffer frameBuffer = null;
    private ShapeRenderer shapeRenderer = new ShapeRenderer();
    private int width;
    private int height;
    public CustomActor() {
        width = Gdx.graphics.getWidth();
        height = Gdx.graphics.getHeight();
        shapeRenderer.setAutoShapeType(true);
    }
    @Override
    public void draw(Batch batch, float parentAlpha) {
        if (frameBuffer == null) {
            frameBuffer = new FrameBuffer(Pixmap.Format.RGB565, width / 2, height / 2, false);
            TextureRegion textureRegion = new TextureRegion(frameBuffer.getColorBufferTexture());
            textureRegion.flip(false, true);
            setDrawable(new TextureRegionDrawable(textureRegion));
        }
        frameBuffer.begin();
        // render content
        Gdx.gl.glClearColor(0, 1, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.setColor(Color.WHITE);
        shapeRenderer.rect(0, 0, frameBuffer.getWidth() / 2, frameBuffer.getHeight() / 2);
        shapeRenderer.end();
        if (frameBuffer != null) {
            frameBuffer.end();
        }
        super.draw(batch, parentAlpha);
    }
}

当删除ShapeRenderer部分时,我可以看到场景中的绿色背景。但是一旦我使用ShapeRenderer,内容就会变成黑色。没有可见的白色矩形

你知道我做错了什么吗?

刚刚发现,使用我自己的SpriteBatch (with begin()和end())在FrameBuffer end()之后它的工作。因此,问题似乎与FrameBuffers方法和spritebatch方法的调用顺序有关。在开始FrameBuffer之前结束给定的actor批处理并"重新"开始它来绘制actor也有效(参见上面的注释)。

最新更新