我创建了一个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纹理,如果是这样的话?
发布于 2016-10-02 02:30:03
在我看来,你不能使用GLES2 (链接到spec,参见3.7.3)。
如果xoffset或yoffset不等于零,或者如果宽度和高度分别与纹理的宽度和高度不匹配,则
调用CompressedTexSubImage2D将导致INVALID_OPERATION错误。调用修改的区域之外的任何纹理元素的内容都是未定义的。对于图像易于修改的特定压缩内部格式,可以放宽这些限制
使glCompressedTexSubImage2D的声音对我来说有点无用,但我猜它是用来更新单个mips或纹理数组级别的。
发布于 2016-10-02 05:14:59
令人惊讶的是,我复制了一个小的pvrtc纹理数据到一个大的,它的工作方式就像glCompressedTexSubImage2D.But我不确定它是否安全使用这个解决方案在我的引擎。
发布于 2016-10-03 19:54:37
无论对错,PVRTC1不支持CompressedTexSubImage2D的原因是,与ETC*或S3TC不同,纹理数据不会被压缩为独立的4x4正方形的纹理元素,而纹理元素反过来又表示为64位或128位的数据,具体取决于格式。使用ETC*/S3TC,只需替换相应的64位或128位数据块,就可以替换任何对齐的4x4纹理元素块,而不会影响纹理的任何其他区域。
对于PVRTC1,两个目标是避免块效应和利用相邻区域通常非常相似的事实,因此可以共享信息。尽管压缩数据被分组为64位单元,但它们会影响纹理元素的重叠区域。在4bpp的情况下,它们是~7x7,对于2bpp,它们是15x7。
正如您稍后指出的,您可以自己复制数据,但可能存在模糊边界:例如,我采用了这些64x64和32x32纹理(已使用PVRTC1 @4bpp压缩和解压缩)……


然后执行等同于"TexSubImage“的操作来获得:

正如您应该能够看到的,较小纹理的边界已经变得模糊,因为颜色信息在边界之间共享。
在实践中,这可能无关紧要,但由于它并不严格符合TexSubImage的要求,因此不受支持。
PVRTC2有更好的子图替换工具,但至少没有在一个知名的平台上公开。
BTW如果您需要有关纹理压缩的更多信息,Stack Exchange Computer Graphics站点上有一个主题< /Unsubtle plug >
https://stackoverflow.com/questions/39805754
复制相似问题