我需要序列化任意OpenGL纹理对象,以便以后可以使用完全相同的状态和数据恢复它。
我正在寻找一种获取纹理图像数据的方法。到目前为止,这是我发现的内容:
glGetTexImage
。它允许获取纹理图像,但需要指定的格式/类型对(例如(
GL_RGB
和GL_HALF_FLOAT
))进行转换。允许的格式和类型虽然不能将1:1映射到图像格式,并且在不进行额外转换的情况下不允许获得诸如
GL_R3_G3_B2
之类的更晦涩的格式。同样,正确确定基本内部格式(如无大小的
GL_RGB
)的C类型涉及一些琐碎的工作。 ARB_internalformat_query2
,可以要求GL_GET_TEXTURE_IMAGE_FORMAT
和GL_GET_TEXTURE_IMAGE_TYPE
,它们代表给定纹理的glGetTexImage
的最佳选择。不错,但与
glGetTexImage
一样,也有同样的局限性,并且并不普及。 glGetCompressedTexImage
可以优雅地按原样返回压缩纹理的数据,但是它不适用于非压缩图像,也没有对应的代码。 这些都不允许获取或设置非压缩纹理的原始数据。有办法吗?
最佳答案
诀窍是找到格式匹配的内容并键入正确的数据布局。
那就是GL_RGB,GL_UNSIGNED_BYTE_3_3_2
是的,它确实。 *戴太阳眼镜*处理它! ;)
至于内部格式。我在此refer you to
glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_INTERNAL_FORMAT,…);
glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_TYPE, …);
glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_SIZE, …);