我需要序列化任意OpenGL纹理对象,以便以后可以使用完全相同的状态和数据恢复它。

我正在寻找一种获取纹理图像数据的方法。到目前为止,这是我发现的内容:

  • glGetTexImage

    它允许获取纹理图像,但需要指定的格式/类型对(例如(GL_RGBGL_HALF_FLOAT))进行转换。

    允许的格式和类型虽然不能将1:1映射到图像格式,并且在不进行额外转换的情况下不允许获得诸如GL_R3_G3_B2之类的更晦涩的格式。

    同样,正确确定基本内部格式(如无大小的GL_RGB)的C类型涉及一些琐碎的工作。
  • 有一个ARB_internalformat_query2,可以要求GL_GET_TEXTURE_IMAGE_FORMATGL_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, …);
    

    07-24 18:27
    查看更多