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

Kos*_*Kos 7 opengl serialization textures

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

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

  • 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是优雅的返回压缩纹理的数据,是的,但它也不适用于非压缩图像,也有一个对应的那会.

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

dat*_*olf 2

诀窍是,找到格式匹配并键入产生正确的数据布局。

\n\n
\n

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

\n
\n\n

那将是 GL_RGB、GL_UNSIGNED_BYTE_3_3_2

\n\n
\n

此外,正确确定基本内部格式(例如没有大小的 GL_RGB)的 C 类型也涉及一些重要的工作。

\n
\n\n

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

\n\n

至于内部格式。我特此向您推荐

\n\n
glGetTexLevelParameter(GL_TEXTURE_\xe2\x80\xa6, \xe2\x80\xa6, GL_TEXTURE_INTERNAL_FORMAT,\xe2\x80\xa6);\nglGetTexLevelParameter(GL_TEXTURE_\xe2\x80\xa6, \xe2\x80\xa6, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_TYPE, \xe2\x80\xa6);\nglGetTexLevelParameter(GL_TEXTURE_\xe2\x80\xa6, \xe2\x80\xa6, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_SIZE, \xe2\x80\xa6);\n
Run Code Online (Sandbox Code Playgroud)\n