three.js 使用着色器,如何判断模型顶部,不添加贴图

export const allShare={

uniforms:{
    u_tcolor: { value: new THREE.Color('#ffffff') },
    u_r: { value: 0.25 },
    u_length: { value: 20 }, //扫过区域
    u_height:{value:30.5},
    map:{
        type:'t',
        value:new THREE.TextureLoader().load('static/model/wg/color2.jpg')
    }
},
vertexShader:`
   varying vec3 vp;
   varying vec2 vUv;
    varying vec3 vNormal;
    void main(){
       vUv=uv;
       vp = position;
       vNormal=normal;
       gl_Position    = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
`,
fragmentShader:`
   varying vec3 vp;
            uniform sampler2D map;
            uniform vec3 u_tcolor;
            uniform float u_r;
            uniform float u_length;
            varying vec2 vUv;
            varying vec3 vNormal;
            float getLeng(float x, float y){
                return  sqrt((x-0.0)*(x-0.0)+(y-0.0)*(y-0.0));
            }
            void main(){ 
                float uOpacity = 0.3; 
                float uLength = getLeng(vp.x,vp.y);
               vec3 vColor =texture2D(map,vUv).rgb;
                if ( uLength <= u_r && uLength > u_r - u_length ) { 
                    float op = sin( (u_r - uLength) / u_length ) * 0.6 + 0.3 ;
                    uOpacity = op; 
                     vColor = u_tcolor;
                }
                gl_FragColor = vec4(vColor,uOpacity);
            }
`,
shareMaterial:()=>{
    return new THREE.ShaderMaterial({
        uniforms: allShare.uniforms,
        vertexShader: allShare.vertexShader,
        fragmentShader: allShare.fragmentShader
    })
}

}

阅读 1.5k
1 个回答

根据法向量判断是否是在顶部
vec3 vColor =vec3(0.7,0.5,1.0);
if(vNormal.z<1.0){

vec3 vColor =texture2D(map,vUv).rgb;

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进