在自定义角色(libgdx)中,渲染到帧缓冲区与ShaperEnder不结合使用

在自定义角色(libgdx)中,渲染到帧缓冲区与ShaperEnder不结合使用,libgdx,actor,framebuffer,Libgdx,Actor,Framebuffer,我尝试实现一个自定义的Actor,它通过扩展图像来显示帧缓冲区的内容。在里面我想用一个变形器来画 public class CustomActor extends Image { private FrameBuffer frameBuffer = null; private ShapeRenderer shapeRenderer = new ShapeRenderer(); private int width; private int height; p

我尝试实现一个自定义的Actor,它通过扩展图像来显示帧缓冲区的内容。在里面我想用一个变形器来画

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);
    }
}
删除ShaperEnder零件时,我可以在场景中看到绿色背景。但我一使用ShaperEnder,内容就变成了黑色。没有可见的白色矩形


你知道我做错了什么吗?

刚刚发现在帧缓冲区end()之后使用我自己的SpriteBatch(带有begin()和end())可以工作。因此,问题似乎与帧缓冲区方法和SpriteBatches方法的调用顺序有关。在开始帧缓冲区之前结束给定的actor批处理,并“重新”开始它以绘制actor也在工作(请参见上面的注释)。

刚刚发现在帧缓冲区end()之后使用我自己的SpriteBatch(带有begin()和end())可以工作。因此,问题似乎与帧缓冲区方法和SpriteBatches方法的调用顺序有关。在开始帧缓冲区并“重新”开始绘制之前,结束给定的actor批处理。actor也在工作(请参阅上面的注释)。

在构造函数内部而不是绘制内部创建帧缓冲区。您只需执行一次,因此不需要每秒检查60次。如果调用
framebuffer.begin()
,请始终调用
framebuffer.end()
。如果宽度和高度值不为0,请检查它们。是的,存在一些设计缺陷。谢谢你的改进建议。大小似乎是正常的(调试告诉我大小不是0),并且,如上所述,没有ShaperEnder代码,绿色矩形被绘制出来(Gdx.gl.glClearColor(0,1,0,1);Gdx.gl.glClear(GL20.gl_COLOR_BUFFER_BIT);)。刚刚发现在帧缓冲区end()之后使用我自己的SpriteBatch(带有begin()和end())可以工作。因此,问题似乎与帧缓冲区方法和SpriteBatches方法的调用顺序有关。在开始帧缓冲区之前结束给定的actor批处理,并“重新”开始它以绘制actor,这也是有效的。但我仍然不知道为什么不允许混合这些调用…在构造函数内部而不是绘图内部创建帧缓冲区。您只需执行一次,因此不需要每秒检查60次。如果调用
framebuffer.begin()
,请始终调用
framebuffer.end()
。如果宽度和高度值不为0,请检查它们。是的,存在一些设计缺陷。谢谢你的改进建议。大小似乎是正常的(调试告诉我大小不是0),并且,如上所述,没有ShaperEnder代码,绿色矩形被绘制出来(Gdx.gl.glClearColor(0,1,0,1);Gdx.gl.glClear(GL20.gl_COLOR_BUFFER_BIT);)。刚刚发现在帧缓冲区end()之后使用我自己的SpriteBatch(带有begin()和end())可以工作。因此,问题似乎与帧缓冲区方法和SpriteBatches方法的调用顺序有关。在开始帧缓冲区之前结束给定的actor批处理,并“重新”开始它以绘制actor,这也是有效的。但我仍然不知道为什么不允许混合这些电话。。。