关于 压缩纹理

# 一. 压缩纹理

绑定压缩纹理是 OpenGL/WebGL 自身支持的一个特性。

压缩纹理的使用并不会减少drawCalls, 甚至压缩纹理的 shader 比默认的非压缩纹理 shader 还稍微复杂那么一点点:

注意 builtin-2d-sprite.effect:

  void main () {
    vec4 o = vec4(1, 1, 1, 1);
 
    #if USE_TEXTURE
    o *= texture(texture, v_uv0); 
      #if CC_USE_ALPHA_ATLAS_TEXTURE //如果是 etc 1.0 这样的压缩纹理,要对透明通道做特殊处理
      o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
      #endif
    #endif
 
    o *= v_color;
 
    ALPHA_TEST(o);
 
    gl_FragColor = o;
  }

压缩纹理的主要作用是降低程序的内存占用。比如使用etc 1.0,可以让纹理占用的内存空间压缩到原来的 1/3。

所以,“压缩纹理” ,它对渲染性能的影响是间接的(通过内存的优化)。

cocosCreator 2.x 可以做到在项目在构建时针对不同的平台,不同的图片文件,生成不同格式的压缩纹理。这个功能大大简化了开发者自己去部署多平台压缩纹理的工作。

虽然压缩纹理对图片的质量是有影响的(有损压缩),但是鉴于其部署的方式非常灵活。我们可以最大程度的发挥压缩纹理的优势。 (比如,对于静止的,精细度要求很高的贴图不压缩, 而对于一闪而过的帧动画特效,粒子,精度要求不高的贴图,运用压缩纹理策略。)