ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

three.js 中的 ColorEnvironment:用统一颜色快速构建 IBL 环境光

three.js 中的 ColorEnvironment:用统一颜色快速构建 IBL 环境光 three.js 中的 ColorEnvironment用统一颜色快速构建 IBL 环境光【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.jsColorEnvironment是 three.js 提供的场景级环境类它本身就是一个Scene的子类内部只有一面“均匀颜色的球壳”专门用来作为 PMREMGenerator#fromScene 的输入一次性生成可复用、低成本的预滤波环境贴图PMREM。读完本文你将掌握它的完整 API、导入方式、与PMREMGenerator.fromScene的配合流程以及从源码层面理解它“为什么只需要一个球体”的原理并了解其资源释放方式与同类环境类的区别。类定位与继承链ColorEnvironment表示一个具有统一颜色的场景可作为PMREMGenerator#fromScene的输入生成的 PMREM 代表均匀的环境光uniform ambient lighting将其赋值给Scene#environment后即可用于基于图像的照明Image Based Lighting, IBL。其继承关系为EventDispatcher → Object3D → Scene → ColorEnvironment也就是说它是一个可以直接参与场景图Scene Graph体系的对象——能被添加、被遍历、被fromScene渲染。官方文档页见 docs/pages/ColorEnvironment.html.md。导入方式Addon 需要显式导入ColorEnvironment不是 three.js 核心库的一部分而是 Addon必须显式导入import { ColorEnvironment } from three/addons/environments/ColorEnvironment.js;它定义在 examples/jsm/environments/ColorEnvironment.js 中并通过 examples/jsm/Addons.js 以export * from ./environments/ColorEnvironment.js;的形式统一再导出。使用three/addons/*路径前需要先完成 three.js 官方手册 Installation → Addons 一节所说明的安装配置例如配置包管理器导出或导入映射。API 详解构造函数new ColorEnvironment( color )const environment new ColorEnvironment( 0x00ff00 );参数类型说明默认值colornumber \| Color环境的颜色16777215即0xffffff白色从源码 examples/jsm/environments/ColorEnvironment.js 可以看到构造函数签名constructor( color 0xffffff )与文档一致不传参时环境为白色。构造过程做了三件事将实例name设为ColorEnvironment创建一个SphereGeometry( 1, 16, 16 )半径 1、16×16 段的球体用MeshBasicMaterial( { color, side: BackSide } )创建背面渲染的材质并组合成Mesh加入场景。.dispose()environment.dispose();当环境不再需要时应调用此方法释放内部资源。其实现见 examples/jsm/environments/ColorEnvironment.js#L50-L55非常直接dispose() { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); }即只释放唯一子网格的几何体与材质。注意它释放的是环境场景自身的 GPU 资源fromScene生成的 PMREM 渲染目标及其纹理属于另一个对象的生命周期仍需在使用完毕后自行处置。完整使用流程从颜色到 IBL 环境贴图文档给出的标准用法如下import { ColorEnvironment } from three/addons/environments/ColorEnvironment.js; const environment new ColorEnvironment( 0x00ff00 ); const pmremGenerator new THREE.PMREMGenerator( renderer ); const envMap pmremGenerator.fromScene( environment ).texture; scene.environment envMap;流程拆解为四步构造环境场景new ColorEnvironment( color )得到一个仅含均匀颜色球壳的Scene创建生成器new THREE.PMREMGenerator( renderer )需要传入一个 WebGLRenderer或 WebGPURenderer生成 PMREMfromScene( environment )返回一个WebGLRenderTarget取其.texture即得到预滤波后的 CubeUV 环境贴图赋给场景scene.environment envMap后所有使用 PBR 材质如MeshStandardMaterial、MeshPhysicalMaterial的物体都会采样该环境贴图获得间接光照。fromScene的完整参数结合 src/extras/PMREMGenerator.js#L107-L139 中的实现fromScene的完整签名为fromScene( scene, sigma 0, near 0.1, far 100, options {} )参数默认值说明scene—要渲染的场景这里传入ColorEnvironment实例sigma0场景模糊强度大于 0 时先对立方体贴图做一次模糊near0.1内部立方相机的近裁剪面far100内部立方相机的远裁剪面options.size256生成 PMREM 的贴图尺寸options.position原点内部立方相机的位置对ColorEnvironment而言由于场景只有一面半径为 1 的球壳且相机位于原点默认的near 0.1、far 100完全够用通常无需调整任何参数。方法内部流程见 src/extras/PMREMGenerator.js#L107-L139临时切换渲染目标并关闭 XR 状态 → 通过_sceneToCubeUV将场景渲染为 CubeUV 格式 → 可选的 sigma 模糊 → 执行 PMREM 滤波_applyPMREM→ 清理临时状态后返回渲染目标。WebGPU 后端的注意事项从源码结构看WebGPU 后端的 PMREMGenerator 在调用fromScene之前要求渲染器已初始化否则会抛出错误见 src/renderers/common/extras/PMREMGenerator.js#L133-L145THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Use await renderer.init(); before using this method.因此在 WebGPURenderer 项目中应在await renderer.init()完成后再调用fromScene。源码级原理为什么一个球壳就能当环境ColorEnvironment全部实现只有 50 余行见 examples/jsm/environments/ColorEnvironment.js关键在于两处选择MeshBasicMaterialBackSide材质不接收任何光照输出恒为设定的颜色BackSide让相机位于球心看到的是球体内壁。从相机视角看整个方向域360°都被这一颜色覆盖等效于一个各向同性的“环境色罩”。SphereGeometry( 1, 16, 16 )半径 1 且 16×16 分段足够低——因为要渲染的就是纯平色多边形密度只影响性能而几乎不影响观感16 段在球心视角下足以把球面近似为均匀。fromScene通过六个方向CubeUV 布局从原点渲染这个场景得到的立方体贴图六个方向全是同一颜色随后 PMREM 滤波生成不同粗糙度mipmap级别。由于输入本身各向均匀最终环境贴图的各级 mipmap 也是同一颜色——这正是“uniform ambient lighting”的含义物体表面的 PBR 反射在各个粗糙度下都得到一致的色调。与同目录环境类的对比同一目录 examples/jsm/environments/ 下还有两个结构相近的环境类便于理解ColorEnvironment在“环境类家族”中的定位DebugEnvironment.js用BoxGeometry房间 PointLight 三块自发光“色板”构成简易房间其文档注释明确写着“should only be used for development purposes”用于肉眼调试 IBL 效果RoomEnvironment.js更精细的房间布光方案适合生产环境使用。三者的使用方式完全一致都是fromScene的输入、都提供dispose()区别只在场景内容ColorEnvironment提供完全均匀、无方向性、无光源细节的“纯色氛围光”适合只需给场景铺一层基础环境色、又不想加载 HDR/RGB 环境贴图的场景。实践要点小结构造new ColorEnvironment( color )color可为 16 进制颜色值或Color对象缺省为白色0xffffff生成必须经过PMREMGenerator.fromScene( environment ).texture获得可用的环境贴图不能把ColorEnvironment本身直接赋给scene.environment释放环境用完后调用environment.dispose()释放球壳几何体与材质PMREM 渲染目标/生成器按各自的生命周期另行处置适用边界它表达的是“均匀环境光”没有高光方向与明暗变化。若需要带方向感的高光或更真实的反射细节应改用 HDR/等距柱状贴图、RoomEnvironment等方案。【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表