UI 自定义材质

从 1.2 版本开始, UI 的 Sprite 组件支持自定义材质的使用,其使用界面如下图:

UI材质 - 图1

其使用方法与其他材质并无不同,但由于 Sprite 面板有基于 UI 内置材质的功能,所以有一些需要注意的点:

  • 当设置自定义材质数量为 0 或为空时,会使用默认材质进行渲染,面板功能及使用方法可参考 Sprite
  • UI 并不支持多材质,自定义材质的数量最多为一个
  • 当使用了 ui 自定义材质之后,面板上的 Grayscale 功能将会失效,用户可选择自己在材质中实现此功能
  • 设置了自定义材质之后,面板上的 Color 属性会与本身材质中设置的颜色(如果有的话)混合影响精灵的渲染颜色
  • 针对自定义材质,需要在 shader 中引入 cc-sprite-texture 头文件并对 cc_spriteTexture 进行采样,即可直接通过设置面板上的 SpriteFrame 设置 sprite 使用的图片资源
  • 例如一个简单的使用了面板设置 SpriteFrame 来采样纹理的 fragment shader 应该是下面的样子:

    1. CCProgram sprite-fs %{
    2. precision highp float;
    3. #include <embedded-alpha>
    4. #include <cc-sprite-texture> // 引入预设头文件
    5. in vec4 color;
    6. in vec2 uv0;
    7. uniform Constant {
    8. vec4 mainColor;
    9. };
    10. vec4 frag () {
    11. vec4 o = vec4(1, 1, 1, 1);
    12. o *= texture(cc_spriteTexture, uv0); // 对 cc_spriteTexture 进行采样
    13. o *= color;
    14. o *= mainColor;
    15. return o;
    16. }
    17. }%
  • 如果用户希望对自定义材质进行 uniform 赋值操作,可通过获取 Sprite 上的 material 来进行操作,我们提供了不同的接口以应对不同的操作情况,如下代码所示:(请一定注意看不同接口的注释说明!)

    1. let spriteCom = this.node.getComponent(Sprite);
    2. // 通过 sharedMaterial 方法获取到的为 共享材质资源,针对 material 进行的操作将会影响到所有使用此材质的渲染对象
    3. let material = spriteCom.sharedMaterial;
    4. // 通过 material 方法获取到的为 当前渲染组件使用的材质试例,针对 material Instance 进行的操作只会对当前组件产生影响
    5. let materialInstance = spriteCom.material;