2

老实说,我不喜欢这样问,但我对这个一点头绪都没有!

你以前见过这个吗?

在此处输入图像描述

可以看出,图像按照某种定义的模式进行了加扰。这只发生在某些(低端)设备中,具有两个图像的非电源 (FBO)。它在其他设备上运行良好。

我所做的是将 Android 位图加载到 FBO(工作正常,因为它在屏幕上显示正常)。我做了一些编辑(我粘贴了一个贴纸,它在图像中似乎在正确的位置),最后再次将 FBO 保存到位图中。它适用于 512x512 FBO(FBO 具有图像尺寸),但不适用于那个(507x800)。

有任何想法吗???我不发布代码,因为我不知道,请告诉我,我会添加它。

这是从 FBO 检索信息的 GL 调用

public Buffer toPixelBuffer(){
        final int w = this.getWidth(); //colorTexture width 
        final int h = this.getHeight();
        final ByteBuffer pixels = BufferUtils.newByteBuffer(w*h * 4);
        Gdx.gl.glPixelStorei(GL10.GL_PACK_ALIGNMENT, 1);
        Gdx.gl.glReadPixels(0,0, w, h, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels);
        pixels.clear();
        return pixels;
    }

我现在也没有带越野车的设备来测试:(

谢谢!

4

1 回答 1

4

我有同样的问题。我在 Galaxy Ace、Galaxy Y 和其他一些设备上体验过这一点。

经过大量测试后,我发现它甚至不需要 POT 纹理,因此将纹理大小保持为 64 像素增量就可以了。所以假设我有一个 122x53 的纹理,我需要将它转换为 128x64。一个等等。

接下来是我用来获取有效纹理尺寸的函数。为宽度和高度调用它。

/**
 * Some GPUs such as the "VideoCore IV HW" on the Samsung Galaxy Ace
 * require texture (FBO) sizes to be in '64' increments (WTF!!!!)
 * 
 * @param dimension
 *            Base dimension to calculate
 * @return Resolved 64 dimension
 */
public static int calculate64Dimension(final int dimension)
{
    return  (((dimension - 1) >> 6) << 6) + 64;
}
于 2014-03-21T22:39:35.840 回答