跳转到内容

布林冯材质

Author: Charley

布林冯材质(BlinnPhongMaterial)是LayaAir引擎中基于经典Blinn-Phong光照模型实现的材质类型。Blinn-Phong光照模型通过简洁的数学计算描述物体表面对光的吸收与反射,使物体呈现不同的明暗程度和高光效果。相较于PBR材质,布林冯材质的计算量更小、性能开销更低,适用于对真实感要求不极致但需要良好光照效果的场景。

Blinn-Phong光照模型是在Phong光照模型基础上改进而来的经典光照模型,主要由三个分量组成:

  • 环境光(Ambient):模拟环境中的间接光照,为物体提供基础亮度;
  • 漫反射光(Diffuse):模拟光线照射到粗糙表面后向各个方向均匀散射的效果;
  • 镜面高光(Specular):模拟光线照射到光滑表面后产生的高光反射。

与PBR材质通过物理规律计算光照不同,Blinn-Phong使用经验公式近似模拟光照效果,因此在计算量上更加轻量。

对比项BlinnPhong材质PBR材质
光照模型经验光照模型基于物理的光照模型
参数直观性需要手动调节漫反射和高光金属度/粗糙度参数更直观
真实感较好更接近真实
性能开销较低较高
适用场景卡通风格、低端设备、性能敏感场景写实风格、高品质渲染
Material → BlinnPhongMaterial

在IDE中创建材质并选择 BlinnPhong Shader时,使用的就是 BlinnPhongMaterial

反照率相关属性定义了布林冯材质的漫反射外观。

albedoColor 属性定义材质表面的固有颜色,类型为 Color(RGBA)。它与漫反射贴图颜色相乘后决定最终的漫反射颜色。

(图2-1)

albedoTexture 属性用于设置漫反射贴图,提供逐像素的颜色细节。贴图颜色与 albedoColor 相乘后产生最终的漫反射颜色效果。

(图2-2)

albedoIntensity 属性控制反照率的亮度强度,类型为 number。通过调节该值可以整体提亮或压暗漫反射颜色。

2.4 纹理平铺和偏移(tilingOffset)

Section titled “2.4 纹理平铺和偏移(tilingOffset)”

tilingOffset 属性控制纹理在模型表面的重复次数和偏移量,类型为 Vector4

分量说明
X纹理在U方向的重复次数(Tiling)
Y纹理在V方向的重复次数(Tiling)
Z纹理在U方向的偏移量(Offset)
W纹理在V方向的偏移量(Offset)

高光属性控制材质表面的镜面反射效果,是布林冯材质的重要特征。

specularColor 属性设置高光反射的颜色,类型为 Color。高光颜色决定了光线照射到光滑表面时产生的高亮区域的颜色。

(图3-1)

specularTexture 属性用于设置高光贴图,可以精确控制模型不同区域的高光强度和颜色。

shininess 属性控制高光的集中程度,取值范围为0到1:

说明
趋近0高光范围大而模糊,表面看起来粗糙
趋近1高光范围小而集中,表面看起来光滑

(图3-2)

normalTexture 属性用于设置法线贴图。法线贴图通过修改表面法线方向来模拟凹凸细节,使低面数模型也能呈现丰富的表面纹理效果,而无需增加实际的几何面数。

(图4-1)

布林冯材质支持透光效果,可用于模拟薄片材质(如树叶、纸张、布料等)的半透光特性。

通过设置 enableTransmissiontrue 来开启透光功能。

属性类型说明
transmissionRatanumber透光率,影响漫反射和透光强度
transmissionColorColor透光颜色,模拟材质内部颜色吸收率
backDiffusenumber透射影响范围指数
backScalenumber透射光强度
thinknessTextureBaseTexture厚度贴图,越厚透射光越弱

enableVertexColor 属性控制是否支持顶点颜色,开启后可叠加网格的顶点颜色数据到最终渲染结果中。

布林冯材质支持以下渲染模式:

渲染模式常量说明
不透明RENDERMODE_OPAQUE0默认的不透明渲染模式,性能最优
透明裁剪RENDERMODE_CUTOUT1根据Alpha阈值裁剪像素,适合树叶、栅栏等
透明混合RENDERMODE_TRANSPARENT2半透明渲染,支持Alpha混合

以下是 BlinnPhongMaterial 的完整属性列表:

属性类型说明
albedoColorColor反照率颜色
albedoTextureBaseTexture反照率贴图
albedoIntensitynumber反照率强度
normalTextureBaseTexture法线贴图
specularColorColor高光颜色
specularTextureBaseTexture高光贴图
shininessnumber高光强度(光泽度),范围0~1
tilingOffsetVector4纹理平铺和偏移
enableVertexColorboolean是否支持顶点色
enableTransmissionboolean是否开启透光效果
transmissionRatanumber透光率
transmissionColorColor透光颜色
backDiffusenumber透射影响范围指数
backScalenumber透射光强度
thinknessTextureBaseTexture厚度贴图
renderModenumber渲染模式
// 创建BlinnPhong材质
let blinnPhongMat = new Laya.BlinnPhongMaterial();
// 设置反照率颜色
blinnPhongMat.albedoColor = new Laya.Color(0.8, 0.6, 0.4, 1.0);
// 设置高光颜色和强度
blinnPhongMat.specularColor = new Laya.Color(1.0, 1.0, 1.0, 1.0);
blinnPhongMat.shininess = 0.5;
// 应用到模型
let meshRenderer = sprite3D.getComponent(Laya.MeshRenderer);
meshRenderer.sharedMaterial = blinnPhongMat;
let mat = new Laya.BlinnPhongMaterial();
// 加载反照率贴图
Laya.loader.load("res/texture/diffuse.png").then((tex: Laya.Texture2D) => {
mat.albedoTexture = tex;
});
// 加载法线贴图
Laya.loader.load("res/texture/normal.png").then((tex: Laya.Texture2D) => {
mat.normalTexture = tex;
});
// 加载高光贴图
Laya.loader.load("res/texture/specular.png").then((tex: Laya.Texture2D) => {
mat.specularTexture = tex;
});
// 设置纹理平铺(重复2次)
mat.tilingOffset = new Laya.Vector4(2, 2, 0, 0);
meshRenderer.sharedMaterial = mat;
let leafMat = new Laya.BlinnPhongMaterial();
// 加载树叶贴图
Laya.loader.load("res/texture/leaf.png").then((tex: Laya.Texture2D) => {
leafMat.albedoTexture = tex;
});
// 开启透光
leafMat.enableTransmission = true;
leafMat.transmissionRata = 0.6;
leafMat.transmissionColor = new Laya.Color(0.2, 0.8, 0.1, 1.0);
leafMat.backScale = 1.0;
// 使用Cutout模式处理树叶边缘
leafMat.renderMode = Laya.BlinnPhongMaterial.RENDERMODE_CUTOUT;
meshRenderer.sharedMaterial = leafMat;
  1. 性能优势:布林冯材质的着色计算量比PBR材质低,在低端移动设备或需要大量材质的场景中建议优先使用。

  2. 适用风格:布林冯材质更适合卡通风格、简约风格的游戏项目。对于写实风格项目,建议使用PBR材质。

  3. 高光数据源:布林冯材质的高光强度数据可来自高光贴图的RGB通道(SPECULARSOURCE_SPECULARMAP)或漫反射贴图的Alpha通道(SPECULARSOURCE_DIFFUSEMAPALPHA)。

  4. 默认材质禁止修改BlinnPhongMaterial.defaultMaterial 为引擎内部使用的默认材质,开发者不应修改。