【Three.js】知识梳理二十:Three.js后处理EffectComposer

1,343 阅读4分钟

在现代Web应用中,后处理(Post-Processing)效果是提升3D场景视觉效果的重要手段。Three.js提供了EffectComposer来实现复杂的后处理效果。本文将详细介绍EffectComposer的基本概念、使用方法以及几个常见的后处理效果的实现。

1. 后处理与EffectComposer概述

后处理是指在渲染场景后对图像进行额外处理,以实现各种视觉效果,如模糊、景深、颜色校正等。Three.js的EffectComposer是一个用于处理后期效果的工具,它可以通过一系列的Pass(处理单元)来实现复杂的后处理效果。

EffectComposer是一个附加组件,必须显式导入。

import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';

构造函数

EffectComposer(renderer: WebGLRenderer, renderTarget: WebGLRenderTarget)
  • renderer: 用于渲染场景的渲染器。
  • renderTarget: (可选)EffectComposer内部使用的预配置渲染目标。

EffectComposer的基本工作流程如下:

  1. 创建一个EffectComposer实例。
  2. 添加渲染目标和一系列的Pass。
  3. 在渲染循环中调用composer的render方法。

属性

属性名称类型描述
.passesArray表示(有序)后处理Pass链的数组
.readBufferWebGLRenderTarget对内部读取缓冲区的引用
.rendererWebGLRenderer对内部渲染器的引用
.renderToScreenBoolean最终Pass是否渲染到屏幕(默认帧缓冲区)
.writeBufferWebGLRenderTarget对内部写入缓冲区的引用

方法

方法名称参数描述
.addPass(pass: Pass)pass: 要添加到Pass链中的Pass将给定的Pass添加到Pass链中
.dispose()释放该实例分配的与GPU相关的资源
.insertPass(pass: Pass, index: Integer)pass: 要插入到Pass链中的Pass; index: 定义Pass应插入的位置将给定的Pass插入到给定索引的Pass链中
.isLastEnabledPass(passIndex: Integer)passIndex: 要检查的Pass索引如果给定索引的Pass是Pass链中的最后一个启用Pass,则返回true
.removePass(pass: Pass)pass: 要从Pass链中移除的Pass从Pass链中移除给定的Pass
.render(deltaTime: Float)deltaTime: 增量时间值按顺序执行所有启用的后处理Pass,以生成最终帧
.reset(renderTarget: WebGLRenderTarget)renderTarget: 可选,预配置渲染目标重置EffectComposer的内部状态
.setPixelRatio(pixelRatio: Float)pixelRatio: 设备像素比设置设备像素比,通常用于HiDPI设备,以防止输出模糊
.setSize(width: Integer, height: Integer)width: EffectComposer的宽度; height: EffectComposer的高度根据设备像素比调整内部渲染缓冲区和Pass的大小
.swapBuffers()交换内部读/写缓冲区

2. 设置EffectComposer

首先,需要在Three.js场景中设置EffectComposer。以下是一个基本的示例代码:

// 创建一个渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
​
// 创建一个场景
const scene = new THREE.Scene();
​
// 创建一个相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
​
// 创建一个EffectComposer
const composer = new THREE.EffectComposer(renderer);
​
// 创建一个渲染通道(RenderPass)并添加到composer中
const renderPass = new THREE.RenderPass(scene, camera);
composer.addPass(renderPass);

3. 添加后处理效果

EffectComposer通过不同的Pass来实现各种后处理效果。以下是几个常见的后处理效果及其实现方法:

道具(BloomPass)

道具效果可以为场景中的亮区添加发光效果。可以使用UnrealBloomPass实现:

image.png

const bloomPass = new THREE.UnrealBloomPass(
  new THREE.Vector2(window.innerWidth, window.innerHeight),
  1.5, 0.4, 0.85
);
composer.addPass(bloomPass);

颜色校正(ColorCorrectionPass)

颜色校正用于调整场景的颜色,可以使用ShaderPass来实现:

image.png

const colorCorrectionShader = {
  uniforms: {
    'tDiffuse': { value: null },
    'powRGB': { value: new THREE.Vector3(2, 2, 2) }
  },
  vertexShader: /* vertex shader code */,
  fragmentShader: /* fragment shader code */
};
​
const colorCorrectionPass = new THREE.ShaderPass(colorCorrectionShader);
composer.addPass(colorCorrectionPass);

景深(DepthOfFieldPass)

景深效果用于模拟相机的焦点,可以使用BokehPass实现:

image.png

const bokehPass = new THREE.BokehPass(scene, camera, {
  focus: 1.0,
  aperture: 0.025,
  maxblur: 1.0,
  width: window.innerWidth,
  height: window.innerHeight
});
composer.addPass(bokehPass);

4. 在渲染循环中使用EffectComposer

在渲染循环中,使用composer的render方法来渲染场景并应用后处理效果:

function animate() {
  requestAnimationFrame(animate);
  // 通过composer渲染场景
  composer.render();
}
​
animate();

5. 官方示例

示例名称描述示例地址
postprocessing后处理基础效果three.js examples (threejs.org)
postprocessing advanced高级后处理效果three.js examples (threejs.org)
postprocessing backgrounds背景后处理效果three.js examples (threejs.org)
postprocessing transition过渡效果three.js examples (threejs.org)
postprocessing depth-of-field景深效果three.js examples (threejs.org)
postprocessing depth-of-field 2第二种景深效果three.js examples (threejs.org)
postprocessing fxaa快速近似抗锯齿效果(FXAA)three.js examples (threejs.org)
postprocessing glitch故障效果three.js examples (threejs.org)
postprocessing godrays上帝光效果three.js examples (threejs.org)
postprocessing gtao屏幕空间环境光遮蔽(GTAO)three.js examples (threejs.org)
postprocessing masking遮罩效果three.js examples (threejs.org)
postprocessing material ao材质环境光遮蔽three.js examples (threejs.org)
postprocessing outline轮廓效果three.js examples (threejs.org)
postprocessing pixelate像素化效果three.js examples (threejs.org)
postprocessing procedural程序生成效果three.js examples (threejs.org)
postprocessing rgb halftoneRGB半色调效果three.js examples (threejs.org)
postprocessing sao屏幕空间环境光遮蔽(SAO)three.js examples (threejs.org)
postprocessing smaa亚像素形态抗锯齿(SMAA)three.js examples (threejs.org)
postprocessing sobelSobel边缘检测three.js examples (threejs.org)
postprocessing ssaa超级采样抗锯齿(SSAA)three.js examples (threejs.org)
postprocessing ssao屏幕空间环境光遮蔽(SSAO)three.js examples (threejs.org)
postprocessing taa时间抗锯齿(TAA)three.js examples (threejs.org)
postprocessing unreal bloom虚幻引擎风格的发光效果three.js examples (threejs.org)
postprocessing unreal bloom selective选择性虚幻引擎风格的发光效果three.js examples (threejs.org)

EffectComposer是Three.js中实现后处理效果的强大工具。通过组合不同的Pass,可以实现各种复杂的视觉效果,提升3D场景的视觉吸引力。本文介绍的设置EffectComposer的基本步骤以及几个常见的后处理效果,希望能为你的Three.js项目带来灵感。