材质与光

标准材质对光的反应会有四种,漫反射、高光反射、自发光、环境光

1.自发光

自发光的概念:使材质看起来像是自己发光
自发光有一个很明显的缺点,那就是“不真实的光照”。
自发光材质不会实际照亮周围的物体,只是看起来像在发光,且它的效果是静态的,不能像实际光源那样动态变化,这也意味着光照不会对它造成影响。
当然光照对它不造成影响是缺点也是优点:
1、视觉效果突出:自发光材质可以使物体在黑暗环境中仍然可见,增加视觉效果。
 2、性能较好:相比于使用实际的光源,自发光材质对性能的影响较小,因为它不需要计算光照。
主要的使用场景为:
科幻效果:在科幻场景中,常常需要一些发光的物体,比如发光的按钮、屏幕或能量源。
灯光效果:模拟灯光或霓虹灯效果。
装饰性元素:用于装饰性元素,使其在黑暗环境中仍然可见。
        const material = new BABYLON.StandardMaterial('material', scene)
        // 使用三个浮点数参数来表示颜色的红色、绿色和蓝色分量。每个参数的范围是从 0 到 1。
        material.emissiveColor = new BABYLON.Color3(1, 0, 0)

        // 材质禁止光照
        // material.disableLighting = true
        // 透明度
        // material.alpha = 0.5;
        // 设置同时影响的光源数量为 3(默认值是4)
        // material.maxSimultaneousLights = 3;

        // 最终颜色 ≈ 自发光(material.emissiveColor) + 灯光扩散颜色(light.diffuse) * 材质扩散颜色(material.diffuseColor)
        // 没有自发光;考虑灯光即可 HemisphericLight 
        // 为什么看起来是灰色的,是因为物体颜色、漫反射颜色、灯光颜色虽然是白色的,但是默认光照强度是0.7
        // 最终颜色 = (1,1,1) × (1,1,1) × (1,1,1) × 0.7 = (0.7, 0.7, 0.7)
        // 最终颜色 = 物体颜色 × 漫反射颜色 × 灯光颜色 × 光照强度
        const sphere1 = BABYLON.MeshBuilder.CreateSphere('sphere1', {})
        sphere1.position.x = -1.5

        // 最终颜色 = (物体颜色 × 漫反射颜色 × 光照颜色 × 光照强度) + 自发光颜色
        // 受光照部分 = (1,1,1) × (1,1,1) × 0.7 = (0.7, 0.7, 0.7)  // 灰色
        // 最终颜色 = (0.7, 0.7, 0.7) + (1, 0, 0)= (1.0, 0.7, 0.7)
        const sphere2 = BABYLON.MeshBuilder.CreateSphere('sphere2', {})
        sphere2.material = material

 

2.漫反射

漫反射的概念:光线在物体表面均匀散射的效果,决定了物体在光照下的主要颜色和外观。
灯光设置漫反射属性(light.diffuse),给材质设置漫反射颜色属性(material.diffuseColor),两者相遇时,产生漫反射,显示最终看到的效果。
优点:
易于使用: 设置颜色和纹理非常简单,适合快速原型设计。
高效渲染: 漫反射计算相对简单,对性能影响较小。
 广泛应用: 适用于大多数常见的材质效果,如木材、金属、布料等。
 缺点:
缺乏细节: 仅使用漫反射可能无法表现出复杂的光照效果,如高光、反射等。
依赖光源: 漫反射效果依赖于场景中的光源设置,光源不足时效果不明显。
        // 漫反射计算颜色:
        // 当光源的颜色和材质的颜色进行乘法运算时,实际上是在计算每个颜色通道(红、绿、蓝)上的光能量和反射能力的乘积
        // 例如:光源颜色为蓝色 (0, 0, 1),材质颜色为黄色 (1, 1, 0)。
        // 计算每个通道的乘积:
        // 红色通道:0 * 1 = 0
        // 绿色通道:0 * 1 = 0
        // 蓝色通道:1 * 0 = 0
        // 最终的结果是 (0, 0, 0),即黑色。
        // 若无材质颜色,则为灯源颜色;若无光源,则未黑色(看不到无光)
        // 材质
        const material = new BABYLON.StandardMaterial('material', scene)
        // 使用三个浮点数参数来表示颜色的红色、绿色和蓝色分量。每个参数的范围是从 0 到 1。
        material.diffuseColor = new BABYLON.Color3(1, 1, 0)

        // 材质禁止光照
        // material.disableLighting = true
        // 透明度
        // material.alpha = 0.5;
        // 设置同时影响的光源数量为 3(默认值是4)
        // material.maxSimultaneousLights = 3;

        const sphere1 = BABYLON.MeshBuilder.CreateSphere('sphere1', {})
        sphere1.position.x = -1.5

        const sphere2 = BABYLON.MeshBuilder.CreateSphere('sphere2', {})
        sphere2.material = material

 

3.环境光

环境光对应的是场景的 ambientColor属性,与材质的 ambientColor属性(或者 ambientTexture属性)相遇时产生的效果。
环境光计算颜色: 跟漫反射一样,只是光源换成了场景光
        // 材质
        const material = new BABYLON.StandardMaterial('material', scene)
        material.ambientColor = new BABYLON.Color3(0.23, 0.98, 0.53) // 环境光颜色

        // 材质禁止光照
        // material.disableLighting = true
        // 透明度
        // material.alpha = 0.5;
        // 设置同时影响的光源数量为 3(默认值是4)
        // material.maxSimultaneousLights = 3;

        // 最终颜色 ≈ 环境光(scene.ambientColor) * 材质环境颜色(material.ambientColor) + 灯光扩散颜色(light.diffuse) * 材质扩散颜色(material.diffuseColor)

        // sphere1没有材质, 材质环境颜色默认值为黑色(new BABYLON.Color3(0, 0, 0))  
        // 所以没有环境光只计算了灯光扩散颜色(light.diffuse) * 材质扩散颜色(material.diffuseColor)
        // 材质扩散颜色 (material.diffuseColor) 默认值为白色(new BABYLON.Color3(1, 1, 1))
        const sphere1 = BABYLON.MeshBuilder.CreateSphere('sphere1', {})
        sphere1.position.x = -1.5

        const sphere2 = BABYLON.MeshBuilder.CreateSphere('sphere2', {})
        sphere2.material = material

 

4.高光

高光指光源照射到物体然后反射到人的眼睛里时,物体上最亮的那个点就是高光。高光不是光,而是物体上最亮的部分

        // 材质
        const material = new BABYLON.StandardMaterial('material', scene)
        // 使用三个浮点数参数来表示颜色的红色、绿色和蓝色分量。每个参数的范围是从 0 到 1。
        // material.specularColor = new BABYLON.Color3(0.5, 0.6, 0.87)
        // 不要高光
        // material.specularColor = new BABYLON.Color3(0, 0, 0)
        material.specularColor = new BABYLON.Color3(0, 1, 0)


        const sphere1 = BABYLON.MeshBuilder.CreateSphere('sphere1', {})
        sphere1.position.x = -1.5

        const sphere2 = BABYLON.MeshBuilder.CreateSphere('sphere2', {})
        sphere2.material = material

 

 

总结StandardMaterial(标准材质):

默认值为白色:diffuseColor漫反射颜色、specularColor高光颜色

默认值为黑色:ambientColor环境光颜色、emissiveColor自发光颜色

Scene:

默认值为黑色:ambientColor环境光颜色

Light:

默认值为白色:diffuse漫反射

 

其他Babylonjs 资料

官方文档:https://doc.babylonjs.com/

Babylon.js 中文教程:https://doc.cnbabylon.com/

 

github的demo:https://github.com/ssszjh/babylon

posted on 2025-03-14 11:34  sss大辉  阅读(157)  评论(0)    收藏  举报

导航