iOS上的LibGDX FrameBuffer怪癖

威尔·考德伍德

我有一个文字游戏的动态纹理,该纹理是我创建并保留在FrameBuffer上的。然后,我使用该FrameBuffer支持的TextureRegions绘制到屏幕上。这段代码在Android上运行良好,但在iOS上却遇到问题。

您可以在下面的屏幕截图中看到,在左下方绘制了FrameBuffer内容-一切都很好。

在此处输入图片说明

但是,如果返回到iOS主屏幕,则会丢弃FrameBuffer,然后根据需要重新创建所有内容并将其重新绘制到FrameBuffer。然后,FrameBuffer的内容似乎是屏幕的部分翻转镜像。

在此处输入图片说明

I tried disposing and recreating the FrameBuffer on every frame to see what happens. Again, this works perfectly unless I return to the iOS home screen, after which the contents of the FrameBuffer are incorrect.

I then tried reducing the size of the FrameBuffer and drawing across mutliple FrameBuffers. If I do this it again works fine unless I return to the iOS home screen. However, in this instance only the first FrameBuffer created becomes corrupted, all subsequent buffers are fine.

在此处输入图片说明

I then tried always creating a 1x1px FrameBuffer first that I never draw anything to and this fixes my problem.... but why!? It seems the first FrameBuffer I create after returning from the iOS home screen is not working as expected, but every FrameBuffer after that is fine. It looks like it's always trying to draw the screen over the first FrameBuffer I create.

FrameBuffer的创建和绘制代码如下:

private static FrameBuffer getFrameBuffer(boolean newRequired) {
    if (newRequired || frameBuffers.size == 0) {
        FrameBuffer frameBuffer;

        try {
            frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, getFrameBufferSize(), getFrameBufferSize(), false);
        } catch (Exception e) {
            frameBuffer = new FrameBuffer(Format.RGBA4444, getFrameBufferSize(), getFrameBufferSize(), false);
        }

        frameBuffer.begin();
        Gdx.gl20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
        frameBuffer.end();

        frameBuffers.add(frameBuffer);

        // Set up the camera correctly for the frame buffer
        OrthographicCamera camera = new OrthographicCamera(frameBuffer.getWidth(), frameBuffer.getHeight());
        camera.position.set(frameBuffer.getWidth() * 0.5f, frameBuffer.getHeight() * 0.5f, 0);
        camera.update();
        spriteBatch.setProjectionMatrix(camera.combined);
    }

    return frameBuffers.get(frameBuffers.size - 1);
}

private static TextureRegion getTextureUsingGpu(String letter, Bubble.BubbleType bubbleType) {
    if (!enabled)
        return null;

    TextureRegion tx = getBlockImage(letter, bubbleType);

    int width = (int) (tx.getRegionWidth() * LayoutManager.getShortEdge() / 1080 * LayoutManager.getScaling());
    int height = (int) (tx.getRegionHeight() * LayoutManager.getShortEdge() / 1080 * LayoutManager.getScaling());

    if (nextTextureX + width + PADDING > getFrameBufferSize()) {
        nextTextureX = PADDING;
        nextTextureY = nextRowY + PADDING;
        if (nextTextureY + height + PADDING > getFrameBufferSize()) {
            getFrameBuffer(true);
            nextRowY = PADDING;
            nextTextureY = PADDING;
        }
    }

    FrameBuffer fb = getFrameBuffer(false);

    fb.begin();
    spriteBatch.begin();

    tx.flip(false, !tx.isFlipY());

    spriteBatch.disableBlending();
    spriteBatch.draw(tx, nextTextureX, nextTextureY, width, height);
    spriteBatch.enableBlending();

    // Drawing Code Removed

    spriteBatch.end();
    fb.end();

    TextureRegion textureRegion = new TextureRegion(fb.getColorBufferTexture(), nextTextureX, nextTextureY, width, height);
    textureRegion.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
    cacheTexture(letter, textureRegion);

    nextTextureX += width;
    nextRowY = Math.max(nextRowY, nextTextureY + height);

    return textureRegion;
}
Tenfour04

如果您正在调用getFrameBuffergetTextureUsingGpu通过您的resizeresume方法进行调用,那就是问题所在。在iOS上,resizeresume不必调用之前OpenGL是准备恢复,所以它不是安全的做任何事情直接关系到OpenGL的出现,如创建ShaderPrograms,装载纹理,或创建帧缓冲区。我在游戏中通过resume设置boolean成员来解决此问题,并使用该成员将新帧缓冲区的创建推迟到该render方法中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

libgdx嵌套的FrameBuffer

来自分类Dev

libgdx中的FrameBuffer大小

来自分类Dev

libgdx嵌套的FrameBuffer

来自分类Dev

如何正确使用LIBGDX FrameBuffer

来自分类Dev

LibGDX-绘制到FrameBuffer无效

来自分类Dev

LibGDX-绘制到FrameBuffer无效

来自分类Dev

AngularJS和怪癖模式:IE8 +上的黑屏

来自分类Dev

AngularJS和怪癖模式:IE8 +上的黑屏

来自分类Dev

无法使用 Renderbuffer 在 Framebuffer 上绘制

来自分类Dev

LibGDX 如何从 FrameBuffer 获取深度缓冲区?

来自分类Dev

LIBGDX:SpriteBatch绘图未在iOS上绘制

来自分类Dev

LIBGDX:SpriteBatch绘图未在iOS上绘制

来自分类Dev

OpenGL ES 2.0和iOS中的默认FrameBuffer

来自分类Dev

设置WebView的怪癖

来自分类Dev

数组文字语法的怪癖

来自分类Dev

UIActivityViewController集成中的怪癖

来自分类Dev

什么是PCI怪癖?

来自分类Dev

Firefox怪癖:当图像在同一行上时,请选择第一个字母

来自分类Dev

iOS 8 SDK中的GL_DRAW_FRAMEBUFFER_APPLE和GL_READ_FRAMEBUFFER_APPLE在哪里?

来自分类Dev

iOS 8 SDK中的GL_DRAW_FRAMEBUFFER_APPLE和GL_READ_FRAMEBUFFER_APPLE在哪里?

来自分类Dev

libgdx首选项可以在iOS上使用吗?

来自分类Dev

无法在iOS设备上以40%的速度运行Libgdx应用

来自分类Dev

LibGDX-FrameBuffer,Scene2D表和剪辑出现问题

来自分类Dev

功能接口继承怪癖

来自分类Dev

在IE中发现怪癖模式

来自分类Dev

与playerprefs奇怪的统一怪癖?

来自分类Dev

javascript / D3怪癖?

来自分类Dev

Unity X轴旋转怪癖

来自分类Dev

在Android NDK上通过JNI从OpenGL ES Framebuffer创建位图图像