文章目录

  • ​​官网案例​​
  • ​​文件位置​​
  • ​​结构解析​​
  • ​​核心逻辑​​
  • ​​概述​​

​OutlinePass​​ 实现物体边界高亮效果

官网案例

​webgl_postprocessing_outline​

分析three.js OutlinePass 实现模式_官网

文件位置

​three.js-master/examples/jsm/postprocessing/OutlinePass.js​

结构解析

分析three.js OutlinePass 实现模式_着色器_02

class OutlinePass extends Pass {

constructor(resolution, scene, camera, selectedObjects) {
}

dispose() {
}

setSize(width, height) {
}

changeVisibilityOfSelectedObjects(bVisible) {
}

changeVisibilityOfNonSelectedObjects(bVisible) {
}

updateTextureMatrix() {
}

render(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {

if (this.selectedObjects.length > 0) {
// 使选定对象不可见
// 1. 在深度缓冲区中绘制非选定对象
// 使选定对象可见
// 更新纹理矩阵以进行深度比较
// 通过比较非选定对象的深度缓冲区,使非选定对象不可见,并仅绘制选定对象
// 2. 将采样降低到半分辨率
// 3. 应用边缘检测过程
// 4. 在半分辨率上应用模糊
// 对四分之一分辨率应用模糊
// 在输入纹理上添加它

}

if (this.renderToScreen) {
}
}
/**
* 获取准备面膜材料
*/
getPrepareMaskMaterial() {
}
/**
* 获取边缘检测材料
*/
getEdgeDetectionMaterial() {
}
/**
* 可分离模糊材料
*/
getSeperableBlurMaterial(maxRadius) {
}
/**
* 获取覆盖材质
*/
getOverlayMaterial() {
}

}

核心逻辑

可以看到替代renderer.render函数的render函数中的处理步骤

  • 使选定对象不可见
  1. 在深度缓冲区中绘制非选定对象
  • 使选定对象可见
  • 更新纹理矩阵以进行深度比较
  • 通过比较非选定对象的深度缓冲区,使非选定对象不可见,并仅绘制选定对象
  1. 将采样降低到半分辨率
  2. 应用边缘检测过程
  3. 在半分辨率上应用模糊
  • 对四分之一分辨率应用模糊
  • 在输入纹理上添加它

这便是 pass 的处理过程

下方的几个 ​​​getXXXMaterial​​​方法是 自定义的几个shader

可以看到每次使用shader后清除渲染然后用下一个shader

分析three.js OutlinePass 实现模式_webgl_03


然后 使用 每次的累积 ​​​this.fsQuad​​​渲染到屏幕上

分析three.js OutlinePass 实现模式_官网_04

概述

可以理解为由多个shader逐一渲染 每个shader渲染的目标是上一个shader渲染后的结果经过一个个分工明确的shader处理后达到效果

实现的代码

分析three.js OutlinePass 实现模式_着色器_05

每一个shader处理完后将渲染目标变更到下一个
并且设置下一个shader需要的uniforms
渲染完清除当前renderer 由this.fsQuad积累渲染结果 所有shader处理后最后由this.fsQuad渲染