4. 灯光对象
灯光¶
VRP支持三种光源类型,点光源、平行光和聚光灯。
点光源:点光源的照亮空间则是有限的,它是由空间中的一个球体定义的。点光源可以表示由一个点发出的、向所有方向延伸的光。点光源是有位置属性的,对于方向属性,我们需要用点光源的位置减去某点的位置来得到它到该点的方向。同时,点光源也是会衰减的,随着物体逐渐远离点光源,它接收到的光照强度也会逐渐减小。点光源球心处的光照强度最强,球体边界处的最弱,值为0。其中间的衰减值可以由一个函数定义。
平行光:平行光可以照亮的范围是没有限制的,它通常是作为太阳这样的角色在场景中出现的。平行光之所以简单,是因为它没有一个唯一的位置,它可以放在场景中的任意位置。它的几何属性只有方向,我们可以调整平行光的属性来改变它的光源方向, 而且平行光到场景中所有点的方向都是一样的,这也是平行光名字的由来。除此之外,由于平行光没有一个具体的位置,因此也没有衰减的概念,也就是说,光照强度不会随着距离而发生改变。
聚光灯:聚光灯是这3种光源类型中最复杂的一种。它的照亮空间同样是有限的,但不再是简单的球体,而是由空间中的一块锥形区域定义的。聚光灯可以用于表示由一个特定位置出发、向特定方向延伸的光。对于方向属性,我们需要用聚光灯的位置减去某点的位置来得到它到该点的方向。聚光灯的衰减也是随着物体逐渐远离点光源而逐渐减小,在锥形的顶点处光照强度最强,在锥形的边界处强度为0。其中间的衰减值可以由一个函数定义,这个函数相对于点光源衰减计算公式要更加复杂,因为我们需要判断一个点是否在锥体的范围内。
属性列表¶
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
---|---|---|---|---|
光源类型 | lightType | int | 0、1、2 | 显示当前光源的类型。 0=平行光,1=点光源,2=聚光灯。 |
光照颜色 | color | Color | { r: 1, g: 0, b: 1, a: 1 } | 场景中光源的颜色,可根据需要进行修改。 |
强度 | intensity | float | 0~1000 | 光源的强度。 |
投射阴影 | castShadow | bool | true、false | 可选择是否开启投射阴影。 |
模拟光源尺寸 | lightSize | float | 可调节模拟光源的尺寸,当光源类型为方向光时有该属性。 该参数可调节平行光阴影软化程度。根据需要输入尺寸。 | |
阴影采样质量 | pcssSampleQuality | int | 0~3 | 可调节阴影采样质量,当光源类型为方向光时有该属性。 |
阴影强度 | shadowIntensity | float | 0~1 | 可调节阴影强度,当光源类型为方向光时有该属性。 |
阴影偏移 | shadowBias | float | 1~100 | 可调节阴影偏移,当光源类型为方向光时有该属性。 通过调节该参数可避免阴影距离偏差和面交叉部分漏光的问题。 |
阴影距离层级 | csmLevel | int | 1、2、3、4 | 可调节阴影精细度,分为0-4级,但是为了渲染需求渲染时可以选择1-4级渲染。 |
光照范围 | range | float | 0~1000 | 可调节光照范围,当光源类型为点光源和聚光灯时有该属性。 |
点角度 | spotAngle | float | 1~180 | 可调节点角度,当光源类型为聚光灯时有该属性。 |
示例代码¶
// 修改灯光类型|lightType
directionallight.lightType = 0;
// 修改平行光光照颜色|color
directionallight.color = new Color(1, 0, 1, 1);
// 修改平行光强度|intensity
directionallight.intensity = 3;
// 是否关闭平行光投射阴影|castShadow
directionallight.castShadow = true;
// 模拟光源尺寸|size
directionallight.size = 0.1f;
// 修改阴影采样质量|pcssSampleQuality
directionallight.pcssSampleQuality = 2;
// 修改阴影强度|shadowIntensity
directionallight.shadowIntensity = 1;
// 修改阴影偏移|shadowBias
directionallight.shadowBias = 20;
// 选择阴影距离层级|csmLevel
directionallight.csmLevel = 1;
示例案例¶
// 1-平行光
directionalLight_Demo() {
// 获取平行光
Actor directionalLight_actor = Actor.Find("Directional Light");
// 修改灯光属性的位置/旋转/缩放
directionalLight_actor.localPosition = new Vector3(0, 4, 0);
directionalLight_actor.localEulerAngles = new Vector3(60, 30, 0);
directionalLight_actor.localScale = new Vector3(1, 1, 1);
// 获取平行光组件
Light directionallight = directionalLight_actor.GetComponent<Light>();
// 修改灯光类型|lightType
directionallight.lightType = 0;
// 修改平行光光照颜色|color
directionallight.color = new Color(1, 0, 1, 1);
// 修改平行光强度|intensity
directionallight.intensity = 3;
// 是否关闭平行光投射阴影|castShadow
directionallight.castShadow = true;
// 模拟光源尺寸|size
directionallight.size = 0.1f;
// 修改阴影采样质量|pcssSampleQuality
directionallight.pcssSampleQuality = 2;
// 修改阴影强度|shadowIntensity
directionallight.shadowIntensity = 1;
// 修改阴影偏移|shadowBias
directionallight.shadowBias = 20;
// 选择阴影距离层级|csmLevel
directionallight.csmLevel = 1;
}
// 2-点光源
PointLight_Demo() {
// 获取点光源
Actor pointlight_actor = Actor.Find("Point Light");
// 修改灯光属性的位置/旋转/缩放X,Y,Z
pointlight_actor.localPosition = new Vector3(-0.5f, 1.12f, 0);
pointlight_actor.localEulerAngles = new Vector3(180, 0, 0);
pointlight_actor.localScale = new Vector3(1, 1, 1);
// 获取点光源组件
Light pointlight = pointlight_actor.GetComponent<Light>();
// 修改灯光类型|lightType
pointlight.lightType = 1;
// 修改点光源光照颜色|color
pointlight.color = new Color(1, 0, 1, 1);
// 修改点光源强度|intensity
pointlight.intensity = 3;
// 是否关闭点光源投射阴影|castShadow
pointlight.castShadow = false;
// 修改点光源光照范围|range
pointlight.range = 10;
}
// 3-聚光灯
SpotLight_Demo() {
// 获取聚光灯
Actor spotlight_actor = Actor.Find("Spot Light");
// 修改灯光属性的位置/旋转/缩放X,Y,Z
spotlight_actor.localPosition = new Vector3(0.2f, 1.32f, 0.2f);
spotlight_actor.localEulerAngles = new Vector3(270, 170, 0);
spotlight_actor.localScale = new Vector3(1, 1, 1);
// 获取点光源组件
Light spotlight = spotlight_actor.GetComponent<Light>();
// 修改灯光类型|lightType value: 0/1/2
spotlight.lightType = 2;
// 修改聚光灯光照颜色|color
spotlight.color = new Color(1, 0, 1, 1);
// 修改聚光灯强度|intensity
spotlight.intensity = 79;
// 是否关闭聚光灯投射阴影|castShadow
spotlight.castShadow = true;
// 修改点聚光灯照范围|range
spotlight.range = 164;
// 修改点聚光灯点角度|spotAngle
spotlight.spotAngle = 30;
}