Opengl es 是否可以部分更新pvrtc纹理

Opengl es 是否可以部分更新pvrtc纹理,opengl-es,pvrtc,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_IM

我创建了一个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(无效操作)
,如果我更新整个1024*1024区域都正常,则pvrtc纹理似乎无法部分更新


是否可以部分更新pvrtc纹理,如果是如何更新的?

在我听来,就像你在GLES2上无法更新一样(链接到,请参阅3.7.3。)

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


使GLCompressedExSubImage2D听起来对我来说有点无用,tbh,但我想它是用于更新单个MIP或纹理数组级别的。

令人惊讶的是,我将一个小的pvrtc纹理数据复制到了一个大的,它的工作原理与GLCompressedExSubImage2D一样。但我不确定在我的引擎中使用此解决方案是否安全。

正确或错误地说,PVRTC1没有CompressedExSubImage2D支持的原因是,与ETC*或S3TC不同,纹理数据没有被压缩为独立的4x4个texel正方形,反过来,根据格式,可以表示为64位或128位数据。使用ETC*/S3TC,只需替换其对应的64位或128位数据块,即可替换任何对齐的4x4 texel块,而不会影响纹理的任何其他区域

PVRTC1的两个目的是避免块效应,并利用相邻区域通常非常相似的事实,从而可以共享信息。尽管压缩数据被分组为64位单元,但这些单元会影响texel的重叠区域。在4bpp的情况下,它们是7x7,对于2bpp,它们是15x7

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

+

然后做了相当于“TexSubImage”的操作,得到:

正如您应该能够看到的,随着颜色信息跨边界共享,较小纹理的边界已被弄脏

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

PVRTC2具有更好的子映像替换功能,但至少在一个知名平台上没有公开


顺便说一句,如果您想了解有关纹理压缩的更多信息,堆栈交换站点上有一个线程

感谢您提供的信息,现在我有信心以这种方式实现纹理图集,pvrtexture工具具有解决边界问题的功能。