const customShader = new THREE.ShaderMaterial({
uniforms: {},
defines: { nearDis: 0.3 },
transparent: true,
side: THREE.DoubleSide,
vertexShader: `
varying vec2 vUv;
varying float opacity;
void main() {
vUv = uv;
float dis = distance(position,cameraPosition);
opacity = 1.0;
if(dis < nearDis){
opacity = dis / nearDis;
}
vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * viewPosition;
}
`,
fragmentShader: `
varying vec2 vUv;
varying float opacity;
void main() {
vec3 color = vec3(vUv.y,vUv.y,1.);
gl_FragColor = vec4(color, opacity);
}
`,
});
const plane = new THREE.Mesh(
new THREE.PlaneGeometry(1, 1, 100, 100),
// new THREE.BoxGeometry(1, 1, 1, 10, 10, 10),
customShader
// material
);
const plane = new THREE.Mesh(
// new THREE.PlaneGeometry(1, 1, 200, 200),
new THREE.BoxGeometry(1, 1, 1, 10, 10, 10),
stripeShader
// material
);
helper.add(plane);
/**
* 离相机进的点 条纹展示
*/
const stripeShader = new THREE.ShaderMaterial({
uniforms: {},
defines: { nearDis: 1.01 },
side: THREE.DoubleSide,
vertexShader: `
varying vec2 vUv;
varying vec3 vPos;
varying float opacity;
void main() {
vUv = uv;
vPos = position;
float dis = distance(position,cameraPosition);
opacity = 1.0;
if(dis < nearDis){
opacity = 0.;
}
vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * viewPosition;
}
`,
fragmentShader: `
varying vec2 vUv;
varying vec3 vPos;
varying float opacity;
void main() {
vec3 color = vec3(vUv.y,vUv.y,1.);
if(opacity != 1.){
if(mod(floor(vPos.y / 0.01),2.0) == 0.0){
discard;
}
}
gl_FragColor = vec4(color, 1.);
}
`,
});