首页 > 其他分享 >Three.js自定义shader实现离相机越近越透明效果

Three.js自定义shader实现离相机越近越透明效果

时间:2023-03-20 10:00:42浏览次数:37  
标签:opacity 自定义 float THREE shader vUv Three varying new


Three.js自定义shader实现离相机越近越透明效果_javascript

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
);

Three.js自定义shader实现离相机越近越透明效果_three.js_02

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.);
}

`,
});


标签:opacity,自定义,float,THREE,shader,vUv,Three,varying,new
From: https://blog.51cto.com/u_15964288/6131822

相关文章

  • Java stream sorted自定义排序规则实现多字段排序
      Stream提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象。在《Javastreamsorted使用Comparator进......
  • Three.js 进阶之旅:物理效果-3D乒乓球小游戏
    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。摘要本文在专栏上一篇内容《Three.js进阶之......
  • fastadmin 自定义build_toolbar按钮
    fastadmin自定义build_toolbar按钮何渊渊于2020-09-2311:13:31发布1930收藏4分类专栏:fastadmin文章文章标签:javascriptphp版权fastadmin同时被2个专栏收......
  • 自定义异常回滚@Transactional注解
    //重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()@Override@Transactional(rollbackFor=RuntimeExcep......
  • 【Android开发】用户界面设计-开发自定义的View
    效果图:Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成的。View是所有UI组件的基类(父类),为ViewGroup类是容纳这些UI组件的容器,其本身也是View的子类。关......
  • Visual Studio自定义代码片段
    问题描述VisualStudio提供了CodeSnippetManager功能,这使得用户可以自定义代码片段。用户可以在CodeSnippetManager中创建自己的代码片段,并指定一个唯一的提示符。一......
  • 自定义指令
    Vue是一个流行的JavaScript框架,它允许开发人员构建动态的用户界面和单页应用程序。Vue的灵活性使其成为开发人员的首选框架之一,其中一个重要的原因是其能够自定义指令,以便......
  • 使用Vue自定义组件完成10×10图片表格的点击效果
    1.创建一个web项目,使用<script>引入Vue.js代码如下:<scripttype="text/javascript"src="js/vue.js"></script> 2.创建vue实例<divid="app"></div><scrip......
  • Vue指令:内置指令和自定义指令
    Vue指令Vue指令指的是,以v-开头的一组特殊语法内置指令v-textv-text指令的作用是:设置标签的内容默认写法会替换全部内容,差值表达式{{}}只会替换指定内容内部......
  • C语言自定义数据类型之结构体
    一、结构体1.1结构体的声明语法struct对象名{成员列表;};1.2结构体声明的解释结构体其实与我们在数学中学过的集合本质相同比如,现在有一个描述房子的集合,集合里有许多元素,......