如何在OpenGL中创建一个通道的32位浮点压缩纹理

时间:2019-01-14 11:45:26

标签: opengl compression textures hdr

根据文档,我可以创建HDR压缩纹理,所以我可以这样做:

funcs->glGenTextures(1, &newCompressedTexture);
funcs->glActiveTexture(GL_TEXTURE0 + g_cTileTextureUnit);
funcs->glBindTexture(GL_TEXTURE_2D, newCompressedTexture);
funcs->glTexStorage2D(GL_TEXTURE_2D, 1, oglTileInfo.m_compressedInternalFormat, g_cTileWidthWithBorder, g_cTileWidthWithBorder);
funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_cTileWidthWithBorder, g_cTileWidthWithBorder, GL_RED, GL_FLOAT, getUncompressedData().rData()._m_data.data());

其中oglTileInfo.m_compressedInternalFormat为GL_COMPRESSED_RED_RGTC1或GL_COMPRESSED_RGBA_ASTC_4x4_KHR。 没有任何gl错误,着色器正常工作,但是我通过texture()获得的值被限制在[0,1]与它的深度之间仅8位。如果我使用GL_R32F作为纹理内部格式,一切正常,但是我需要压缩。谢谢。

1 个答案:

答案 0 :(得分:1)

如果OpenGL实现支持ASTC纹理,则可以将预压缩的ASTC数据上传到纹理。 但是,ASTC支持不需要为您压缩纹理数据的实现,因此完全不允许上传未压缩的数据。上传之前,您必须先将数据压缩到其他位置。

此外,良好的ASTC压缩并不是特别快,因此,如果您在应用程序中生成此浮点数据,那将是有问题的。

对于GL_COMPRESSED_RED_RGTC1,这是规范化格式。因此,尽管需要实现为您压缩数据,但仍会将数据限制为[0,1]。

BPTC要求实现能够内联压缩此类纹理。因此,使用其浮点格式之一可能会起作用。但是,这样的压缩不会特别快,也不会特别好。