我使用
创建了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,如果是这样的话?
答案 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压缩和解压缩)...
然后相当于“TexSubImage”得到:
正如您应该看到的那样,较小纹理的边框已经弄脏,因为颜色信息是跨边界共享的。
在实践中,可能无关紧要,但由于它并不严格符合TexSubImage的要求,因此不支持。
PVRTC2具有更好的子图像替换功能,但至少在一个众所周知的平台上没有曝光。
<