如何实现变更节点透明度,以及在3d节点上创建2d跑马灯

问题一,3D物体不能通过修改透明度,只能改材质来实现

问题2,可以准备几张图片,做一个动画,来回切换这几张图片

// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html

CCEffect %{
  techniques:
  - name: opaque
    passes:
    - vert: legacy/main-functions/general-vs:vert # builtin header
      frag: unlit-fs:frag
      properties: &props
        mainTexture:    { value: white }
        mainColor:      { value: [1, 1, 1, 1], editor: { type: color } }
        opacity:        { value: 1.0}
  - name: transparent
    passes:
    - vert: general-vs:vert # builtin header
      frag: unlit-fs:frag
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendSrcAlpha: src_alpha
          blendDstAlpha: one_minus_src_alpha
      properties: *props
}%

CCProgram unlit-fs %{
  precision highp float;
  #include <legacy/output>
  #include <legacy/fog-fs>

  in vec2 v_uv;
  in vec3 v_position;

  uniform sampler2D mainTexture;

  uniform Constant {
    vec4 mainColor;
    float opacity;
  };

  vec4 frag () {
    vec4 col = mainColor * texture(mainTexture, v_uv);
    col.a = opacity;
    CC_APPLY_FOG(col, v_position);
    return CCFragOutput(col);
  }
}%
1赞

我想要在代码运行过程中修改这个模型的透明度怎么办呢~

我在运行过程中尝试着去更改他的材质,但是并不生效

https://docs.cocos.com/creator/manual/zh/material-system/material-script.html#设置材质的属性

mat.setProperty("opacity", 0.5) 类似这样设置

拿到材质实例后,这样设置

opacity试过 Albedo试过 diffuse.a试过
都没生效
不知道为啥 已经绝望的要哭了

那你直接设置材质的mainColor,颜色有四个分量,r,g,b,a,a是指的是透明度

不用在创建个新材质,挂我上面写的那个shader

但是那个shader会直接就是透明的, :crying_cat_face:

只要最后a的范围是0-1,1就不是透明的,0会完全透明,我不是给你截图了吗,上面有效果呀,我写的那个shader也没干啥,就是改了输出颜色的a呀,就是刚开始在编辑器中,使用那个材质的透明的效果,然后代码拿到材质实例后,动态的改材质的参数就不会影响

大佬我在试一下~

mat.setProperty(“mainColor”, [1,1,1,0.5]) 类似这样设置 材质的颜色,最后一个是透明度,如果这个模型涉及到多个材质,那么你可能需要写一个组件,每个meshRender的,材质对应的颜色是啥,去进行处理

为啥时灵时不灵的啊,哥哥,有时候好事,重启了一下,又不好使了

确实是个麻烦事情,我不知道你那边是个啥情况,你可以分离环境做一个最小的demo。最简单的是替换材质,材质是肯定要替换的,不替换没法,因为材质的effect动态选择是透明还是不透明的,image 这个代码只能改一次,后面改不起作用

1赞

反正如果你是这个standard材质,改成透明通道,参数啥都设置好,改这个albedo的a就行了

,但是我尝试用代码去设置这个材质的mainColor还是albedo会不停的闪烁,有问题。所以呢,目前把原先得材质都copy一遍,然后改成这个transparent,使用代码直接替换材质就行了。你懂我的意思吧,一般情况下,美术的模型,程序不应该改,那么只有通过代码去替换材质

export class ChangeOpacityByMat extends Component {
    @property(Material)
    public opacityMaterial: Material = null;

    public onLoad(): void {
        const meshRenderComp = this.getComponent(MeshRenderer);

        // 替换材质列表的第一个为 opacityMaterial
        meshRenderComp.setMaterial(this.opacityMaterial, 0);
        const mat = meshRenderComp.getMaterialInstance(0);
        mat.setProperty('opacity', 0.5);
    }
}

谢谢大佬,我改成这个了,但是材质设置成transparent,两个材质紧挨着容易出现贼奇葩的透视关系image

他正常情况下应该是这个样子的
image

material?.initialize({ technique: 1 }) 这个鬼东西根本不生效