java - 将TextureRegion翻转为纹理

标签 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转换为texture而不传输uvu2v2。

最佳答案

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

此外,如果您处理掉拥有该纹理的 FrameBuffer,则不能保证您的纹理能够正常工作。事实上,我认为根本不应该。

如果您确实需要翻转纹理,您可以执行其中之一。

  1. 提前翻转源图像。
  2. 将图像作为 Pixmap 加载,迭代像素以将它们绘制到相反行中的另一个 Pixmap,处理第一个 Pixmap,最后将第二个 Pixmap 传递到纹理构造函数中。
  3. 如果纹理不是来自图像文件,您可以使用 GLUtils 将像素从纹理对象复制到 Pixmap,然后执行步骤 2。

当然,2和3比简单地使用翻转的TextureRegion要复杂得多。

关于java - 将TextureRegion翻转为纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246028/

相关文章:

Java boolean 返回类型

java - Java 中 XML JDOM 解析器中的 OutOfMemoryError

java - BitmapFont 的自定义 actor (libgdx)

java - 无法检测舞台 LIBGDX 中 Actor 的着陆事件

java - libgdx 进度条旋转不起作用

java - Libgdx 从不同位置的数组中抽取多个随机值

java - 如何使用 java 中的值创建类似类型驱动选择的内容(例如图片)

java - 从私有(private)存储库获取 Maven Artifact 并部署到服务器

java - 如何将抽象工厂与单例模式结合起来?

eclipse - 导入LibGDX Gradle项目时出错