跳至主要內容

灯光与阴影

大约 3 分钟

灯光与阴影

灯光

人的眼睛之所以能看到物体,是因为物体反射了光线,光线是由光源发出的。在三维场景中,如果没有灯光,渲染器渲染出来的画面将漆黑一片。引擎在创建场景的时候,自动创建了一级默认灯光,并添加到场景中。

类名灯光/光源名
AmbientLight环境光
HemisphereLight半球光
DirectionalLight平行光,支持阴影
PointLight点光,支持阴影
SpotLight聚光,支持阴影

平行光

平行光(DirecionalLight)是沿着特定方向发射的光。这种光的表现像是无限远,从它发出的光线都是平行的。常常用平行光来模拟太阳光 的效果; 太阳足够远,因此我们可以认为太阳的位置是无限远,所以我们认为从太阳发出的光线也都是平行的。

var light = new VT.DirectionalLight({
    position: [0, 500, 0],
    intensity: 2.0,
    color: "#ffffff",
    shadow: {
        bias: 0.00001,
        mapSize: {
          width: 512,
          height: 512,
        },
        camera: {
          near: 0.1,
          far: 500,
        }
    }
});

viewer.scene.add(light);

环境光

环境光(AmbientLight)会均匀的照亮场景中的所有物体,环境光不能用来投射阴影,因为它没有方向。

var light = new VT.AmbientLight({
    intensity: 2.0,
    color: "#ffffff"
});

viewer.scene.add(light);

半球光

半球光(HemisphereLight)光源直接放置于场景之上,光照颜色从天空光线颜色渐变到地面光线颜色,半球光不能投射阴影。

var light = new VT.AmbientLight({
    color:"#ffffff", 
    groundColor: "#888888", 
    intensity: 1.0,
});

viewer.scene.add(light);

点光

点光(SpotLight)从一个点向各个方向发射的光源。一个常见的例子是模拟一个灯泡发出的光,该光源可以投射阴影。

var light = new VT.SpotLight({
    color: "#ffffff",
    intensity: 1.0,
    distance: 0,
    decay: 1,
    castShadow: false,
    shadow: {
        mapSize: {
          width: 512,
          height: 512,
        },
        camera: {
          near: 0.5,
          far: 500,
        }
    }
});

viewer.scene.add(light);

聚光

聚光光源(SpotLight)光线从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。该光源可以投射阴影

var light = new VT.SpotLight({

    position: [0, 100, 0],

    color: "#ffffff",
    intensity: 1.0,
    distance: 0,
    decay: 1,
    castShadow: false,
    angle: Math.PI / 3, 
    penumbra: 0.2,

    shadow: {
        focus: 1,
        mapSize: {
          width: 1024,
          height: 1024,
        },
        camera: {
          near: 0.1,
          far: 1000,
          fov: 30
        }
    }
});

viewer.scene.add(light);

层级阴影贴图 CSM

层级阴影贴图(Cascaded Shadow Maps),利用分层的ShadowMap技术,实现大场景的阴影算法。

CSM阴影生成算法分为4个步骤:

  • 将眼视锥分成多个深度分片;
  • 将光的视锥体分成多个较小的视锥体,每个视锥体(也可以称为包围盒)都覆盖一个分片;
  • 为每个光视锥体渲染一个阴影贴图;
  • 渲染整个场景的阴影。

图:CSM示意图(图片来自网络)

引擎在创建场景的时候自动生成了一组默认灯光和CSM层级阴影贴图,可设置CSM中的光源光线强度和阴影产生参数。

// CSM光源系统默认参数
{
    scene: {
        defaultLight: {
            // 平行光系统
            csm: {
                // 默认开启
                enable: true,
                // 最远距离
                maxFar: 100,
                // 层级数
                cascades: 4,
                // 光源颜色
                lightColor: "#FFFFFF",
                // 光源强度
                lightIntensity: 0.15,
                // 光方向
                lightDirection: [-0.577, -0.577, 0.577]
            },
        }
    }
}


上次编辑于:
贡献者: dashun