前言

后期处理:简单的说就是先渲染一张图存起来,在这张图上面"添油加醋",处理完后再渲染到屏幕上。这一过程three进行了封装,使用现成的可以更快实现需求

基本代码

// 引入后期处理基本的对象
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js'
...
//  因为是介绍后期渲染,省略场景初始化等代码

// 初始化效果组合器
this.EffectComposer = new EffectComposer(this.renderer)
// 添加基本的渲染通道
this.RenderPass = new RenderPass(this.scene, this.camera)
// 把通道加入到组合器
this.EffectComposer.addPass(this.RenderPass)

// 渲染方法,不断调用render()
_animate() {
  requestAnimationFrame(this._animate.bind(this))
  // 组合器执行渲染
 this.EffectComposer.render()
}

基本流程

  • 初始化一个效果组合器
  • 把需要用的若干通道(也就是要进行的操作)依次添加到组合器中
  • 组合器会按顺序执行各通道内的操作,上一通道的操作结果会传递给下一通道,直至最后都操作完,然后渲染到屏幕上

核心函数介绍

EffectComposer 效果组合器

作用:管理了后期处理的过程,根据通道的插入顺序,来执行通道内的代码(主要为着色器代码)

构造函数

需要传入平时初始化three场景时的渲染器WebGLRenderer, 用来后续渲染场景

// 引入
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'

this.EffectComposer = new EffectComposer(渲染器)

重要方法:

addPass

this.EffectComposer.addPass(通道)

给EffectComposer添加后期处理通道,可以添加多个,依次执行

render

this.EffectComposer.render()

渲染,循环调用通道的render()方法

RenderPass 渲染通道

构造函数

需要传入初始化场景时生成的场景对象跟相机对象

this.RenderPass = new RenderPass(this.scene, this.camera)

RenderPass通道的作用是把场景和相机作为参数传入,获得场景的渲染结果,不对渲染结果做特定处理。
简单说就是RenderPass用来生成第一张原始图,用来传给后面通道使用,所以一般RenderPass会作为第一个通道

重要属性:

renderToScreen

默认值是false,true将处理的结果保存到帧缓冲区,false直接显示在canvas画布上面。

ShaderPass 着色器通道

需要传入自定义的着色器代码,控制渲染

const effectCopyPass = new ShaderPass(着色器代码)

着色器代码格式可以参照CopyShader.js three/examples/jsm/shaders/CopyShader.js

官方案例

链接

threejs.org/examples/?q…

官方有很多封装好的通道,可以拿来直接使用

通道相关代码位置

three/examples/jsm/postprocessing/

案例演示

电脉冲故障风效果

代码

// 引入
import { GlitchPass } from 'three/examples/jsm/postprocessing/GlitchPass.js'
// 初始化通道
const Pass = new GlitchPass()
// 将此通道结果渲染到屏幕
Pass.renderToScreen = true
// 把通道加入到组合器
this.EffectComposer.addPass(Pass)

描边效果

代码

// 传入长宽、场景、相机
const Pass = new OutlinePass(new THREE.Vector2(this.width, this.height), this.scene, this.camera)
// 将此通道结果渲染到屏幕
Pass.renderToScreen = true
// OutlinePass相关属性设置
Pass.visibleEdgeColor = new THREE.Color(76, 148, 156) // 可见边缘的颜色
Pass.hiddenEdgeColor = new THREE.Color(0, 1, 0) // 不可见边缘的颜色
Pass.edgeGlow = 1.0 // 发光强度
Pass.usePatternTexture = false // 是否使用纹理图案
Pass.edgeThickness = 2.0 // 边缘浓度
Pass.edgeStrength = 2.0  // 边缘的强度,值越高边框范围越大
Pass.pulsePeriod = 0 // 闪烁频率,值越大频率越低

// 一般生产环境中会配合鼠标事件,来改变selectedObjects,使选中的物体描边
Pass.selectedObjects = [需要添加外边框的网格模型]
// 将通道加入组合器
this.EffectComposer.addPass(Pass)

泛光效果

BloomPass的参数

  • strength 泛光效果的强度,值越高明亮区域越明显,较暗区域的亮度也会变高
  • kernelSize 泛光效果的偏移量
  • sigma 锐利程度,值越高,泛光越模糊
  • resolution 泛光效果的解析图,值太低方块化就会加重

代码

// 引入
import { BloomPass } from 'three/examples/jsm/postprocessing/BloomPass.js'
import { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js'
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'

// 参数默认值strength = 1, kernelSize = 25, sigma = 4, resolution = 256
const Pass = new BloomPass(2.5, 25, 0.1, this.width)
// 加入到组合器
this.EffectComposer.addPass(Pass)

// BloomPass通道不能通过renderToScreen=true将结果渲染到屏幕上,
// 所以需要再加一个通道effectCopyPass来完成输出结果这一步
// effectCopyPass通道没有任何特殊效果, 只是输出结果
const effectCopyPass = new ShaderPass(CopyShader)
effectCopyPass.renderToScreen = true
// 加入到组合器
this.EffectComposer.addPass(effectCopyPass)

总结

此文只介绍了几个案例的基本使用,只要掌握使用的流程,其他的案例也可以很好的上手

到此这篇关于threejs后期处理的基本使用方法之加特效的文章就介绍到这了,更多相关threejs后期加特效内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

threejs后期处理的基本使用方法之加特效的更多相关文章

  1. JavaScript三种常用网页特效详解

    这篇文章主要介绍了可以用JavaScript实现的常用的三种网页特效:offset系列、client系列、scroll系列。文中示例代码简洁易懂,感兴趣的小伙伴可以了解一下

  2. 使用threejs实现第一人称视角的移动的问题(示例代码)

    第一人称视角的场景巡检主要需要解决两个问题,人物在场景中的移动和碰撞检测。移动与碰撞功能是所有三维场景首先需要解决的基本问题,今天我们就通过最基本的threejs来完成第一人称视角的场景巡检功能,感兴趣的朋友一起看看吧

  3. 解决threeJS加载obj gltf模型后颜色太暗的方法

    这篇文章主要为大家介绍了解决threeJS加载obj gltf模型后颜色太暗的方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. vue2.x引入threejs的实例代码

    这篇文章主要介绍了vue2.x引入threejs,如果在开发过程中出现threejs生成的canvas出现外边框,只需要用css样式修改,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

  5. 如何用threejs实现实时多边形折射

    这篇文章主要介绍了如何用threejs实现实时多边形折射,对three.js库感兴趣的同学,可以参考下

  6. iOS动画实现雨花与樱花特效

    小编今天为大家带来一场淅淅沥沥的夜空之雨和满天飞舞的樱花之恋,希望能在炎炎夏日为您带来一丝清爽的凉意!学习iOS动画的小伙伴们可以参考学习。

  7. ThreeJS从创建场景到使用功能实例详解

    threejs是一个用于在浏览器中绘制3D图像的JS库,它是基于webgl实现了,包括了webgl1和webgl2的渲染引擎,下面这篇文章主要给大家介绍了关于ThreeJS从创建场景到使用功能的相关资料,需要的朋友可以参考下

  8. JS实现简单的下雪特效示例详解

    很多南方的小伙伴可能没怎么见过或者从来没见过下雪,这篇文章小编给大家带来一个小Demo,模拟了下雪场景。感兴趣的小伙伴快来跟随小编一起学习一下吧

  9. 利用Android实现光影流动特效的方法详解

    Flutter 的画笔类 Paint 提供了很多图形绘制的配置属性,来供我们绘制更丰富多彩的图形。本篇我们引入一个 Paint 类新的属性:maskFilter,再结合之前的 shader 和动画,制作出光影流动特效,感兴趣的可以尝试一下

  10. Flutter实现心动的动画特效

    为了追求更好的用户体验,有时候我们需要一个类似心跳一样跳动着的控件来吸引用户的注意力。本文将利用Flutter实现这一动画特效,需要的可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部