在OpenGL4.x的单独通道上使用不同的压缩算法创建和读取RGBA纹理是可能的吗?
示例A没有真正意义:
- RG channels存储3Dc编码的法线贴图
- B通道存储高度值,例如使用编码进行镶嵌
- A通道存储未经压缩的raw MaterialID
B的例子:
- RGB存储用DXT1压缩的材料参数
- A保存MaterialID而不压缩
背景:
在第15页和第18页的基于物理的渲染PBR (PDF)的Frostbite实现中,作者描述了他们如何将材料参数结构成不同的纹理通道。他们还提到他们避免了对一些通道进行纹理压缩,但没有详细说明他们指的是哪些通道。
第15页
所有基本属性(Normal, BaseColor, Smoothness, MetalMask, Reflectance)需要可混合以支持延迟贴花。不可混合的属性,如MaterialId被存储到alpha通道中。我们还避免了压缩和编码机制,这可能会影响混合质量。
18页
在这种情况下,我们选择避免对中的一些属性进行压缩,并依赖于简单的线性插值alpha混合。
没有OpenGL或硬件支持读取在不同通道上具有不同压缩的纹理。当然,我们也可以创建一个pre - pass,将这种手工制作的纹理分割成单独的纹理,然后分别解压缩。
正如Nicol Bolas所建议的,Frostbite PBR的实现避免了由于混合而产生的压缩。