分析three.js OutlinePass 实现模式
原创
©著作权归作者所有:来自51CTO博客作者JediHongbin的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 官网案例
- 文件位置
- 结构解析
- 核心逻辑
- 概述
OutlinePass
实现物体边界高亮效果
官网案例
webgl_postprocessing_outline
文件位置
three.js-master/examples/jsm/postprocessing/OutlinePass.js
结构解析
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函数中的处理步骤
- 在深度缓冲区中绘制非选定对象
- 使选定对象可见
- 更新纹理矩阵以进行深度比较
- 通过比较非选定对象的深度缓冲区,使非选定对象不可见,并仅绘制选定对象
- 将采样降低到半分辨率
- 应用边缘检测过程
- 在半分辨率上应用模糊
这便是 pass 的处理过程
下方的几个 getXXXMaterial
方法是 自定义的几个shader
可以看到每次使用shader后清除渲染然后用下一个shader
然后 使用 每次的累积 this.fsQuad
渲染到屏幕上
概述
可以理解为由多个shader逐一渲染 每个shader渲染的目标是上一个shader渲染后的结果经过一个个分工明确的shader处理后达到效果
实现的代码
每一个shader处理完后将渲染目标变更到下一个
并且设置下一个shader需要的uniforms
渲染完清除当前renderer 由this.fsQuad积累渲染结果 所有shader处理后最后由this.fsQuad渲染