7

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

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

  • glGetTexImage

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

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

    正确确定基本内部格式的 C 类型(例如GL_RGB没有大小)还需要一些不平凡的工作。

  • ARB_internalformat_query2允许要求GL_GET_TEXTURE_IMAGE_FORMAT并且代表给定纹理GL_GET_TEXTURE_IMAGE_TYPE的最佳选择。glGetTexImage

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

  • 有一种美妙的glGetCompressedTexImage方式可以优雅地按原样返回压缩纹理的数据,但它既不适用于非压缩图像,也没有对应的功能。

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

4

1 回答 1

2

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

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

那将是 GL_RGB,GL_UNSIGNED_BYTE_3_3_2

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

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

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

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, …);
于 2013-02-08T13:10:00.970 回答