发布时间:2026/8/29 17:17:35
【three.js教程】Three.js 材质详解:从“不反光“到“物理级真实“怎么选 Three.js 材质详解从不反光到物理级真实怎么选原文出处Three.js Manual – Materials本文基于 three.js 官方手册材质章节整理用通俗的方式带你理清 three.js 里五花八门的材质该怎么选、怎么用。写在前面前面我们聊了图元——也就是那些现成的 3D 形状。但你肯定发现了一个球体光秃秃的没有颜色、没有质感看着特别假。让它有模有样的东西就是材质Material。材质决定了物体表面怎么和光互动、看起来是什么质感。three.js 里的材质种类很多Basic、Lambert、Phong、Standard、Physical、Toon……这篇就帮你把这些材质梳理一遍介绍什么时候该用哪个。一、怎么设置一个材质先说最基础的材质属性有两种设置时机。第一种创建时直接传参数我们前面一直这么用constmaterialnewTHREE.MeshPhongMaterial({color:0xff0000,// 红色这里也可以传 CSS 颜色字符串flatShading:true,});第二种创建之后再改constmaterialnewTHREE.MeshPhongMaterial();material.color.setHSL(0,1,0.5);// 红色material.flatShadingtrue;特别是颜色THREE.Color类型它的设值方式特别多记几个常用的就够material.color.set(0x00ffff);// 和 CSS 的 #RRGGBB 一样material.color.set(purple);// 直接传 CSS 颜色名material.color.set(#F32);// CSS 简写material.color.set(rgb(255, 127, 64));// CSS rgb 写法material.color.set(hsl(180, 50%, 25%));// CSS hsl 写法material.color.setHSL(h,s,l);// h/s/l 都是 0~1material.color.setRGB(r,g,b);// r/g/b 都是 0~1创建时也可以混用十六进制和字符串constm1newTHREE.MeshBasicMaterial({color:0xff0000});// 红色constm2newTHREE.MeshBasicMaterial({color:red});// 红色constm3newTHREE.MeshBasicMaterial({color:#F00});// 红色constm4newTHREE.MeshBasicMaterial({color:rgb(255,0,0)});// 红色constm5newTHREE.MeshBasicMaterial({color:hsl(0,100%,50%)});// 红色二、最基础的三属性Basic / Lambert / Phong这三个是 three.js 里最基础的受光材质区别在于怎么计算光照材质光照计算方式特点MeshBasicMaterial完全不受光永远一个色像贴了自发光贴纸MeshLambertMaterial只在顶点处算光照便宜适合低端设备MeshPhongMaterial逐像素算光照支持高光有镜面反光点最塑料感MeshBasicMaterial最简单——不管有没有光它都显示你给的颜色像灯泡自己会发光。MeshPhongMaterial比 Lambert 高级的地方在于它支持高光specular highlight也就是物体表面那个亮亮的反光点。高光的锐利程度由shininess参数控制默认是 30shininess: 0高光铺得很开看起来像磨砂shininess: 30默认值适中shininess: 150高光聚成一个小点看起来像釉面/瓷器还有个有意思的技巧如果你把MeshLambertMaterial或MeshPhongMaterial的emissive自发光色设成某个颜色同时把color设成黑色Phong 再把shininess设 0效果就跟MeshBasicMaterial一模一样了。换句话说Basic 其实是 Lambert/Phong 的阉割版。那为什么还要保留三个答案很简单越高级的材质越费 GPU。在手机这种性能弱的设备上用简单材质能省不少电。所以原则是不需要的功能就别用——不需要光照和高光就用MeshBasicMaterial别无脑上 Phong。三、Toon 材质卡通渲染MeshToonMaterial和MeshPhongMaterial很像但有个关键区别它不用平滑渐变来表现明暗而是用一张渐变贴图gradient map来分级。默认的分级是前 70% 亮度统一 70%后 30% 统一 100%所以物体看起来只有两三个色块像卡通片里的上色。你也可以自己提供 gradient map 来定义分几级、每级什么亮度。适合做日系卡通风格、二次元渲染那种效果。四、物理级材质Standard 和 PhysicalPBR前面那几个材质用的都是凑合好看的简单数学。但真实世界里光的行为复杂得多——金属和非金属反光不一样粗糙和光滑反光也不一样。为了逼近真实three.js 提供了PBRPhysically Based Rendering基于物理的渲染材质。MeshStandardMaterial这是目前最常用、也是官方推荐的标准材质。它和 Phong 最大的参数区别Phong 用shininess越小越亮Standard 用两个新参数roughness粗糙度和metalness金属度roughness基本就是shininess的反面高 roughness接近 1像棒球表面粗糙没有硬反光低 roughness接近 0像台球非常光滑反光锐利取值范围 0~1metalness表示这东西有多像金属0非金属塑料、木头、皮肤1纯金属铁、铜、金这两个参数可以组合出无数种质感比如粗糙的金属“光滑的塑料”“磨砂玻璃”。MeshPhysicalMaterialMeshPhysicalMaterial在MeshStandardMaterial基础上多加了一层清漆效果新增两个参数clearcoat0~1表示表面镀了一层多厚的透明清漆比如车漆、钢琴漆clearCoatRoughness这层清漆本身有多粗糙它适合做车漆、带保护层的家具、手机背板这种底层是某种材质、表面又镀了一层的效果。性能排序从快到慢排个队MeshBasicMaterial → MeshLambertMaterial → MeshPhongMaterial → MeshStandardMaterial → MeshPhysicalMaterial越靠后的越真实但也越费性能。低端机/移动端尽量往前选。五、三个特殊用途材质这三个不常用但知道有它们会省事材质干嘛用的ShadowMaterial只显示阴影。做阴影相关效果时用来显示阴影数据MeshDepthMaterial把每个像素的深度渲染出来近的偏黑远的偏白某些后期特效会用到MeshNormalMaterial把几何体的法线方向用颜色画出来。x红、y绿、z蓝调试模型朝向时很有用六、自定义着色器ShaderMaterial / RawShaderMaterial如果你想做完全自定义的效果比如水波、溶解、全息可以用ShaderMaterial写 GLSL 着色器。它还能借助 three.js 帮你处理一部分底层逻辑。RawShaderMaterial更彻底——完全不依赖 three.js 的任何帮助你自己掌控所有。这两个话题比较大会在后面专门讲。七、两个最常用的通用属性所有材质都共享一堆通用设置定义在Material基类里挑两个最实用的说flatShading平面着色默认false。设为true后物体表面会按每个三角面平整上色而不是平滑过渡——也就是传说中的 low-poly 风格。配合低面数球体特别好看。side显示哪一面默认THREE.FrontSide只显示正面。其他可选THREE.BackSide只显示背面THREE.DoubleSide两面都显示大部分 3D 物体是实心不透明的背面朝内不用画。但像PlaneGeometry这种没有厚度的平面从背面看会直接消失——所以这种场景必须把side设成THREE.DoubleSide。八、一个容易踩的坑needsUpdate大多数情况下你改材质属性three.js 会自己重新应用。但有几类设置改了之后不会自动生效得手动告诉它material.needsUpdatetrue;需要在改完后设needsUpdate true的情况主要是改了flatShading增删了纹理注意只是换纹理图片不用但从有纹理变没纹理或反过来就得设从纹理切回无纹理时更省事的做法是直接换一张 1×1 的白色像素纹理而不是真的去掉纹理。大部分 App 这辈子都不会碰到这个问题——你很少会在运行时切换 flat shading 或有没有纹理。知道有这么回事就行。回顾一下材质这东西核心记住三句话不需要光照就用 Basic要真实就用 Standard中间按性能和效果权衡选 Lambert / Phong / Toon。PBR 时代首选MeshStandardMaterial用roughnessmetalness两个参数就能调出绝大多数日常质感。平面类物体记得设THREE.DoubleSide否则背面看不见。材质还有一大块内容没展开——纹理Texture。那是另一个大话题会单独讲。在那之前先消化这几个材质就够用了。延伸阅读Three.js MeshStandardMaterial 文档Three.js MeshPhongMaterial 文档Three.js Material 基类文档Three.js 材质特性对照表

相关新闻

2026/8/29 17:17:35

移动App发版避坑指南:签名、版本号与自动化检查全攻略

做移动开发这几年,如果说哪个环节最让我焦虑,那一定是发版这件事。平时写代码、做需求、修Bug,反馈链路都很短,代码有问题跑一次就能发现。但发版不一样,它是一场跨开发、测试、产品、运营的联合行为,任何一…

2026/8/29 17:17:35

Vue3从零入门完整指南:核心语法、组件通信与实战项目

最近有不少刚开始学前端的小伙伴问我:都 2026 年了,新手学 Vue 到底该学 Vue2 还是直接学 Vue3?我的建议非常明确: 直接上手 Vue3 。Vue3 是当前 Vue 生态的绝对主流,社区组件库、企业级项目、招聘要求都已经全面转向…

2026/8/29 17:12:35

智能动效运行时的边界

智能动效运行时的边界讨论“智能动效运行时的边界”时,最容易出现的偏差是先给方案,再补问题定义。页面渲染与用户交互里,同一个实现放到不同负载、不同依赖版本或不同操作路径下,结果可能完全不同。更稳妥的起点,是把…

2026/8/29 17:27:36

推理服务代码评审的七项检查

推理服务代码评审的七项检查 推理服务的代码评审,不能只验证“给一段输入能否返回答案”。服务通常同时处理用户数据、模型配置、流式连接、检索内容和外部工具,任何一个边界含糊都可能变成成本、权限或稳定性问题。下面七项检查适合作为评审起点&#x…

2026/8/29 17:27:36

BAT实习面试全复盘:时间线、内推、算法题与项目深挖

1. 投递阶段的水有多深:时间线、内推与简历筛选 很多人在准备BAT实习面试的时候,把百分之八十的精力都砸在刷题和背八股上,结果简历连初筛都没过。我见过太多这样的例子了,包括我自己第一次投递时也吃过这个亏。后来面完三家、复盘…

2026/8/29 17:27:36

FixAnything:用视频生成先验修复3D渲染伪影与不一致

最近在跟进 3D 渲染方向的新工作,关注到以“FixAnything”为代表的渲染精炼思路:它不再执着于从头训练一个更强大的渲染模型,而是把视频生成模型当作先验,用来修复 3D 渲染中难以避免的伪影和不一致问题。这个方向在 NeRF、3D Gau…

2026/8/29 17:27:36

C语言宿舍分配系统:从结构体到算法,实现自动化公平分配

1. 项目概述:从手动排表到自动化决策 每到开学季,新生报到,或者公司新员工入职,宿舍分配总是一个让人头疼的问题。传统的做法是辅导员或者行政人员拿着花名册,根据性别、专业、班级等有限信息,手动在Excel表…

2026/8/29 17:27:36

Linux PipeWire深度解析之pw_thread_loop_wait调用流程与实战(八十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…

2026/8/29 17:22:35

基于SpringBoot的养生健康平台系统毕业设计项目源码

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/8/28 16:16:17

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/28 16:16:21

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 16:16:22

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/29 0:01:10

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:01:10

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:01:10

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…