使用函数 glGenerateMipmap() 初步创建 mipmap

Preliminary creation of mipmap with function glGenerateMipmap()

使用 glGenerateMipmap() 命令在 Android (OpenGL ES 2.0/3.0) 中创建了 mipmap:

public class Renderer implements GLSurfaceView.Renderer { 
    private final int textureID;
    public Renderer(Context context) {
        textureID = loadTexture(bitmap)
    }
    public void onDrawFrame(GL10 glUnused) { // render loop
        ...
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
        GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
        // use bilinear interpolation
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);
        ...
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, NUMBER_INDICES, GLES20.GL_UNSIGNED_INT, 0);
        ...
    }
}

加载纹理的函数 (Kotlin):

private fun loadTexture(bitmap: Bitmap): Int {
    val textureId = IntArray(1)
    GLES20.glGenTextures(1, textureId, 0)
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0])
    // loading two-dimensional texture image
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)
    // set filtering modes
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST_MIPMAP_NEAREST)
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
    return textureId[0]
}

因此,伪像消失了,即 mipmap 是有效的。但是,当在某些物理设备上使用多个具有纹理的 3D 对象时,渲染会变慢(FPS 降低)。我将其与渲染循环中的 mipmap 生成相关联:

public void onDrawFrame(GL10 glUnused) {  
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
}

问题:是否可以提前(在渲染循环开始之前)生成 mipmap,例如在 loadTexture() 函数中?

在 loadTexture() 函数的末尾添加了 glGenerateMipmap() 命令:

...
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
return textureId[0]
...

并从函数 onDrawFrame() 中删除了 glGenerateMipmap() 命令。我不完全确定这是正确的,但它似乎运作良好。