Предварительное создание mipmap с функцией glGenerateMipmap () - PullRequest
0 голосов
/ 24 марта 2020

Создано 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 ()?

1 Ответ

0 голосов
/ 24 марта 2020

Добавлена ​​команда glGenerateMipmap () в конец функции loadTexture ():

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

И удалена команда glGenerateMipmap () из функции onDrawFrame (). Я не совсем уверен, что это правильно, но, похоже, работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...