【问题标题】:How to obtain raw (unconverted) texture data in OpenGL?如何在 OpenGL 中获取原始(未转换的)纹理数据?
【发布时间】:2013-01-24 03:44:54
【问题描述】:

我需要序列化一个任意 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 可以优雅地按原样返回压缩纹理的数据,但它既不适用于非压缩图像,也没有对应的功能。

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

【问题讨论】:

    标签: opengl serialization textures


    【解决方案1】:

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

    但是,允许的格式和类型不会 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, …);
    

    【讨论】:

    • Danke schön!现在我知道我在处理什么了。我一直是putting some effort to put this thing together,我,呃,期待测试它。而且我找不到像 RGB10 或 RGBA2 这样的格式的完美匹配。我希望我有ARB_internalformat_query2 来轻松验证所有这些......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多