Текстура кубической карты с растровым изображением в OpenGL ES 2.0/3.0

Когда я создаю текстуру кубической карты с простыми цветами, это работает хорошо:

@JvmStatic
fun createSimpleTextureCubemap() {
    val textureId = IntArray(1)
    val cubeFace0 = byteArrayOf(127, 127, 127) 
    val cubeFace1 = byteArrayOf(0, 127, 0) 
    ... // create other cube faces with simple color

    val cubeFaces = ByteBuffer.allocateDirect(3)
    glGenTextures(1, textureId, 0)
    glBindTexture(GL_TEXTURE_CUBE_MAP, textureId[0])

    cubeFaces.put(cubeFace0).position(0)
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 
        1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, cubeFaces)

    cubeFaces.put(cubeFace1).position(0)
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, 
        1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, cubeFaces)
    ...
    return textureId[0]
}

Но когда я пытаюсь создать текстуру кубической карты с растровым изображением:

@JvmStatic
fun createTextureCubemap(context: Context, rowID: Int) {
    val input = context.resources.openRawResource(rowID)
    val bitmap = BitmapFactory.decodeStream(input)

    val textureId = IntArray(1)
    glGenTextures(1, textureId, 0)
    glBindTexture(GL_TEXTURE_CUBE_MAP, textureId[0])

    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, bitmap, 0)
    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, bitmap, 0)
    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, bitmap, 0)
    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, bitmap, 0)
    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, bitmap, 0)
    GLUtils.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, bitmap, 0)

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    return textureId[0]
}

Затем объект становится черным. Кто-то может подсказать, почему не работает кубмап с битмап (черный цвет)?

Спасибо за любой комментарий/ответ.


person alexrnov    schedule 14.05.2020    source источник
comment
Являются ли размеры вашего растрового изображения квадратными и степенью двойки?   -  person Columbo    schedule 15.05.2020
comment
@Columbo Это был не квадрат). Благодарю вас!!! Вы действительно помогли мне.   -  person alexrnov    schedule 15.05.2020


Ответы (1)


Текстуры для Cubemaps должны быть квадратными. Как упоминалось в комментариях, использованное растровое изображение не было квадратным.

Из справочника по glTexImage2D (GLUtils.texImage2D для удобства обертка вокруг glTexImage2D)

GL_INVALID_VALUE генерируется, если цель является одной из шести целей 2D-изображения кубической карты, а параметры ширины и высоты не равны.

person Columbo    schedule 15.05.2020