Создано mipmap в Android (OpenGL ES 2.0 / 3.0) с помощью команды glGenerateMipmap ():
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 при рендеринге l oop:
public void onDrawFrame(GL10 glUnused) {
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
}
Вопрос: можно ли сделать генерацию mipmap заранее (до начала рендеринга l oop), например, в функции loadTexture ()?