将TextureRegion翻转为纹理

时间:2018-03-12 23:35:25

标签: java libgdx

我正在使用FBO并尝试在y轴上翻转纹理。 我记得我能用TextureRegion.flip()做到这一点。

然而,当我试图翻转它现在不起作用。

    GLFrameBuffer.FrameBufferBuilder frameBufferBuilder = new GLFrameBuffer.FrameBufferBuilder(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    frameBufferBuilder.addColorTextureAttachment(GL30.GL_RGBA8, GL30.GL_RGBA, GL30.GL_UNSIGNED_BYTE);
    FrameBuffer frameBuffer = frameBufferBuilder.build();
    frameBuffer.begin();
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT | (Gdx.graphics.getBufferFormat().coverageSampling ? GL30.GL_COVERAGE_BUFFER_BIT_NV : 0));
    batch.begin();

    if (textures[1] != null) {
        batch.draw(textures[1], x + marginx[1], y + marginy[1]);
    }

    batch.end();

    frameBuffer.end();

    Texture texturefbo = frameBuffer.getColorBufferTexture();
    framebuffer.dispose(); 
    textreg = new TextureRegion(texturefbo);
    textreg.flip(false, true);
    texturedraw = textreg.getTexture();

我知道我可以使用TextureRegion代替Texture但我仍然想知道为什么从textureregion转换为不转移uvu2v2的纹理。

1 个答案:

答案 0 :(得分:1)

翻转TextureRegion对它所属的纹理没有任何作用。 Texture对象不包含任何UV数据。这是一个图像,仅此而已。当您将纹理传递给SpriteBatch.draw(Texture)时,SpriteBatch在内部使用UV将其拉伸到X-right和Y-up矩形。例如,您还可以将负宽度传递给重载的SpriteBatch.draw()方法以将其水平翻转。翻转对Texture对象没有影响,只对SpriteBatch的内部绘图数据有效。

此外,如果您丢弃拥有纹理的FrameBuffer,则无法保证纹理有效。事实上,我认为它根本不应该。

如果你真的需要翻转纹理,你可以做其中一个。

  1. 提前翻转源图像。
  2. 将图像加载为Pixmap,迭代像素以反向行绘制到另一个Pixmap,处理第一个Pixmap,最后将第二个Pixmap传递给Texture构造函数。
  3. 如果纹理不是来自图像文件,您可以使用GLUtils将纹理对象中的像素复制到Pixmap中,然后执行第2步。
  4. 当然,2和3比简单地使用翻转的TextureRegion更复杂。