Текстуры etc2 не работают на OpenGL ES 3.2 - PullRequest
0 голосов
/ 07 июня 2019

Для стороннего проекта Android мне нужно использовать сжатые текстуры с альфа-смешиванием.etc2 кажется хорошим выбором и должен поддерживаться на OpenGL ES 3+, но я не могу заставить их работать.Я чувствую, что упускаю что-то тривиальное.

Хотя текстуры etc1 работают отлично (но без альфы), текстуры etc2 не работают как на моем устройстве (Mi A1, Android 9), так и на эмуляторе.При создании текстуры GLES30.glCompressedTexImage2D приводит к ошибке 1281 (Неверное значение).

    override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
        val vers = IntArray(2)
        GLES30.glGetIntegerv(GLES30.GL_MAJOR_VERSION, vers, 0)
        GLES30.glGetIntegerv(GLES30.GL_MINOR_VERSION, vers, 1)
        LOG.info("GLES version: ${vers[0]}.${vers[1]}")

        if (vers[0] > 3 || vers[0] == 3 && vers[1] >= 1) {
            // We have at least ES 3.1.
        }
        // first, try to generate a texture handle
        GLES30.glGenTextures(1, textures, 0)

        if (textures[0] == GLES30.GL_FALSE)
            throw RuntimeException("Error loading texture")

        // bind the texture and set parameters
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textures[0])
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST)
        GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_NEAREST)

        val resId = R.raw.texture_etc2
        //val resId = R.raw.texture_etc1

        val texture = ETC2Util.createTexture(context.resources.openRawResource(resId))
        LOG.info("compressionFormat: " + texture.compressionFormat + ", capacity: " + texture.data.capacity())
        GLES30.glCompressedTexImage2D(GLES30.GL_TEXTURE_2D, 0, texture.compressionFormat, texture.width, texture.height, 0,
            texture.data.capacity(), texture.data);
        LOG.info("error: " + GLES30.glGetError())
    }

Хотя версия GLES достаточно высока, glGetError возвращает ошибку 1281:

I/TextureRenderer: GLES version: 3.2
D/vndksupport: Loading /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so from current namespace instead of sphal namespace.
D/vndksupport: Loading /vendor/lib64/hw/gralloc.msm8953.so from current namespace instead of sphal namespace.
I/ETC2Util: width: 128, height: 128, format: 37496, encoded size: 8192
I/TextureRenderer: compressionFormat: 37496, capacity: 8192
    error: 1281

Обратите внимание, что37496 невероятно похож на GLES30.GL_COMPRESSED_RGBA8_ETC2_EAC.

Когда я использую текстуру etc1, все работает гладко.glGetError возвращает 0, и текстуру можно использовать как обычно (за исключением части 'no alpha', конечно).Когда я использую текстуру etc2, glGetError возвращает 1281, а текстура остается черной.

Проблема заключается не в фактических данных текстуры, а в параметре internalFormat: если я укажу формат текстуры etc1 (36196,0x8D64, как ни странно, не найден в GLES30?), Но используйте данные etc2, об ошибках не сообщается, но на экране отображается мусор, потому что OpenGL ES пытается интерпретировать данные etc2 как etc1.

Такое ощущение, что etc2 просто не поддерживаетсяно все источники, на которые я нахожу претензию, поддержка etc2 является обязательной на OpenGL ES 3.0 и выше на Android?

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