FivePass 类及 Pass 接口。Definition: FivePass
/**
* Pass 接口 (兼容 three.js EffectComposer)
*/
export interface Pass {
enabled: boolean;
needsSwap: boolean;
clear: boolean;
renderToScreen: boolean;
setSize(width: number, height: number): void;
render(
renderer: THREE.WebGLRenderer,
writeBuffer: THREE.WebGLRenderTarget,
readBuffer: THREE.WebGLRenderTarget,
deltaTime?: number,
maskActive?: boolean
): void;
}
/**
* FivePass 基类
* 支持 G-Buffer 注入 (depth, normal, color)
*/
export class FivePass implements Pass {
public enabled: boolean = true;
public needsSwap: boolean = true;
public clear: boolean = false;
public renderToScreen: boolean = true;
public dependencies: ('depth' | 'normal' | 'color')[];
// 由 EffectComposer 在 render 时注入
public gbuffer!: Map<'depth' | 'normal' | 'color', THREE.Texture>;
constructor(dependencies?: ('depth' | 'normal' | 'color')[]);
// ... render method implementation
}
dependencies,Five 会在渲染 Pass 之前准备好所需的 G-Buffer (如深度图、法线图),避免在每个 Pass 中重复渲染场景。Five 默认挂载了两个 Pass 实例,挂载在 five 实例上,默认是关闭状态。
位于 five.adaptiveLuminancePass。
five.adaptiveLuminancePass.enabled = true。luminanceScale (number): 亮度缩放系数,影响最终画面的整体亮度。luminanceStep (number): 亮度适应步长,影响适应速度。位于 five.eyeDomeLightingPass。
five.eyeDomeLightingPass.enabled = true。strength (number): 增强强度,值越大轮廓越明显。radius (number): 采样半径,影响阴影的范围。Five 新增了三个可选使用的内置 Pass,这些 Pass 没有预先挂载在 five 实例上,需手动导入并添加到渲染链中:
import { GaussianBlurPass } from '@realsee/five';
// 1. 创建 GaussianBlurPass 实例 (需要传入 camera)
const gaussianBlurPass = new GaussianBlurPass(five.camera);
// 2. 配置参数
// 设置模糊半径 (默认 4.0)
gaussianBlurPass.setRadius(6);
// 3. 将 Pass 添加到渲染链
five.addPass(gaussianBlurPass);
// 4. (可选) 动态开关
// gaussianBlurPass.enabled = false;
// 5. (可选) 移除 Pass
// five.removePass(gaussianBlurPass);
如果需要实现自定义的后处理效果(如景深、色彩校正、描边等),建议继承 FivePass。
FivePass。super() 中传入需要的 G-Buffer 依赖 (如 ['depth'])。readBuffer 作为输入,将结果渲染到 writeBuffer (或直接渲染到屏幕)。five.addPass(pass) 将其实例添加到渲染链中。import { Five } from '@realsee/five';
const five = new Five();
// 开启自适应亮度
five.adaptiveLuminancePass.enabled = true;
five.adaptiveLuminancePass.luminanceScale = 0.5; // 调整目标亮度
// 开启 EDL (通常用于点云模式)
five.eyeDomeLightingPass.enabled = true;
five.eyeDomeLightingPass.strength = 1.5; // 增强轮廓感
five.needsRender = true;
import * as THREE from 'three';
import { Five, FivePass } from '@realsee/five';
import { FullScreenQuad } from '@realsee/five/lib/five/tools/full-screen-quad'; // 需根据实际路径引用
// 1. 定义 Shader
const grayscaleVertexShader = `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
const grayscaleFragmentShader = `
uniform sampler2D tDiffuse;
varying vec2 vUv;
void main() {
vec4 color = texture2D(tDiffuse, vUv);
float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(vec3(gray), color.a);
}
`;
// 2. 创建 Pass 类
class GrayscalePass extends FivePass {
private material: THREE.ShaderMaterial;
private fsQuad: FullScreenQuad;
constructor() {
super(); // 不需要额外的 G-Buffer 依赖,只需要前一个 Pass 的颜色结果
this.material = new THREE.ShaderMaterial({
uniforms: {
tDiffuse: { value: null }
},
vertexShader: grayscaleVertexShader,
fragmentShader: grayscaleFragmentShader
});
this.fsQuad = new FullScreenQuad(this.material);
}
render(renderer, writeBuffer, readBuffer) {
// 将上一个 Pass 的结果 (readBuffer) 传给 Shader
this.material.uniforms.tDiffuse.value = readBuffer.texture;
if (this.renderToScreen) {
// 如果是最后一个 Pass,直接渲染到屏幕
renderer.setRenderTarget(null);
this.fsQuad.render(renderer);
} else {
// 否则渲染到 writeBuffer,供下一个 Pass 使用
renderer.setRenderTarget(writeBuffer);
if (this.clear) renderer.clear();
this.fsQuad.render(renderer);
}
}
}
// 3. 挂载到 Five
const grayPass = new GrayscalePass();
five.addPass(grayPass);
// 触发重绘
five.needsRender = true;
如果你的 Pass 需要使用场景的深度信息(例如雾效),可以在构造函数中声明依赖。
class FogPass extends FivePass {
constructor() {
super(['depth']); // 声明需要深度图
}
render(renderer, writeBuffer, readBuffer) {
// 获取深度图
const depthTexture = this.gbuffer.get('depth');
// 在 Shader 中使用 depthTexture ...
// this.material.uniforms.tDepth.value = depthTexture;
// ... 渲染逻辑
}
}
five.fiveRenderer.composer.passes 数组,确认 Pass 是否已添加以及顺序是否正确。.enabled 属性为 true。this.gbuffer 是否包含预期的纹理。addPass 会添加到末尾,insertPass 可以插入到指定位置。renderToScreen 为 true) 才会渲染到屏幕。EffectComposer 会自动管理这个标志,但自定义 Pass 必须在 render 方法中正确处理 this.renderToScreen 逻辑。FivePass 并声明了 dependencies,this.gbuffer 才会有值。普通 Pass 实现无法自动获取 G-Buffer。addPass 方法的实现。FivePass 基类定义。tags: [后处理, 特效, 自定义shader, 滤镜, 描边, 景深, 色彩校正, 渲染管线, postprocessing, shader, effect, adaptive-luminance, edl, effect-composer, addPass]