灯光与阴影
大约 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]
},
}
}
}