glCompressedTexSubimage2d与ETC1纹理数据

时间:2016-12-15 16:39:24

标签: opengl-es textures

我正在尝试使用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_ETC1_RGB8_OES而是使用GL_COMPRESSED_RGB8_ETC2目标以及上传的子纹理的内部格式。目标以及上传的子纹理在每个维度中都是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。

我是否认为这应该按照预期的方式运作,或者我有哪些限制?

2 个答案:

答案 0 :(得分:1)

来自OpenGL ES 3.2规范:

  

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

你的“宽度/高度+ x / yoffset == w / h纹理”约束都失败了。

答案 1 :(得分:0)

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

“如果width不是四的倍数,并且width + xoffset不等于纹理级别的宽度,则会生成GL_INVALID_OPERATION;”

我认为此要求旨在表示,如果宽度不是4的倍数,则必须满足width + xoffset ==全部纹理宽度。