LibGDX - 无法从 FrameBuffer 获取纹理

Posted

技术标签:

【中文标题】LibGDX - 无法从 FrameBuffer 获取纹理【英文标题】:LibGDX - Cannot get texture from FrameBuffer 【发布时间】:2014-02-24 03:19:15 【问题描述】:

我尝试实现一些后期处理,所以我需要使用FrameBuffer 收集整张图片,然后使用着色器进行后期处理。我在 LibGDX(Rendering a 3D model to texture in LibGDX) 中找到了一些如何使用 FrameBuffer 的示例,但它不起作用。我得到黑屏。我的代码sn-p:

@Override
public void show() 
    modelBatch = new ModelBatch();
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 1f, 1f, 0f, 1f));
    environment.add(new DirectionalLight().set(1f, 0.0f, 0.0f, 0f, -2f, 0f));

    cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam.position.set(1f, 1f, 1f);
    cam.lookAt(0,0,0);
    cam.near = 0.1f;
    cam.far = 300f;
    cam.update();
com.badlogic.gdx.graphics.g3d.loader.ObjLoader loader =new ObjLoader();
    model = loader.loadModel(Gdx.files.internal("cube/cube.obj"));

    instance = new ModelInstance(model);

 fbo = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
    sb= new SpriteBatch();

    camController = new CameraInputController(cam);
    Gdx.input.setInputProcessor(camController);


@Override
public void render(float delta) 
fbo.begin();

    camController.update();

    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
    modelBatch.begin(cam);

    modelBatch.render(instance, environment);        
    modelBatch.end();

fbo.end();

    //getting texture
    tex = fbo.getColorBufferTexture();

//render texture
  spriteBatch.begin();        
    spriteBatch.draw(tex,0,0, Gdx.graphics.getWidth(),  Gdx.graphics.getHeight());
    spriteBatch.end();

我做错了什么?

更新

我遇到了另一个问题。看下面的图片:

我看到了这片隐藏的风景。我用

fb = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

但是当我尝试打开FrameBuffer的深度时,它再次显示黑屏:

fb = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);

如何摆脱显示这片风景以及为什么FrameBuffer 不适用于depth 参数?

【问题讨论】:

您的代码是否在没有帧缓冲区的情况下呈现? (如果只是将 modelBatch 渲染到屏幕上,它会显示什么吗?) 当然!如果我评论fbo.begin()fbo.end(),一切都会很顺利。 一切看起来都很好......您链接到的示例在启动帧缓冲区之前执行了 3 Gdx.gl.gl* (这让我感到惊讶,您的方法似乎更好......)。您可以尝试将帧缓冲区清除为固定颜色(例如,将其全部设为红色)以查看您的 modelBatch 是否有问题,或者 spriteBatch 是否有问题。 嗯...非常有趣的事实是,我用另一个版本的 LibGDX 进行了尝试,一切顺利!无论如何,谢谢你们。 【参考方案1】:

你可以使用 ScreenUtils 函数来获取 framebuffer/

http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/ScreenUtils.html

ScreenUtils.getFrameBufferPixels(int x, int y, int w, int h, boolean flipY)

【讨论】:

在我看来它从默认帧缓冲区获取图像。我说的对吗?

以上是关于LibGDX - 无法从 FrameBuffer 获取纹理的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX - 绘制到 FrameBuffer 不起作用

如何在 libgdx 中正确设置 FrameBuffer 的宽度和高度?

LibGDX FrameBuffer 混合

libgdx 中的 FrameBuffer 大小

Libgdx - FrameBuffer 渲染和 FitViewport

iOS 上的 LibGDX FrameBuffer 怪癖