Skip to content

UsePostprocessing ​

功能描述 ​

UsePostprocessing 是一个基于 postprocessing 库的后处理插件,提供了完整的后期处理能力,包括渲染通道管理、效果组合、抗锯齿、轮廓效果、Bloom 效果等特性。它与 Three.js 无缝集成,为 Vue 应用提供了高质量的 3D 视觉效果。

安装 ​

bash
# 使用 pnpm
pnpm add @oiij/three-js postprocessing

# 使用 npm
npm install @oiij/three-js postprocessing

# 使用 yarn
yarn add @oiij/three-js postprocessing

依赖 ​

  • vue: ^3.0.0
  • three: ^0.160.0
  • postprocessing: ^6.0.0

基本使用 ​

loading

API ​

usePostprocessing(renderer, scene, camera, options?) ​

创建后处理效果合成器。

参数 ​

参数类型说明
rendererWebGLRendererWebGL 渲染器
sceneSceneThree.js 场景
cameraCameraThree.js 相机
optionsEffectComposerOptions后处理配置选项

返回值 ​

属性类型说明
composerEffectComposer后处理效果合成器
renderPassRenderPass渲染通道
dispose()Function销毁后处理效果
resize(size)Function调整后处理尺寸

useSmaaEffectPass(camera, options?) ​

创建 SMAA 抗锯齿效果通道。

参数 ​

参数类型说明
cameraCameraThree.js 相机
optionsSMAAEffectOptionsSMAA 配置选项

返回值 ​

属性类型说明
smaaEffectSMAAEffectSMAA 效果
smaaEffectPassEffectPassSMAA 效果通道
dispose()Function销毁效果

useOutlinePass(scene, camera, options?) ​

创建轮廓效果通道。

参数 ​

参数类型说明
sceneSceneThree.js 场景
cameraCameraThree.js 相机
optionsOutlineEffectOptions轮廓效果配置选项

返回值 ​

属性类型说明
outlineEffectOutlineEffect轮廓效果
outlinePassEffectPass轮廓效果通道
selectionSelection选中对象集合
dispose()Function销毁效果

useSelectiveBloomPass(scene, camera, options?) ​

创建选择性 Bloom 发光效果通道。

参数 ​

参数类型说明
sceneSceneThree.js 场景
cameraCameraThree.js 相机
optionsBloomEffectOptionsBloom 效果配置选项

返回值 ​

属性类型说明
selectiveBloomEffectSelectiveBloomEffect选择性 Bloom 效果
selectiveBloomEffectPassEffectPassBloom 效果通道
selectionSelection选中对象集合
dispose()Function销毁效果

类型定义 ​

ts
import type { EffectComposer, Material, Pass, RenderPass } from 'postprocessing'
import type { Camera, Scene, WebGLRenderer } from 'three'

export type EffectComposerOptions = {
  /**
   * 深度缓冲区
   * @default true
   */
  depthBuffer?: boolean
  /**
   * 模板缓冲区
   * @default false
   */
  stencilBuffer?: boolean
  /**
   * Alpha 通道
   * @default false
   */
  alpha?: boolean
  /**
   * 多重采样
   * @default 0
   */
  multisampling?: number
  /**
   * 帧缓冲类型
   */
  frameBufferType?: number
  /**
   * 通道数组或通道工厂函数数组
   */
  passes?: Pass[] | ((renderer: WebGLRenderer, scene: Scene, camera: Camera) => Pass)[]
  /**
   * 覆盖材质
   */
  overrideMaterial?: Material
}

export type UsePostprocessingReturns = {
  composer: EffectComposer
  renderPass: RenderPass
  dispose: () => void
  resize: (size: { width: number, height: number }) => void
}

export declare function usePostprocessing(
  renderer: WebGLRenderer,
  scene: Scene,
  camera: Camera,
  options?: EffectComposerOptions
): UsePostprocessingReturns

export declare function useSmaaEffectPass(camera: Camera, options?: SMAAEffectOptions): UseSmaaEffectPassReturns
export declare function useOutlinePass(scene: Scene, camera: Camera, options?: OutlineEffectOptions): UseOutlinePassReturns
export declare function useSelectiveBloomPass(scene: Scene, camera: Camera, options?: BloomEffectOptions): UseSelectiveBloomPassReturns

使用示例 ​

基础用法 ​

vue
<script setup>
import { useThreeJs } from '@oiij/three-js'
import { usePostprocessing, useSmaaEffectPass } from '@oiij/three-js/plugins'
import { useTemplateRef } from 'vue'

const { renderer, scene, camera, onLoop, onResize } = useThreeJs(useTemplateRef('canvas'))

const { smaaEffectPass } = useSmaaEffectPass(camera)
const { composer, resize } = usePostprocessing(renderer, scene, camera, {
  passes: [smaaEffectPass]
})

onLoop(() => {
  composer.render()
})

onResize(({ width, height }) => {
  resize({ width, height })
})
</script>

<template>
  <div ref="canvas" style="width: 100%; height: 400px;" />
</template>

轮廓效果 ​

vue
<script setup>
import { useThreeJs } from '@oiij/three-js'
import { useOutlinePass, usePostprocessing, useSmaaEffectPass } from '@oiij/three-js/plugins'
import { useTemplateRef } from 'vue'

const { renderer, scene, camera, onLoop, onDoubleClick, onIntersectObject } = useThreeJs(useTemplateRef('canvas'))

const { smaaEffectPass } = useSmaaEffectPass(camera)
const { outlinePass, selection } = useOutlinePass(scene, camera)
const { composer } = usePostprocessing(renderer, scene, camera, {
  passes: [smaaEffectPass, outlinePass]
})

onLoop(() => {
  composer.render()
})

onDoubleClick((event) => {
  onIntersectObject(objects, event, (intersects) => {
    selection.set([intersects[0]])
  })
})
</script>

<template>
  <div ref="canvas" style="width: 100%; height: 400px;" />
</template>

Bloom 发光效果 ​

vue
<script setup>
import { useThreeJs } from '@oiij/three-js'
import { usePostprocessing, useSelectiveBloomPass } from '@oiij/three-js/plugins'
import { useTemplateRef } from 'vue'

const { renderer, scene, camera, onLoop } = useThreeJs(useTemplateRef('canvas'))

const { selectiveBloomEffectPass, selection } = useSelectiveBloomPass(scene, camera)
const { composer } = usePostprocessing(renderer, scene, camera, {
  passes: [selectiveBloomEffectPass]
})

// 设置需要发光的对象
selection.set([glowingObject])

onLoop(() => {
  composer.render()
})
</script>

<template>
  <div ref="canvas" style="width: 100%; height: 400px;" />
</template>