用途:为 React Three Fiber 场景中的网格选择并配置表面材质,兼顾外观表现与渲染成本。使用前先检查已安装的渲染器、Three.js、Fiber 与 Drei 版本;示例基于 Fiber 9 / React 19 与 WebGL,不要假定 Drei 的着色器材质在 WebGPU 下可原样工作。
主要能力:按需求给出材质起点——无光照图形或 UI 用 meshBasicMaterial;普通 PBR 表面用 meshStandardMaterial(金属尤其需要环境或合适灯光);清漆、透射、光泽用 meshPhysicalMaterial(只开启需要的特性);风格化光照用 meshToonMaterial;法线调试用 meshNormalMaterial;自定义着色用 ShaderMaterial 或节点材质,并区分 WebGL/GLSL 与 WebGPU/TSL。
PBR 与颜色:电介质 metalness 接近 0,裸金属接近 1;roughness 控制微表面响应而非不透明度。颜色/albedo 与自发光贴图用 sRGB,roughness、metalness、法线、AO 与遮罩用 NoColorSpace,保留 glTF 贴图元数据。贴图会与标量设置相乘,metalness 贴图配 metalness={0} 无效,自发光贴图需非黑 emissive 颜色。法线贴图改变着色但不改变轮廓,置换贴图改变顶点且需要足够细分。自发光表面不会照亮邻近几何体,需要时另加灯光与 bloom。
透明与玻璃:opacity < 1 需配合 transparent;镂空植被或贴花可考虑 alphaTest 以避免排序问题。depthWrite={false} 并非通用修复。玻璃一般用物理透射,opacity 为 1 并设置合理 thickness/IOR。Drei 的 MeshTransmissionMaterial 与 MeshReflectorMaterial 会增加场景渲染,先从低分辨率/采样开始并测量成本。不要到处开启 DoubleSide。
生命周期:共享外观时共享材质,修改单个实例前先克隆。R3F 管理声明式材质子节点,外部共享材质需显式管理生命周期;释放材质不会释放其贴图。普通属性动画用类型化 ref,改 roughness 或颜色无需 needsUpdate,增删贴图等着色器特性变化可能触发重编译。材质数组需匹配几何体分组。
验证:在目标光照与输出管线下渲染,测试透明重叠、阴影与反复挂载/卸载,并在加入透射或反射前比较 GPU 成本。