libgdx SpriteBatch 渲染到纹理

Posted

技术标签:

【中文标题】libgdx SpriteBatch 渲染到纹理【英文标题】:libgdx SpriteBatch render to texture 【发布时间】:2011-11-24 23:38:40 【问题描述】:

是否可以在 libGdx(android/Desktop 的 Java 引擎)中使用 SpriteBatch 渲染到纹理?如果有,怎么做?

基本上,我想将所有内容渲染到 512 x 256 纹理的 320 x 240 区域,然后缩放区域以适应屏幕(在横向模式下)。通过这种方式,我想消除在独立缩放 Alpha 混合纹理时发生的伪影。如果有任何其他方法可以删除此类工件,请指出:)

有没有关于 libGdx 的在线文档?

【问题讨论】:

我对这样的功能很感兴趣。不过,在浏览了“SpriteBatch”代码之后,我认为实现这样的功能并不容易——而且它会涉及重新编译库。我过去在“Pixmap”(在本机端)中添加了一些功能,但这似乎更麻烦。 【参考方案1】:

这个 sn-p 是在 LibGDX 论坛上给我的,它完美无缺。

private float m_fboScaler = 1.5f;
private boolean m_fboEnabled = true;
private FrameBuffer m_fbo = null;
private TextureRegion m_fboRegion = null;

public void render(SpriteBatch spriteBatch)

    int width = Gdx.graphics.getWidth();
    int height = Gdx.graphics.getHeight();

    if(m_fboEnabled)      // enable or disable the supersampling
                      
        if(m_fbo == null)
        
            // m_fboScaler increase or decrease the antialiasing quality

            m_fbo = new FrameBuffer(Format.RGB565, (int)(width * m_fboScaler), (int)(height * m_fboScaler), false);
            m_fboRegion = new TextureRegion(m_fbo.getColorBufferTexture());
            m_fboRegion.flip(false, true);
        

        m_fbo.begin();
    

    // this is the main render function
    my_render_impl();

    if(m_fbo != null)
    
        m_fbo.end();

        spriteBatch.begin();         
        spriteBatch.draw(m_fboRegion, 0, 0, width, height);               
        spriteBatch.end();
       

【讨论】:

为了保持纹理翻转而使用环绕帧缓冲区的 TextureRegion 的意义在这里得到了很好的赞赏。新人请注意。 我在实现这个时遇到了一些问题:i.gyazo.com/7329707597bf94974dfd76fc1f33285d.gif 如果我绘制我的 spriteBatch,一切看起来都很好,但是当我尝试在 FBO 中捕捉东西时,我在 FBO 绘制所有以前渲染的东西也是如此。有什么想法吗? 啊,如果其他人遇到这个问题,glClear 调用应该在 fbo.begin() 之后立即进行。【参考方案2】:

目前,我建议您使用Pixmaps。您会看到,为它们编写的函数并不多,但显然您可以将 Pixmap(带 alpha 通道)写入另一个(pm1.drawPixmap(pm2, srcx, srcy, w, h, ...)),前提是您不想缩放它(您可以缩放稍后合成,但是合成中使用的图片比例不会调整大小...除非您编写调整大小功能)。

如果您想做更复杂的事情(例如使用BitmapFont 将字符串写入Texture 以供以后操作,或者将其写入Pixmap 然后将其上传到视频内存),那么。 ..然后告诉我你是否成功(因为我想朝那个方向优化)。我认为最好的方法是将所需的功能添加到 libgdx...

无论如何,不​​要把我在这里写的任何东西当作不可否认的事实——如果我更进一步,我会更新。

我发现的文档有些有限——我相信你已经看过了。在 badlogic 的博客和 googlecode 项目页面中有相关信息 - 还有一本 Mario 写的相对不错的书,“Beginning Android Games”。此外,还有一些(非常基本的)视频。并且不要忘记您可以查阅源代码和漂亮的示例...

另外,你也可以随时在论坛提问:http://badlogicgames.com/forum/

更新:您使用FrameBufferTextureRegion 的答案无疑要好得多。我留下这个只是因为它提到了文档。

【讨论】:

以上是关于libgdx SpriteBatch 渲染到纹理的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 FBO 解除绑定纹理会清除纹理?

libGDX奇怪的渲染错误

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

我的 FrameBuffer 上只渲染了一个纹理

Libgdx 之SpriteBatch深入分析

MonoGame / XNA在Spritebatch中绘制多边形