glTextureStorage3D 和 glTextureSubImage3D 不工作
glTextureStorage3D and glTextureSubImage3D are not working
我想使用多个纹理,但卡住了。
我尝试使用 glTextureStorage3D
和 glTextureSubImage3D
绑定多个纹理。
我用 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
)
我想使用多个纹理,但卡住了。
我尝试使用 glTextureStorage3D
和 glTextureSubImage3D
绑定多个纹理。
我用 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
)