
 上图提供两种方式溶解显示
 上面一排是根据现实的图案红色通道也就是r值进行溶解
 下面一排提供额外的溶解纹理
 可以通过简单更改呈现多种溶解图案
代码仓库 gitee
b站账号:https://space.bilibili.com/374230437
interface IMapPath {
    map: string;
    dissolve?: string;
}
export class Dissolve {
    material: ShaderMaterial | MeshStandardMaterial;
    mesh: Mesh<BufferGeometry, typeof this.material>;
    constructor(private mapPaths: IMapPath, private gui: ThreeHelper["gui"]) {
        this.material = this.CustomMaterial();
        this.mesh = new Mesh(new IcosahedronGeometry(3, 5), this.material);
        // this.mesh = new Mesh(new SphereGeometry(3, 36, 36), this.material);
        // this.mesh = new Mesh(new BoxGeometry(3, 3, 3), this.material);
        gui?.add(<any>this.material.uniforms.iProgress, "value", 0, 1);
        this.mesh.onAfterRender = () => {
            (this.material as ShaderMaterial).uniforms.iProgress.value += 0.01;
        };
    }
    CustomMaterial(): ShaderMaterial {
        const material = new ShaderMaterial({
            transparent: true,
            uniforms: {
                iTime: { value: 0 },
                iProgress: { value: 0 },
                map: {
                    value: new TextureLoader().load(this.mapPaths.map),
                },
                dissolveMap: {
                    value:
                        this.mapPaths.dissolve &&
                        new TextureLoader().load(this.mapPaths.dissolve),
                },
            },
            vertexShader: `
            varying vec2 vUv;
            void main() {
                vUv = uv;
                vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);
                gl_Position = projectionMatrix * modelViewPosition;
            }`,
            fragmentShader: `
            uniform float iTime;
            varying vec2 vUv;
            uniform float iProgress;
            uniform sampler2D map;
            uniform sampler2D dissolveMap;
            void main( ) {
                vec3 diffuse = texture(map,vUv).rgb;
                ${
                    this.mapPaths.dissolve
                        ? "vec3 dissolve = texture(dissolveMap,vUv).rgb;"
                        : "vec3 dissolve = diffuse;"
                }
                float t = iProgress;
                float edge_width = mix(0.0,0.5, t);
                
                float edge =  smoothstep(dissolve.r - edge_width, dissolve.r, t);
                vec4 edgeColor = vec4(0.6,0.2,0.1, 1.0);
              
                diffuse += edgeColor.rgb * (1.0 - edge);
                gl_FragColor = vec4(diffuse,edge);
            }
            `,
        });
        return material;
    }
}
                
![2023年中国康养产业发展历程、65岁以上人口数量及市场规模分析[图]](https://img-blog.csdnimg.cn/img_convert/283919905537aebcee1ec4bd218cf62d.png)

















