将纹理快速加载到OpenGL 2.0中

时间:2011-12-13 03:07:28

标签: android opengl-es textures opengl-es-2.0

我正在为Android构建一个简单的动态壁纸。我使用下面的代码将所需的纹理上传到OpenGL ES 2.0中。我已将所有图像加载到一个大小为2048x2048的文件中。下面的代码需要大约900到1200毫秒才能加载纹理。这是正常的时间还是我做错了让它变慢?

每次在渲染器中调用onSurfaceCreated时,我也会尝试清除Opengl中的纹理列表。这是正确的,还是有办法简单检查先前加载的纹理是否已经在内存中,如果是这样,请避免清除和重新加载?请告诉我你对此的评论。谢谢。

同样在屏幕方向更改时,将调用OnSurfaceCreated。所以纹理上传再次发生。这不是一个好主意。有什么工作?

public int addTexture(Bitmap texture) {

    int bitmapFormat = texture.getConfig() == Config.ARGB_8888 ? GLES20.GL_RGBA : GLES20.GL_RGB;

    int[] textures = new int[1];
    GLES20.glGenTextures(1, textures, 0);
    int textureId = textures[0];
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapFormat, texture, 0);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
    return textureId;
}

1 个答案:

答案 0 :(得分:3)

有几种方法可以提高效果。

  1. 每次调用onSurfaceChanged时都不要加载纹理。将textureId初始化为-1(在渲染器的构造函数/ surfaceCreated中),如果您有不同的ID,请在onSurfaceChanged的开头检查。当您拨打glGenTextures时,您将获得一个正数。
  2. 你需要Mipmap吗?这可能是你方法的关键点。尝试不使用行GLES20.glGenerateMipMap(GLES20.GL_TEXTURE_2D);
  3. 2048x2048很大。特别是纹理。你真的需要那么多细节吗?也许1024x1024就足够了。
  4. 避免使用RGB_888,而是使用RGB_565:您将获得几乎相同视觉质量的一半。