当前位置: 首页 > news >正文

Three.js 渲染技术:打造逼真3D体验的幕后功臣

文章目录

    • 前言
    • 一、着色器(Shaders)
    • 二、后处理(Post-processing)
    • 三、抗锯齿(Anti-aliasing)
    • 四、实时渲染与离线渲染
    • 五、光照模型与材质优化
    • 六、环境映射(Environment Mapping)
    • 七、纹理映射(Texture Mapping)
    • 八、阴影投射(Shadow Casting)
    • 九、透明度与混合模式(Transparency and Blending Modes)
    • 十、层次化实例化渲染(Instanced Rendering)
    • 十一、高动态范围成像(HDR Imaging)
    • 十二、实时反射(Real-time Reflection)
    • 十三、物理模拟与碰撞检测(Physics Simulation and Collision Detection)
    • 结语


前言

在创建引人入胜的3D图形时,渲染技术是将你的创意从代码转变为屏幕上的视觉效果的关键。Three.js 提供了多种强大的渲染技术,使得开发者能够高效地生成高质量的图像和动画。本文将深入探讨这些渲染技术,并通过具体的代码示例来说明如何利用它们为你的项目增添光彩。


一、着色器(Shaders)

着色器是定义物体表面外观的核心工具,允许你精确控制每个像素的颜色、反射率和其他属性。Three.js 支持使用 GLSL(OpenGL Shading Language)编写自定义的顶点和片段着色器。

创建自定义材质

// 定义着色器代码
const vertexShader = `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}
`;const fragmentShader = `varying vec2 vUv;uniform float time;void main() {float r = sin(vUv.x * 10.0 + time) * 0.5 + 0.5;float g = cos(vUv.y * 10.0 + time) * 0.5 + 0.5;float b = (sin(time) + 1.0) * 0.5;gl_FragColor = vec4(r, g, b, 1.0);}
`;// 创建自定义材质
const material = new THREE.ShaderMaterial({uniforms: { time: { value: 0 } },vertexShader,fragmentShader
});// 将材质应用于网格
const geometry = new THREE.PlaneGeometry(2, 2);
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);// 动态更新时间变量
function animate() {requestAnimationFrame(animate);material.uniforms.time.value = performance.now() * 0.001;renderer.render(scene, camera);
}
animate();

二、后处理(Post-processing)

后处理是在渲染管道的最后阶段对整个图像应用特效的技术。它可以帮助你实现如模糊、景深、光晕等效果,从而增强场景的真实感或艺术风格。

使用 EffectComposer 实现后处理

// 引入必要的库
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass';// 创建 EffectComposer 实例
const composer = new EffectComposer(renderer);// 添加 RenderPass
composer.addPass(new RenderPass(scene, camera));// 添加 UnrealBloomPass
const bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight),1.5, // 强度0.4, // 阈值0.85 // 力度
);
composer.addPass(bloomPass);// 使用 EffectComposer 渲染
function animate() {requestAnimationFrame(animate);composer.render();
}
animate();

三、抗锯齿(Anti-aliasing)

抗锯齿用于平滑几何边缘,减少阶梯状的“锯齿”现象,提高图像质量。Three.js 支持多重采样抗锯齿(MSAA),可以在初始化 WebGLRenderer 时启用。

启用抗锯齿

// 创建渲染器并启用抗锯齿
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

四、实时渲染与离线渲染

实时渲染是指在用户交互过程中即时生成图像,而离线渲染则预先计算好高质量的图像或动画序列。对于需要快速响应的应用(如游戏),实时渲染是首选;而对于追求极致画质的电影级渲染,则更适合采用离线渲染。

  • 实时渲染:实时渲染通常通过 requestAnimationFramerender 方法来实现,确保每一帧都能及时更新。
  • 离线渲染:对于离线渲染,可以考虑使用专门的渲染农场或者云服务来处理复杂的渲染任务,这样可以显著缩短开发周期并保证最终输出的质量。

五、光照模型与材质优化

光照模型决定了光源如何影响物体表面,而材质则描述了这些表面的特性。Three.js 提供了多种光照模型和预定义材质,如 MeshBasicMaterial, MeshLambertMaterial, MeshPhongMaterialMeshStandardMaterial。选择合适的光照模型和材质对于性能和视觉效果至关重要。

优化材质性能

// 使用 MeshStandardMaterial 以获得更好的光照效果
const material = new THREE.MeshStandardMaterial({color: 0x00ff00,roughness: 0.7,metalness: 0.2
});

六、环境映射(Environment Mapping)

环境映射是一种模拟物体周围环境反射的技术,可以大大提升场景的真实感。Three.js 支持立方体贴图(Cubemap)和球形谐波(Spherical Harmonics)等多种环境映射方式。

加载立方体贴图

// 加载立方体贴图并设置到材质上
const path = 'textures/cube/park/';
const format = '.jpg';
const urls = [path + 'px' + format, path + 'nx' + format,path + 'py' + format, path + 'ny' + format,path + 'pz' + format, path + 'nz' + format
];const loader = new THREE.CubeTextureLoader();
const textureCube = loader.load(urls);
material.envMap = textureCube;

七、纹理映射(Texture Mapping)

纹理映射是将二维图像应用到三维几何体表面的过程,增加了细节和真实感。

应用纹理映射

// 加载纹理并应用于材质
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('textures/wood.jpg');
const material = new THREE.MeshBasicMaterial({ map: texture });// 创建几何体并应用材质
const geometry = new THREE.BoxGeometry();
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

八、阴影投射(Shadow Casting)

阴影增加了场景的真实感,使得光照更加自然。Three.js 支持实时计算阴影,这需要启用光源上的阴影投射属性,并设置渲染器的阴影映射。

启用阴影

// 创建方向光并启用阴影投射
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5).normalize();
light.castShadow = true; // 启用光源的阴影投射// 设置阴影贴图参数
light.shadow.mapSize.width = 512; // 默认是 512
light.shadow.mapSize.height = 512;
light.shadow.camera.near = 0.5;
light.shadow.camera.far = 500;// 添加到场景
scene.add(light);// 启用渲染器的阴影映射
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;// 指定哪些对象接收阴影
cube.receiveShadow = true;
groundPlane.receiveShadow = true;

九、透明度与混合模式(Transparency and Blending Modes)

透明度和混合模式可以用来创建半透明的效果,例如玻璃、水等材料。

设置透明度和混合模式

// 创建具有透明度的材质
const material = new THREE.MeshBasicMaterial({color: 0x00ff00,transparent: true,opacity: 0.5,blending: THREE.AdditiveBlending // 或者其他混合模式
});// 应用材质
const geometry = new THREE.PlaneGeometry(1, 1);
const plane = new THREE.Mesh(geometry, material);
scene.add(plane);

十、层次化实例化渲染(Instanced Rendering)

层次化实例化渲染允许你高效地绘制大量相似的对象,极大地提高了性能。

实现层次化实例化渲染

// 创建几何体和材质
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshPhongMaterial();// 创建 InstancedMesh 并设置实例数量
const count = 1000;
const instancedMesh = new THREE.InstancedMesh(geometry, material, count);
scene.add(instancedMesh);// 设置每个实例的位置
for (let i = 0; i < count; i++) {const matrix = new THREE.Matrix4();matrix.makeTranslation((Math.random() - 0.5) * 100,(Math.random() - 0.5) * 100,(Math.random() - 0.5) * 100);instancedMesh.setMatrixAt(i, matrix);
}instancedMesh.instanceMatrix.needsUpdate = true;

十一、高动态范围成像(HDR Imaging)

高动态范围成像(HDR)支持更宽广的颜色范围和亮度级别,提供更真实的照明效果。

加载 HDR 环境贴图

// 使用 RGBELoader 加载 HDR 图像
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader';new RGBELoader().load('textures/hdr/royal_esplanade_1k.hdr', function (texture) {texture.mapping = THREE.EquirectangularReflectionMapping;scene.background = texture;scene.environment = texture;
});

十二、实时反射(Real-time Reflection)

实时反射可以通过使用反射探针或直接渲染到纹理来实现,增加场景的真实感。

使用反射探针

// 创建反射探针
const probe = new THREE.ReflectionProbe();
scene.add(probe);// 更新反射探针
probe.updateFromNode(scene, camera);

十三、物理模拟与碰撞检测(Physics Simulation and Collision Detection)

虽然 Three.js 本身不包含物理引擎,但它很容易与第三方库(如 Cannon.js 或 Ammo.js)结合,以实现逼真的物理行为,如碰撞检测、刚体动力学等。

集成 Cannon.js 物理引擎

// 引入 Cannon.js
import * as CANNON from 'cannon-es';// 创建物理世界
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);// 创建物理物体(例如地面)
const groundShape = new CANNON.Plane();
const groundBody = new CANNON.Body({ mass: 0, shape: groundShape });
groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0);
world.addBody(groundBody);// 创建球体并添加物理特性
const sphereShape = new CANNON.Sphere(1);
const sphereBody = new CANNON.Body({ mass: 1, shape: sphereShape });
sphereBody.position.set(0, 10, 0);
world.addBody(sphereBody);// 将物理世界的更新同步到 Three.js 场景中
function updatePhysics(deltaTime) {world.step(1 / 60, deltaTime, 3);sphereObject.position.copy(sphereBody.position);sphereObject.quaternion.copy(sphereBody.quaternion);
}// 在动画循环中调用 updatePhysics
function animate() {requestAnimationFrame(animate);const deltaTime = clock.getDelta();updatePhysics(deltaTime);renderer.render(scene, camera);
}
animate();

结语

Three.js 的渲染技术不仅限于上述几种方法,还包括更多高级特性,如光线追踪(Ray Tracing)、体积渲染(Volume Rendering)、程序化几何体生成(Procedural Geometry Generation)等。掌握这些渲染技术,可以帮助你在创建3D内容时达到更高的视觉标准,并优化应用程序的性能。无论你是希望构建一个沉浸式的虚拟世界,还是制作精美的交互式演示,Three.js 的渲染功能都能为你提供强有力的支持。

相关文章:

Three.js 渲染技术:打造逼真3D体验的幕后功臣

文章目录 前言一、着色器&#xff08;Shaders&#xff09;二、后处理&#xff08;Post-processing&#xff09;三、抗锯齿&#xff08;Anti-aliasing&#xff09;四、实时渲染与离线渲染五、光照模型与材质优化六、环境映射&#xff08;Environment Mapping&#xff09;七、纹理…...

QTcpSocket 如何统计在线时长

基本原理 QTcpSocket是 Qt 库中用于 TCP 通信的类。要统计在线时长,关键思路是记录连接建立的时间和当前时间,通过计算两者的差值来得到在线时长。实现步骤 记录连接建立时间: 在连接成功的信号槽函数中记录开始时间。例如,当QTcpSocket成功连接到服务器时,会发出connecte…...

【Altium】AD使用智能粘贴功能把多个网络标签改成端口

1、 文档目标 使用智能粘贴功能把多个网络标签&#xff08;net lable&#xff09;改成端口&#xff08;port&#xff09; 2、 问题场景 客户有一份原理图&#xff0c;网络用的是net label&#xff0c;没用Port&#xff0c;然后创建一个sheet symbol&#xff0c;但是sheet sy…...

.NET 终止或结束进程

如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false&#xff0c;用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程&#xff1a; System.Diagnostics.Process.GetCurrentProcess().Kill(tru…...

R.swift库的详细用法

R.swift 是一个 Swift 工具库,它提供了一个自动生成的类 R,使得你可以通过类型安全的方式访问项目中的资源,例如图片、字体、颜色、XIB 文件等。通过 R.swift,你可以避免字符串类型的错误,提升代码的可维护性。 以下是 R.swift 库的详细用法: 1. 安装 R.swift 使用 Sw…...

Js的回调函数

一、什么是回调函数&#xff08;Callback&#xff09;&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是指一个函数被作为参数传递给另一个函数&#xff0c;并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中&#xff0…...

flutter 独立开发之笔记

1、# use: - [flutter_launcher_icons:] 每次修改完icon后&#xff0c;都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...

PHP的扩展Imagick的安装

windows下的安装 下载&#xff1a;Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载&#xff1a;ghostscript&#xff08;PDF提取图片时用到&#xff0c;不处理PDF可以不安装&#xff09; Ghostscript : Downloads 安装扩展 Imagick解压后&…...

【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想

以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost&#xff0c;实际上应该是一个IP地址。 关键字&#xff1a; DOMAIN ROOT_URL 因为是docker…...

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候&#xff0c;在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接&#xff0c;但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse&#xff0c;通过移动光标在不同的 pc 间切换 s…...

大语言模型是如何训练出来的?

近期听了不少与AI相关的播客&#xff0c;有理想转型AI的分享&#xff0c;有Character.ai出来同事的分享等&#xff0c;结合对Transformer架构的理解尝试大致还原大语言模型的训练过程。不过&#xff0c;当我这样的“中国大妈”也能够大致琢磨明白大语言模型是如何训练出来的时候…...

Vue2与Vue3在项目开发中的选择:深入探讨

文章目录 前言一、Vue2的优势与挑战二、Vue3的进步与特性三、如何做出选择&#xff1f;结语 前言 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。Vue2和Vue3是其两个主要版本&#xff0c;它们各自拥有一系列特点和优势。随着Vue3的发布&#xff0c;开发者们面临着在新…...

Web枚举:深入了解目标应用系统

Web枚举是渗透测试中重要的第一步&#xff0c;旨在全面收集目标系统的信息&#xff0c;以便后续攻击载荷的构建更具针对性和效率。本文将详细讨论如何通过各种方法识别目标Web应用的技术栈&#xff0c;并提取关键信息。 1. 识别目标系统的技术栈 技术栈指Web应用所依赖的技术组…...

RabbitMQ介绍与使用

RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;使用 Erlang 编程语言构建。它是消息队列&#xff08;MQ&#xff09;的一种&#xff0c;广泛应用于分布式系统中&#x…...

从0到机器视觉工程师(六):配置OpenCV和Qt环境

CMake配置OpenCV CMakeLists.txt文件的编写 cmake_minimum_required(VERSION 3.20) project(test_opencv LANGUAGES CXX) #寻找Opencv库 FIND_PACKAGE(OpenCV REQUIRED) include_directories(test_opencv ${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv main.cpp) TARGE…...

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应

LORA-FA&#xff1a;针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title&#xff1a;LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…...

huggingface/bert/transformer的模型默认下载路径以及自定义路径

当使用 BertTokenizer.from_pretrained(bert-base-uncased) 加载预训练的 BERT 模型时&#xff0c;Hugging Face 的 transformers 库会从 Hugging Face Model Hub 下载所需的模型文件和分词器文件&#xff08;如果它们不在本地缓存中&#xff09;。 默认情况下&#xff0c;这些…...

从 0 开始上手 Solana 智能合约

Solana CLI 基础知识 Solana CLI 是一个命令行界面工具&#xff0c;提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令&#xff0c;但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...