Three.js 后期处理(Post-Processing)详解

 

目录

前言 

一、什么是后期处理?

二、Three.js 后期处理的工作流程

2.1 创建 EffectComposer

2.2 添加渲染通道(Render Pass)

2.3 应用最终渲染

三、后期处理实现示例 

3.1 基础代码 

四、常见的后期处理效果

4.1 辉光效果(UnrealBloomPass)

4.2 景深(BokehPass / Depth of Field)

4.3 运动模糊(MotionBlurPass)

4.4 边缘检测(OutlinePass / SobelPass)

4.5 色彩调整(ColorCorrectionPass / LUTPass)

五、后期处理的注意事项


前言 

在使用 Three.js 创建 3D 场景时,后期处理(Post-Processing)是一个不可忽视的环节。它通过对渲染结果进行额外的处理,可以极大地提升场景的视觉效果,使画面更具吸引力和表现力。

一、什么是后期处理?

后期处理(Post-Processing)是指在场景渲染完成后,对渲染的图像进行进一步的处理和调整。这些处理通常包括:

  • 添加视觉效果(如模糊、辉光、色彩调整等)
  • 模拟真实世界中的物理现象(如景深、运动模糊等)
  • 实现特殊的视觉风格(如漫画效果、老电影风格等)

在 Three.js 中,后期处理是通过将渲染结果存储到帧缓冲区(Framebuffer),然后对其应用一系列着色器效果实现的。

二、Three.js 后期处理的工作流程

Three.js 提供了一个 EffectComposer 类,用于管理后期处理的整个流程。以下是后期处理的基本步骤:

2.1 创建 EffectComposer

EffectComposer 是后期处理的核心。它会接管场景的渲染,将渲染结果存储到帧缓冲区中。

2.2 添加渲染通道(Render Pass)

后期处理由一系列渲染通道(Pass)组成,每个通道都对帧缓冲区中的图像进行特定的处理。

  • RenderPass:渲染场景到帧缓冲区,作为后续处理的输入。
  • ShaderPass:应用特定的着色器效果。
  • EffectPass:封装多个复杂效果。

2.3 应用最终渲染

在所有的渲染通道完成处理后,EffectComposer 会将最终的图像渲染到屏幕上。

三、后期处理实现示例 

以下是一个简单的后期处理示例,展示如何在 Three.js 中应用 EffectComposer 和一些常见的后期效果。 

3.1 基础代码 

import * as THREE from 'three';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
import { FilmPass } from 'three/examples/jsm/postprocessing/FilmPass.js';

// 初始化场景、摄像机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 添加一个简单的几何体
const geometry = new THREE.TorusKnotGeometry(1, 0.4, 100, 16);
const material = new THREE.MeshStandardMaterial({ color: 0xff6347 });
const torusKnot = new THREE.Mesh(geometry, material);
scene.add(torusKnot);

const light = new THREE.PointLight(0xffffff, 1, 100);
light.position.set(10, 10, 10);
scene.add(light);

// 初始化 EffectComposer
const composer = new EffectComposer(renderer);

// 添加 RenderPass(渲染场景的基础通道)
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);

// 添加 UnrealBloomPass(辉光效果)
const bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 1.5, 0.4, 0.85);
composer.addPass(bloomPass);

// 添加 FilmPass(电影胶片效果)
const filmPass = new FilmPass(0.35, 0.025, 648, false);
composer.addPass(filmPass);

// 动画循环
function animate() {
  requestAnimationFrame(animate);
  torusKnot.rotation.x += 0.01;
  torusKnot.rotation.y += 0.01;

  // 使用 composer 进行后期处理渲染
  composer.render();
}

animate();

四、常见的后期处理效果

4.1 辉光效果(UnrealBloomPass)

效果描述:模拟物体发光的视觉效果,常用于表现光源、能量场等场景。

关键参数:

strength:辉光强度。 radius:辉光半径。 threshold:亮度阈值,低于该值的像素不会发光。

4.2 景深(BokehPass / Depth of Field)

效果描述:模拟相机镜头的景深效果,让焦点外的区域出现模糊。

应用场景:聚焦于特定的物体,提升画面层次感。

4.3 运动模糊(MotionBlurPass)

效果描述:模拟高速运动时的拖影效果,增加动感。

4.4 边缘检测(OutlinePass / SobelPass)

效果描述:检测并高亮场景中的边缘,用于创建卡通或轮廓风格的效果。

4.5 色彩调整(ColorCorrectionPass / LUTPass)

效果描述:调整场景的整体色调和对比度,增强画面表现力。

五、后期处理的注意事项

性能开销:

后期处理需要对帧缓冲区进行额外的处理,会增加显存和计算的消耗。 避免同时启用过多的后期效果。 渲染顺序:

渲染通道的顺序会影响最终的效果,需根据需求调整顺序。 抗锯齿问题:

某些后期处理会导致抗锯齿失效,可以使用 FXAA 或 SMAA Pass 修复。 多通道组合:

可以组合多个通道,实现更复杂的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)

易鲸云作为炎黄盈动新推出的产品,在定位上为低零代码产品。 开发层 表单引擎 表单设计器,包括设计和渲染 流程引擎 流程设计,包括设计和渲染,需要说明的是:采用国际标准BPMN2.0,可以全球通用 视图引擎 视图…

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图: 在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章&…

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么,有存就有取 在取值的时候,报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中:LoginUser u…

C语言------二维数组指针从入门到精通

前言: 目标:需要了解及掌握数组指针的行地址、列地址、具体元素地址、具体元素地址的值是怎样定义及实现。 重点:指针的偏移,指针解引用。 难点:指针的升阶与降阶。 1. 基本概念 二维数组:二维数组可以看作是一个数组的数组。例如,int a[3][4] 表示一个 …

AI-ISP论文Learning to See in the Dark解读

论文地址:Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…

自定义数据集 ,使用朴素贝叶斯对其进行分类

代码: # 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 定义类1的数据点,每个数据点是二维的坐标 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])# 定义类2的数据点&…

蓝桥杯单片机第七届省赛

前言 这套题不难,相对于第六套题这一套比较简单了,但是还是有些小细节要抓 题目 OK,以上就是全部的题目了,这套题目相对来说逻辑比较简单,四个按键,S4控制pwm占空比,S5控制计时时间&#xff0…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前,首先需要明确研究的目的。是为了改进自己的小程序设计和开发,还是为了了解市场趋势和用户需求?不同的研究目的会影响研究的方法和重点。例如,如果研究目的是为了…

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当…

一文讲解HashMap线程安全相关问题

HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…

oracle:子查询

子查询: 一条查询语句中嵌入了另一条查询语句, 被嵌入里面的这条查询语句称为子查询, 外面的查询语句称为主查询 子查询的分类 相关性子查询(Correlated Subquery)是指子查询的执行依赖于外部查询的每一行数据。也就是说,子查询会对外部查询…

AI技术在SEO关键词优化中的应用策略与前景展望

内容概要 在数字营销的快速发展中,AI技术逐渐成为SEO领域的核心驱动力。其通过强大的数据分析和处理能力,不仅改变了我们优化关键词的方式,也提升了搜索引擎优化的效率和效果。在传统SEO中,关键词的选择与组合常依赖人工经验和直…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的疫苗发布和接种预约管理系统(含源码+数据库+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql疫苗发布和接种预约管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、…

VSCode中快速创建Html文件

1、下载并安装好VSCode软件,启动软件。 2、依次点击左上角选项卡“file”-“New File”。 输入文件名称后缀,如:HelloWorld.html。 选择新建文件的目录所在位置。 3、HelloWorld.html中输入英文格式的!,按回车键后会默认依据…

CMake项目编译与开源项目目录结构

Cmake 使用简单方便,可以跨平台构建项目编译环境,尤其比直接写makefile简单,可以通过简单的Cmake生成负责的Makefile文件。 如果没有使用cmake进行编译,需要如下命令:(以muduo库echo服务器为例)…

网络原理(4)—— 网络层详解

目录 一. IP协议报头结构 二. 地址管理 2.1 路由器 2.1.1 路由选择 2.1.2 WAN口(Wide Area Network) 2.1.3 LAN口(Local Area Network) 2.1.4 WLAN口(Wireless Local Area Network) 2.2 网段划分…

Hot100之图论

200岛屿数量 题目 思路解析 把访问过的格子插上棋子 思想是先污染再治理,我们有一个inArea()函数,是判断是否出界了 我们先dfs()放各个方向遍历,然后我们再把这个位置标为0 我们岛屿是连着…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.4 索引优化:避免意外复制的高效技巧

2.4 索引优化:避免意外复制的高效技巧 目录/提纲 #mermaid-svg-hmMAIqF8kFh46fbH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hmMAIqF8kFh46fbH .error-icon{fill:#552222;}#mermaid-svg-hmMAIqF8kF…