在自定义角色(libgdx)中,渲染到帧缓冲区与ShaperEnder不结合使用
我尝试实现一个自定义的Actor,它通过扩展图像来显示帧缓冲区的内容。在里面我想用一个变形器来画在自定义角色(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
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,这也是有效的。但我仍然不知道为什么不允许混合这些电话。。。