threejs-后期通道效果汇总


前言

Threejs提供了很多后期处理通道,配合 THREE.EffectComposer可实现各种效果,本文列举Threejs包含的通道及效果。


后期处理通道汇总

API效果说明
THREE.AdaptiveToneMappingPass根据场景光照强度自动调节场景亮度
THREE.BloomPass增强场景中的明亮区域模拟现实世界中的摄像机
THREE.BokehPass实现类似于大光圈镜头的景深效果
THREE.ClearPass清空纹理缓存
THREE.CubeTexturePass渲染天空盒
THREE.DotScreenPass将黑点图层应用到屏幕的原始图片上
THREE.FilmPass通过扫描线和失真来模拟电视屏幕效果
THREE.GlitchPass随机在屏幕上显示电脉冲
THREE.HalftonePass模拟传统印刷中的半色调效果,通过网格点大小和疏密表现亮度
THREE.MaskPass在当前区域添加掩码,后续的通道只会影响掩码区域
THREE.OutlinePass勾勒场景中的轮廓
THREE.RenderPass在当前场景和摄像机上渲染出一个新的场景
THREE.SAOPass 、THREE.SSAOPass实现实时环境光遮挡效果
THREE.SMAAPass、THREE.SSAARenderPass添加全屏反锯齿效果
THREE.SSAARenderPass根据场景光照强度自动调节场景亮度
THREE.SavePass反复当前的渲染效果
THREE.ShaderPass接收自定义的着色器,生成一个高级、自定义的后期处理通道
THREE.TAARenderPass一种全屏反锯齿效果
THREE.AdaptiveToneMappingPass根据场景光照强度自动调节场景亮度
THREE.TexturePass将其它组合器的当前状态保存为纹理,将其参数传入到其它的组合器里
THREE.UnrealBloomPass与THREE.Bloom类似的泛光,效果接近于Unreal 3D

简单通道效果

列举常用的简单通道

FilmPass

通过扫描线和失真来模拟电视屏幕效果

	const renderPass = new RenderPass(scene, camera);
    const effectFilm = new FilmPass(0.8, 0.325, 256, false);
    effectFilm.renderToScreen = true;
    
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(effectFilm);

在这里插入图片描述

DotScreenPass

黑点图层

    const renderPass = new RenderPass(scene, camera);
    const dotScreenPass = new DotScreenPass();   
    dotScreenPass.renderToScreen = true;
    
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(dotScreenPass);

在这里插入图片描述

BloomPass

增强场景中的明亮区域

实现这个功能注意两点:

  • BloomPass 不能直接渲染至屏幕上,可借助 ShaderPass
  • 在渲染更新时将 render.autoClear 设置为false并调用 render.clear(),否则渲染场景会被清空
	import { ShaderPass } from "three/examples/jsm/postprocessing/ShaderPass.js";
	...
    const renderPass = new RenderPass(scene, camera);
    const effectCopy = new ShaderPass(CopyShader);
    effectCopy.renderToScreen = true;
    const bloomPass = new BloomPass();

    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(bloomPass);
    composer.current.addPass(effectCopy);

	···
	const renderScene = useCallback(() => {
    	console.log('renderScene')
    	const delta = clock.current.getDelta();
    	window.requestAnimationFrame(() => renderScene())
    	controls.update();
    	earthRef.current.rotation.y += 0.001;
    	render.autoClear = false;
    	render.clear();
    	// render.render(scene,camera);
    	composer.current.render(delta);
  }, [render])

在这里插入图片描述

UnrealBloomPass

效果更接近于Unreal 3D 的泛光效果

	const unrealBloomPass = new UnrealBloomPass();
    const renderPass = new RenderPass(scene, camera);
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(unrealBloomPass);

在这里插入图片描述

OutlinePass

勾勒场景中的轮廓

    const outlinePass = new OutlinePass(
      new THREE.Vector2(window.innerWidth, window.innerHeight),
      scene,
      camera,
      [earthRef.current]);
    const renderPass = new RenderPass(scene, camera);
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(outlinePass);

在这里插入图片描述

GlitchPass

随机生成电脉冲效果

	const glitchPass = new GlitchPass();
    const renderPass = new RenderPass(scene, camera);
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(glitchPass);

在这里插入图片描述

HalftonePass

模拟传统印刷中的半色调效果

    const halftonePass = new HalftonePass();
    const renderPass = new RenderPass(scene, camera);
    composer.current = new EffectComposer(render);
    composer.current.addPass(renderPass);
    composer.current.addPass(halftonePass);

在这里插入图片描述

高级通道效果

掩码效果MaskPass

为指定的场景添加通道效果

  • 场景三个场景,分别存放背景;地球;火星
  • 使用 EffectComposer 将三个场景放置在一个 render下
  • 分布为地球和火星添加颜色效果

在这里插入图片描述

景深效果 BokehPass

使得指定场景的那一部分处在景深效果中(模糊虚化)

在这里插入图片描述

景自定义效果 ShaderPass

ShaderPass提供了许多封装完成着色器程序来添加自定义效果

ShaderPass具体的种类和源码可去three\examples\js\shaders 查阅,下面是其中一部分:

在这里插入图片描述

总结

  • 后期处理通道汇总

  • 简单通道效果列举

  • 高级通道效果列举

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 小程序 threejs-miniprogram 可以通过改变物体的位置实现平移操作。 在 threejs-miniprogram 中,可以使用 Vector3 对象来表示物体的位置,Vector3 是三维空间中的一个点,可以包含 x、y、z 三个坐标。通过改变 Vector3 对象的坐标值,即可实现物体的平移。 具体实现步骤如下: 1. 首先,通过创建一个 Vector3 对象表示需要平移的物体的当前位置。例如,可以使用如下代码创建一个初始位置为 (0, 0, 0) 的 Vector3 对象: ```javascript var position = new THREE.Vector3(0, 0, 0); ``` 2. 接下来,根据需求确定平移的距离和方向,并将其添加到 Vector3 对象的坐标值上。例如,如果需要在 x 方向上平移 10 个单位,可以使用如下代码: ```javascript position.x += 10; ``` 可以根据需要在其他坐标轴上进行相应的平移操作。 3. 最后,将改变后的 Vector3 对象赋值给物体的位置属性,即可实现物体的平移。例如,可以使用如下代码将改变后的位置赋值给物体的 position 属性: ```javascript object.position.copy(position); ``` 其中,object 为需要平移的物体对象。 通过以上步骤可以实现小程序 threejs-miniprogram 中物体的平移操作。可以根据具体需求修改平移的距离和方向,从而实现不同的平移效果。 ### 回答2: threejs-miniprogram 是一款基于小程序的三维渲染库,能够在小程序中实现三维模型的展示和交互。要实现平移功能,可以按照以下步骤进行操作。 首先,在合适的位置引入 threejs-miniprogram 库,并创建一个 canvas 组件,作为渲染的画布。 然后,在小程序中定义一个相机、一个场景和一个渲染器。相机用于控制视角,场景用于存放物体,渲染器用于将场景中的物体渲染到画布上。 接下来,创建一个物体,可以是一个几何体或者一个模型。将该物体添加到场景中。 在实现平移功能时,可以通过监听鼠标或触摸事件,获取用户的输入信息。根据用户的操作,改变物体在场景中的位置。 例如,可以通过监测鼠标移动事件,获取鼠标的位置差异,并将物体的位置与鼠标位置差异相加,从而实现物体的平移效果。需要注意的是,物体的位置变化需要实时更新,并且平移的距离应与屏幕上的实际距离有一个合适的映射关系,以确保平移的实际效果符合用户的期望。 最后,更新场景中的物体位置,并将场景渲染到画布上,以展示平移后的效果。 通过以上步骤,就可以在小程序中使用 threejs-miniprogram 实现平移功能。需要根据实际需求,调整代码中的参数和细节,以适应具体的项目。 ### 回答3: 在使用threejs-miniprogram进行小程序开发时,我们可以通过平移操作来改变物体的位置。平移操作可以让物体在三维空间中沿着指定的方向移动一定的距离。 在threejs-miniprogram中,我们可以通过调整物体的位置属性来实现平移。首先,我们需要创建一个平移向量,它包含了物体在各个轴上的平移距离。然后,我们可以通过将这个平移向量与物体的位置属性相加,来实现平移操作。 举个例子,假设我们有一个立方体,它的初始位置是(0, 0, 0)。如果我们想将立方体沿着x轴方向平移3个单位,我们可以创建一个平移向量(3, 0, 0),然后将这个平移向量与立方体的位置属性相加,即可实现平移操作。 具体的代码如下所示: ```javascript var cube = new THREE.Mesh(geometry, material); // 创建立方体 var translateVector = new THREE.Vector3(3, 0, 0); // 创建平移向量 cube.position.add(translateVector); // 平移操作,将平移向量与立方体的位置属性相加 ``` 这样,立方体就会沿着x轴方向平移3个单位。 需要注意的是,在进行平移操作时,我们需要将平移向量与物体的位置属性相加,而不是简单地将平移向量赋值给物体的位置属性。这样才能在每次平移操作后保留之前的平移信息。 所以,在使用threejs-miniprogram平移物体时,我们只需要创建平移向量,并将其与物体的位置属性相加即可。这样就能实现物体的平移操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值