Definition: GaussianBlurPass
GaussianBlurPass 是 FivePass 的子类,用于实现高斯模糊效果。其核心接口如下:
import * as THREE from 'three';
import { FivePass } from './pass';
import { type Camera } from '../../../core/camera';
export class GaussianBlurPass extends FivePass {
// 构造函数,传入相机实例
constructor(camera: Camera);
// 设置模糊半径
public setRadius(radius: number): void;
// 渲染方法(由 EffectComposer 调用)
public render(
renderer: THREE.WebGLRenderer,
writeBuffer: THREE.WebGLRenderTarget,
readBuffer: THREE.WebGLRenderTarget,
deltaTime: number,
maskActive?: boolean,
): void;
// 释放资源
public dispose(): void;
}
该通道使用 ShaderMaterial,包含以下 uniforms:
| Uniform | Type | Default | Description |
|---|---|---|---|
colorMap |
THREE.Texture |
null |
输入纹理(来自 readBuffer) |
resolution |
THREE.Vector2 |
相机分辨率 |
渲染目标的分辨率 |
radius |
number |
4.0 |
模糊采样半径(像素数) |
sigma |
number |
4.0 |
高斯核的标准差 |
GaussianBlurPass 是 Three.js EffectComposer 生态中的一个通道。它接收前一个通道的输出(readBuffer),进行高斯模糊处理后,输出到下一个通道或屏幕(writeBuffer 或 renderToScreen)。
该通道采用离散高斯核进行模糊。在 fragment shader 中:
radius 定义)计算高斯权重sigma 值计算高斯分布的形状构造函数需传入 Camera 实例,用于获取当前渲染分辨率。通过 camera.resolution 自动同步分辨率变化,确保模糊效果在窗口 resize 时保持正确。
通过 setRadius() 方法调整模糊效果强度:
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
radius |
number |
4.0 |
0 ~ 8 |
采样半径(像素),值越大模糊越明显 |
sigma |
number |
4.0 |
0.1 ~ 10 |
高斯核标准差,控制模糊的柔和度 |
注意:当前实现中
sigma固定为 4.0,仅radius可动态调整。如需修改sigma,需直接访问material.uniforms.sigma.value。
constructor(camera: Camera)初始化高斯模糊通道,需传入相机实例以获取分辨率信息。
setRadius(radius: number)动态调整模糊半径。
radius - 采样半径,建议范围 1 ~ 8render(...)由 EffectComposer 在每一帧自动调用,用于执行模糊处理。通常不需要手动调用。
dispose()释放 Shader Material 和 FullScreenQuad 资源。在销毁 Pass 时必须调用,以防内存泄漏。
import { Five } from '@realsee/five';
import { GaussianBlurPass } from '../../lib/five/renderer/postprocessing';
const five = new Five();
// 使用 Five 的 addPass() 方法添加后处理通道
const blurPass = new GaussianBlurPass(five.camera);
five.addPass(blurPass);
// 动画循环由 Five 内部管理
function animate() {
requestAnimationFrame(animate);
five.render();
}
animate();
const blurPass = new GaussianBlurPass(five.camera);
five.addPass(blurPass);
// 响应用户输入调整模糊半径
document.addEventListener('keydown', (e) => {
if (e.key === '+') {
const current = blurPass['material'].uniforms.radius.value;
blurPass.setRadius(Math.min(8, current + 0.5));
}
if (e.key === '-') {
const current = blurPass['material'].uniforms.radius.value;
blurPass.setRadius(Math.max(0, current - 0.5));
}
});
// Five 的 addPass() 会自动管理后处理链
const blurPass = new GaussianBlurPass(five.camera);
five.addPass(blurPass);
// 可添加其他后处理通道
// five.addPass(otherPass);
const blurPass = new GaussianBlurPass(five.camera);
five.addPass(blurPass);
// 获取 Material 并直接修改 sigma
const sigmaMaterial = blurPass['material'] as THREE.ShaderMaterial;
sigmaMaterial.uniforms.sigma.value = 2.0; // 调整标准差(更强锐利)
renderToScreen 为 true,或后续通道正确读取该通道的输出。camera 对象有有效的 resolution 属性。radius 值会导致 GPU 开销增加。建议在性能受限的设备上限制最大 radius(如 ≤ 6)。blurPass.enabled = false)。// 监控当前模糊参数
const blurPass = new GaussianBlurPass(five.camera);
console.log('Blur Radius:', blurPass['material'].uniforms.radius.value);
console.log('Blur Sigma:', blurPass['material'].uniforms.sigma.value);
console.log('Resolution:', blurPass['material'].uniforms.resolution.value);
忘记调用 dispose()
blurPass.dispose() 释放 Shader 资源,否则会导致内存泄漏。分辨率变化未更新
camera.resolution 同步分辨率,无需手动处理。但如果使用自定义相机,需确保其 resolution 属性始终有效。设置过大的 radius
与其他 Pass 的 needsSwap 冲突
needsSwap 值,可能导致缓冲区错乱。确保通道顺序和 swap 设置一致。tags: [模糊, 高斯模糊, 毛玻璃, 背景虚化, postprocessing, shader, effect, blur, pass, rendering, gaussian, blur-effect]