问题一,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);
}
}%
我想要在代码运行过程中修改这个模型的透明度怎么办呢~
我在运行过程中尝试着去更改他的材质,但是并不生效
mat.setProperty("opacity", 0.5) 类似这样设置
拿到材质实例后,这样设置
opacity试过 Albedo试过 diffuse.a试过
都没生效
不知道为啥 已经绝望的要哭了
那你直接设置材质的mainColor,颜色有四个分量,r,g,b,a,a是指的是透明度
不用在创建个新材质,挂我上面写的那个shader
但是那个shader会直接就是透明的, 
只要最后a的范围是0-1,1就不是透明的,0会完全透明,我不是给你截图了吗,上面有效果呀,我写的那个shader也没干啥,就是改了输出颜色的a呀,就是刚开始在编辑器中,使用那个材质的透明的效果,然后代码拿到材质实例后,动态的改材质的参数就不会影响
大佬我在试一下~
mat.setProperty(“mainColor”, [1,1,1,0.5]) 类似这样设置 材质的颜色,最后一个是透明度,如果这个模型涉及到多个材质,那么你可能需要写一个组件,每个meshRender的,材质对应的颜色是啥,去进行处理
为啥时灵时不灵的啊,哥哥,有时候好事,重启了一下,又不好使了
确实是个麻烦事情,我不知道你那边是个啥情况,你可以分离环境做一个最小的demo。最简单的是替换材质,材质是肯定要替换的,不替换没法,因为材质的effect动态选择是透明还是不透明的,
这个代码只能改一次,后面改不起作用
反正如果你是这个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,两个材质紧挨着容易出现贼奇葩的透视关系
他正常情况下应该是这个样子的

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


