Java LibGDX-绘制到帧缓冲区不起作用
因此,我尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。要做到这一点,我认为使用帧缓冲区是可行的,但它并没有给出可行的结果。因此,我试图通过编写一个简单的测试方法来测试帧缓冲区绘制方法,该方法返回在每次render()调用时绘制到显示器上的纹理。此方法在此处(请注意,它是一种测试方法,因此可能优化得有点差): 但是,没有显示任何内容。屏幕是黑色的。。。我试过在没有相机的情况下拍摄,还有很多我已经记不起来的变奏曲。我做错了什么 半解决方案 我最后要做的是为帧缓冲区创建一个新的Matrix4对象,如下所示:Java LibGDX-绘制到帧缓冲区不起作用,java,opengl,libgdx,framebuffer,Java,Opengl,Libgdx,Framebuffer,因此,我尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。要做到这一点,我认为使用帧缓冲区是可行的,但它并没有给出可行的结果。因此,我试图通过编写一个简单的测试方法来测试帧缓冲区绘制方法,该方法返回在每次render()调用时绘制到显示器上的纹理。此方法在此处(请注意,它是一种测试方法,因此可能优化得有点差): 但是,没有显示任何内容。屏幕是黑色的。。。我试过在没有相机的情况下拍摄,还有很多我已经记不起来的变奏曲。我做错了什么 半解决方案 我最后要做的是为帧缓冲区创建一个新的Matrix4对
Matrix4 m = new Matrix4();
m.setToOrtho2D(0, 0, fbo.getWidth(), fbo.getHeight());
batch.setProjectionMatrix(m);
但是,这会使绘制的所有内容都颠倒过来,如下所示:
我认为
fbo.dispose()
调用破坏的内容超出了您的想象
请参阅并注意它在何处破坏colorTexture,这是getColorBufferTexture()
的结果
我认为这可能是Libgdx中的一个bug。颜色纹理通常应具有与FBO非常不同的寿命,因此清理纹理似乎有点过于激进。然而,试图找出哪些情况下要清理纹理可能很复杂….因此,在我添加了半个解决方案之后,我所要做的就是使用FBo中的纹理创建一个新的精灵对象并调用flip(false,true) 这可能是一种处理()帧缓冲区并使纹理保持活动状态的解决方法。我做了以下工作: 只是一个精确的估计:
OrthographicCamera c = new OrthographicCamera(fbo.getWidth(), fbo.getHeight());
c.setToOrtho(false);
除非您知道自己在做什么,否则这可能是有害的:c.setOrtho(false)
执行以下操作:
使用适合屏幕分辨率的视口将此相机设置为正交投影,以(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2)为中心,y轴指向上或下
因此,即使您在正交摄影机的构造函数中指定希望视口具有帧缓冲区大小,您也会通过以下调用覆盖屏幕大小并以屏幕中心为中心的视口来覆盖它
您可能应该:
camera.setToOrtho(false, fbo.getWidth(), fbo.getHeight());
从LibGDX 1.6.5开始解决
现在可以覆盖disposeColorBuffer方法以不处理渲染纹理。在类的draw(Batch b,float parentAlpha)方法中,从何处绘制
test()
texture?@noone到显示器;这是一个演员。@noone我更新了我的问题,如果你想检查:3这可能是原因。但我不确定它是否被认为是一个bug或是过于激进的资源清理。纹理和FBO应具有相同的寿命imho。我不确定这里的OpenGL内部结构,但在处理FBO时,是否仍然可以访问它渲染到的“纹理”?因此我对dispose调用进行了注释,并将文本的draw Y坐标设置为FBO.getHeight(),我设法看到了一小片明亮像素(Y为0时,我什么也看不到).没想到我会需要这个,但在重新评估我的项目将如何组织后,我意识到我肯定会的!谢谢你让我知道:)哇,我都没注意到。感谢您提醒我:)我已经放弃了使用FrameBufferObjects
,转而使用更方便的方法,但这真的很好,可以作为将来的参考!是的,我在github补丁说明中看到了。很高兴这个问题解决了。
static final Texture DUMMY = new Texture(1, 1, Format.RGB565) {
public void dispose() {
};
};
public TextureSaveFBO(Format format, int width, int height,
boolean hasDepth) {
super(format, width, height, hasDepth);
}
@Override
public void dispose() {
// prevents the real texture of dispose()
Texture t = colorTexture;
colorTexture = DUMMY;
super.dispose();
colorTexture = t;
}
}
OrthographicCamera c = new OrthographicCamera(fbo.getWidth(), fbo.getHeight());
c.setToOrtho(false);
camera.setToOrtho(false, fbo.getWidth(), fbo.getHeight());