是否可以部分更新pvrtc纹理

时间:2016-10-01 10:56:29

标签: opengl-es pvrtc

我使用

创建了1024 * 1024纹理
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 1024, 1024, 0, nDataLen*4, pData1);

然后像这样更新它的第一个512 * 512部​​分

glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, nDataLen, pData2);

此更新生成glerror 1282(invalid operation),如果我更新整个1024 * 1024区域一切正常,似乎pvrtc纹理无法部分更新。

是否可以部分更新pvrtc textur,如果是这样的话?

3 个答案:

答案 0 :(得分:1)

听起来像你不能在GLES2上(链接到spec,见3.7.3。)

  

如果xoffset或yoffset不等于零,或者宽度和高度分别与纹理的宽度和高度不匹配,则调用CompressedTexSubImage2D将导致INVALID_OPERATION错误。调用修改的区域外的任何纹素的内容都是未定义的。对于图像易于修改的特定压缩内部格式,可以放宽这些限制

使glCompressedTexSubImage2D声音对我来说有点无用,tbh,但我想这是为了更新单个mips或纹理数组级别。

答案 1 :(得分:1)

令人惊讶的是,我将一个小的pvrtc纹理数据复制到一个大的,它就像glCompressedTexSubImage2D一样。但是我不确定在我的引擎中使用这个解决方案是否安全。

答案 2 :(得分:1)

正确或错误,PVRTC1没有CompressedTexSubImage2D支持的原因是,与ETC *或S3TC不同,纹理数据不会被压缩为独立的4x4正方形纹素,而这些纹素又被表示为64或128数据位取决于格式。使用ETC * / S3TC,只需更换相应的64位或128位数据块,即可替换任何对齐 4x4纹素块,而不会影响纹理的任何其他区域。

使用PVRTC1,两个目标是避免块伪影并利用邻近区域通常​​非常相似的事实,从而可以共享信息。虽然压缩数据被分组为64位单元,但这些会影响纹素的重叠区域。在4bpp的情况下,它们是~7x7和2bpp,15x7。

正如您稍后指出的那样,您可以自己复制数据,但可能存在模糊边界:例如,我使用了这些64x64和32x32纹理(已使用PVRTC1 @ 4bpp压缩和解压缩)...

enter image description here + enter image description here

然后相当于“TexSubImage”得到:

enter image description here

正如您应该看到的那样,较小纹理的边框已经弄脏,因为颜色信息是跨边界共享的。

在实践中,可能无关紧要,但由于它并不严格符合TexSubImage的要求,因此不支持。

PVRTC2具有更好的子图像替换功能,但至少在一个众所周知的平台上没有曝光。

< 顺便说一下,如果你想要更多关于纹理压缩的信息,那么Stack Exchange Computer Graphics网站上有一个帖子< / Unsubtle plug>