MIT 许可证 NuGet

首页 / 功能 / 材质与 PBR

材质与 PBR

材质来自 glTF,并保持在 glTF 的模型里:金属-粗糙度,外加法线、 遮蔽和自发光贴图。没有材质编辑器,也没有着色器图——你在 Blender 里制作的表面,就是引擎渲染的表面。

单一着色模型

每个不透明和透明表面都经过同一个金属-粗糙度 BRDF。这是 刻意的收窄:没有材质排列组合矩阵,没有需要预热的着色器 变体,在 glTF 查看器里看起来正确的资产,在这里看起来也正确。

输入处理方式
基础色 + 因子sRGB 纹理,乘以逐材质的因子和逐实例的颜色。
金属度 / 粗糙度打包的 glTF 通道,直接采样;没有重映射层。
法线贴图切线空间,带可选的 Toksvig 法线方差 mip,用于抑制镜面混叠。
遮蔽只应用于间接漫反射,因此不会与 GTAO 重复计算。
自发光在光照之后叠加,不受阴影和 AO 影响。
Alpha不透明、遮罩和混合模式;混合几何体在同一通道中于不透明之后绘制。
无光照Model.Unlit 完全绕过光照——适用于调试标记和世界内 UI。

覆盖文件里的设定

导入的材质是起点,不是合同。Model 上每个贴图和 因子都有覆盖项,因此共享资产可以逐实例重新着色或重新贴图, 而无需改动 GLB。

属性类型替换内容
MaterialColorVector4?全模型颜色乘数,叠加在基础色因子上。
BaseColorOverrideTextureUpdateSource基础色贴图。
NormalOverrideTextureUpdateSource法线贴图。
MetallicRoughnessOverrideTextureUpdateSource打包的金属-粗糙度贴图。
OcclusionOverrideTextureUpdateSource环境光遮蔽贴图。
EmissiveTextureOverrideTextureUpdateSource自发光贴图。
MetallicOverridefloat?金属度因子。
RoughnessOverridefloat?粗糙度因子。
EmissiveFactorOverrideVector4?自发光因子。
Unlitbool跳过整个模型的光照。

覆盖项默认可空或为空,意思是「使用文件里写的值」。纹理覆盖接受 一个 TextureUpdateSource,因此替换来源可以是文件、 解码后的缓冲区,或另一个特效生成的纹理。

纹理采样默认值

采样质量是项目级的决定,而不是逐材质的决定,因此它位于 RenderQuality 上。

设置默认值效果
TextureMipmapson上传时生成 mip 链。
TextureMipMinSize64低于此边长时停止生成 mip。
TextureMaxAnisotropy16各向异性过滤采样数,钳制到设备报告的值。
TextureNormalVarianceon法线贴图 mip 中的 Toksvig 式粗糙度加宽。
TextureLodBias-0.5轻微锐化偏移;额外的混叠由 TAA 吸收。

负 LOD 偏移和法线方差 mip 是刻意配对的。偏向更锐利的 mip 会重新 引入镜面闪烁,而在法线贴图密集处加宽粗糙度正是为此付出的代价。 关掉其中一个,你多半也应该关掉另一个。

HDR 与曝光

场景颜色默认为 HDR。光照在线性空间中以浮点精度累积,Post 通道 在去往交换链的路上应用曝光和色调映射——这让泛光能以真实辐射值 而不是被截断的值做阈值判断。

设置默认值说明
HdrSceneColoron关闭则回退到 8 位场景目标;泛光和 TAA 质量随之下降。
HdrExposure1.0在色调映射曲线之前应用的线性乘数。
KhrLightIntensityScale0.05缩放从 glTF 导入的点光源,后者的光度单位远大于引擎的单位。

KhrLightIntensityScale 存在的原因是 KHR_lights_punctual 用坎德拉和勒克斯指定强度, 而以那种量级导出的光会让以引擎单位照明的场景过曝。模型还可以用 Model.LightIntensityScale 进一步缩放它自己导入的 光源。

来自环境贴图的环境光

恒定环境光是默认且最便宜的选择。当场景值得更好的处理时, EnvironmentMap 加载六个立方体面,并将它们投影成 球谐函数用于漫反射环境光,可选地保留辐射立方体用于镜面反射。

模式应用内容
Off仅来自 SceneLighting.Ambient 的恒定环境光。
Diffuse九系数辐照度球谐函数替换恒定环境光项。
DiffuseSpecular如上,再加上用于镜面环境光的辐射立方体。

立方体面以 Rgba8Unorm 或 Rgba16Float 加载; SkyIntensity 和 DiffuseIntensity 独立缩放两项贡献, 这是防止 HDRI 让同时有太阳的场景过曝的常用方法。

已知缺口

  • 缺失 纹理压缩。 纹理目前以未压缩形式上传。这是路线图上列名的 条目,不是疏漏——见 轨道 A。
  • 缺失 清漆、光泽、透射以及其他 glTF 材质扩展。 实现的是核心金属-粗糙度集合。
  • 缺失 逐材质的自定义着色器。 扩展着色模型意味着编辑共享着色器, 而不是从应用代码编写新的。