如何在OpenGL中获取原始(未转换的)纹理数据?

时间:2013-02-08 11:26:13

标签: opengl serialization textures

我需要序列化一个任意的OpenGL纹理对象,以便以后能够使用 exact 相同的状态和数据来恢复它。

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

  • glGetTexImage

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

    允许的格式和类型不会将1:1映射到图像格式,并且不允许在没有额外转换的情况下获得更加模糊的格式,例如GL_R3_G3_B2

    同样正确地确定基本内部格式的C类型(例如没有大小的GL_RGB)涉及一些非平凡的工作。

  • ARB_internalformat_query2允许GL_GET_TEXTURE_IMAGE_FORMATGL_GET_TEXTURE_IMAGE_TYPE代表glGetTexImage代表给定纹理的最佳选择。

    很好,但是遇到与glGetTexImage相同的限制,并且没有广泛使用。

  • 有优美的glGetCompressedTexImage优雅地按原样返回压缩纹理的数据,但它既不适用于非压缩图像,也不适用于非压缩图像。

这些都不允许获取或设置非压缩纹理的原始数据。有办法吗?

1 个答案:

答案 0 :(得分:2)

诀窍是,找到格式匹配并输出正确的数据布局。

  

允许的格式和类型不会将1:1映射到图像格式,并且不允许在没有额外转换的情况下获得更加模糊的格式,如GL_R3_G3_B2。

那将是GL_RGB,GL_UNSIGNED_BYTE_3_3_2

  

同样正确地确定基本内部格式的C类型(如没有大小的GL_RGB)涉及一些非平凡的工作。

是的。 *戴上太阳镜*处理它! ;)

至于内部格式。我在此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, …);