【问题标题】:glCompressedTexSubimage2d with ETC1 texture data带有 ETC1 纹理数据的 glCompressedTexSubimage2d
【发布时间】:2019-10-19 08:13:23
【问题描述】:

我正在尝试让带有 ETC1 纹理的 glCompressedTexSubimage2d 在 OpenGL ES 3.2 上下文中工作。

我知道 glCompressedTexSubimage2d 被指定用于 ETC2 (https://www.khronos.org/opengles/sdk/docs/man32/html/glCompressedTexSubImage2D.xhtml) 但不适用于 ETC1。但是,ETC2 被定义为向后兼容 ETC1 (http://www.jacobstrom.com/publications/StromPetterssonGH07.pdf),因此任何 ETC1 纹理也应该是有效的 ETC2 纹理(如果我错了,请纠正我) - 所以我使用 GL_COMPRESSED_RGB8_ETC2 作为内部格式而不是 GL_ETC1_RGB8_OES对于目标以及上传的子纹理。目标和上传的子纹理在每个维度上都是 4 的倍数,并且偏移量也与 4 的倍数对齐。

但是,我在调用时遇到了 Invalid_Operation 错误,例如使用以下参数:

*** GL error after call to CompressedTexSubImage2D(target = GL_TEXTURE_2D, level = 0, xoffset = 0, yoffset = 2048, width = 512, height = 1024, format = GL_COMPRESSED_RGB8_ETC2, imageSize = 262144, data = 0xc13ab008): invalid operation

在这种情况下,压缩后的目标纹理大小为 1024x4096

相同的代码(OpenGL 等效)适用于在 Windows 上运行的 dxt1。

我是否正确,这应该按预期工作,还是我忽略了一些限制?

【问题讨论】:

    标签: opengl-es textures


    【解决方案1】:

    来自 OpenGL ES 3.2 规范:

    对于 ETC2/EAC 图像,如果 width 不是四的倍数,并且 width + xoffset 不等于纹理级别的宽度,则会生成 GL_INVALID_OPERATION;如果 height 不是四的倍数,并且 height + yoffset 不等于纹理层的高度;或者如果 xoffset 或 yoffset 不是四的倍数。

    “宽度/高度 + x/yoffset == w/h of texture”约束都失败了。

    【讨论】:

    • 你知道这个限制的原因吗? EXT_texture_compression_s3tc 中规定了相同的限制,但在桌面上使用 dxt1 它仍然有效。
    • 没有线索,抱歉。
    • 好像很奇怪只能上传右下部分的贴图
    【解决方案2】:

    我知道这是一个非常古老的问题,但它似乎也可能更多是驱动程序错误。先前的答案似乎误解了 GL 规范中的(相当混乱的)要求。

    "如果width不是4的倍数,并且width + xoffset不等于纹理层的宽度,则生成GL_INVALID_OPERATION;"

    我相信这个要求的意思是,如果宽度不是 4 的倍数,那么它必须满足 width + xoffset == 全纹理宽度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多