glTextureStorage3D 和 glTextureSubImage3D 不工作

glTextureStorage3D and glTextureSubImage3D are not working

我想使用多个纹理,但卡住了。 我尝试使用 glTextureStorage3DglTextureSubImage3D 绑定多个纹理。 我用 Kotlin 编写了以下代码。


    // generate textureId
    val tex = BufferUtils.createIntBuffer(1).run {
        glCreateTextures(GL_TEXTURE_2D_ARRAY, this)
        this.get(0)
    }

    // using STBImage, retrieve image file's width, height and bytebuffer
    val textures = texturePaths.mapIndexed { idx, texture ->
        loadTexture(idx, tex, texture)
    }

    glTextureStorage3D(
            tex,
            1,
            GL_RGB,
            textures.maxBy { it.width }!!.width,
            textures.maxBy { it.height }!!.height,
            textures.size
    )

    textures.forEach { texture ->
        glTextureSubImage3D(tex,
                0,
                0,
                0,
                texture.index,
                texture.width,
                texture.height,
                1,
                GL_RGBA,
                GL_UNSIGNED_BYTE,
                texture.img
        )
    }
    ...
}

private fun loadTexture(idx: Int, tex: Int, texture: String): Texture {

    val width = BufferUtils.createIntBuffer(1)
    val height = BufferUtils.createIntBuffer(1)
    val comp = BufferUtils.createIntBuffer(1)
    val img: ByteBuffer = STBImage.stbi_load(texture, width, height, comp, STBImage.STBI_default)
            ?: throw IllegalStateException("Failed to load $texture")

    logger.debug("$texture load OK")
    val texObj = Texture(idx, width.get(0), height.get(0), comp.get(0), img)

    STBImage.stbi_image_free(img)

    return texObj
}

执行glBindTexture并通过texureId调用glGetTexImage后,没有返回图像数据。 我参考了 SO post。

如何正确绑定贴图?

我发现纹理是合法加载的。但是,参数 int internalformat 不正确。如果我们使用 GL_RGB,则不使用 alpha 值。所以我误解了它没有正确加载。我刚把GL_RGB改成了GL_RGBA8,问题就解决了。

    glTextureStorage3D(
            tex,
            1,
            GL_RGBA8,
            textures.maxBy { it.width }!!.width,
            textures.maxBy { it.height }!!.height,
            textures.size
    )