格式
c++
#pragma shader_feature_additional_light描述
执行了该命令的 着色器(Shader)将会套用 点光源(Point Lights)和 聚光灯(Spot Lights)光源类型相关的变体。
套用变体
| 变体 | 描述 |
USE_ADDITIONAL_LIGHT | 该变体不会影响内置宏,但是您可以在定义该预处理宏时使用 SandMod 渲染引擎提供的特定参数,具体的参数请参阅 变体参数 小节。您可以判断该变体被定义后编辑受 点光源(Point Lights)和 聚光灯(Spot Lights)影响的效果。 |
变体参数
您在定义 USE_ADDITIONAL_LIGHT 预处理宏时,可以使用 SandMod 渲染引擎提供的以下特定参数,读取光源的相关信息。
| 命名 | 参数类型 | 描述 |
ALightGParam | vec4 | 全局外加光源的常用参数。 x 影响了物体的 外加光源(点光源和聚光灯)总数量。 |
ALightArgs | vec4[ ] | 该数组每个元素表示对应索引的外加光源的常用参数。 x 光源范围,对应 光源组件(Light)的 范围(Range)属性值。 y 光源范围平方的倒数: 1.0/(Range*Range),通常用于计算光源的范围衰减。z 如果对应光源是点光源此值为 0.0,光源为聚光灯则此值表示: 1.0/(cos(IAngle/2.0)-cos(OAngle/2.0))w 如果对应光源是点光源此值为 1.0,光源为聚光灯则此值表示: -1.0*cos(OAngle/2.0)*z其中: · IAngle 表示该聚光灯 内角(Inner Angle)属性值。· OAngle 表示该聚光灯 外角(Outer Angle)属性值。 |
ALightPositionsAndSliceIndices | vec4[ ] | 该数组每个元素表示对应索引的外加光源的世界坐标和切片索引值。 x 表示对应光源在世界坐标的 x 坐标值。 y 表示对应光源在世界坐标的 y 坐标值。 z 表示对应光源在世界坐标的 z 坐标值。 w 表示切片索引值。 |
ALightColorsAndIsShadowSoft | vec4[ ] | 该数组每个元素表示对应索引的外加光源灯光的颜色及其投射的阴影的效果。 x 表示对应光源颜色值的 红色(Red)值。 y 表示对应光源颜色值的 绿色(Green)值。 z 表示对应光源颜色值的 蓝色(Blue)值。 w 判断对应光源投射的阴影的类型,对应 光源组件(Light)的 阴影类型(Shadow Type)属性值。 · 值为 0 表示阴影类型为 硬阴影(Hard)。 · 值不为 0 表示阴影类型为 软阴影(Soft)。 |
ALightDirectionsAndIsPointLights | vec4[ ] | 该数组每个元素表示对应索引的外加光源灯光的颜色及其投射的阴影的效果。 x 表示对应光源朝向向量的 x 坐标值。 y 表示对应光源朝向向量的 y 坐标值。 z 表示对应光源朝向向量的 z 坐标值。 w 判断对应光源是否为点光源。 · 值为 0.0 表示光源类型为 聚光灯(Spot Light)。 · 值不为 0.0 表示光源类型为 点光源(Point Light)。 |
代码示例
c++
#pragma shader_feature_additional_light
#ifdef USE_ADDITIONAL_LIGHT
//执行 shader_feature_additional_ligh 命令会执行的逻辑;
//定义用于储存光源信息的结构体,并命名这个结构为 ALightData;
struct ALightData{
vec4 args;
vec3 wpos;
int slice_index;
vec3 color;
bool is_shadow_soft;
vec3 dir;
bool is_point_light;
};
//通过变体相关参数获取每个外加光源的参数值;
ALightData GetALightData(int index)
{
ALightData res;
res.args = ALightArgs[index];
vec4 val = ALightPositionsAndSliceIndices[index];
res.wpos = float3(val.x,val.y,val.z);
res.slice_index = int(val.w);
vec4 val = ALightColorsAndIsShadowSoft[index];
res.color = float3(val.x,val.y,val.z);
res.is_shadow_soft = val.w > 2^(-24);
vec4 val = ALightDirectionsAndIsPointLights[index];
res.dir = float3(val.x,val.y,val.z);
res.is_point_light = val.w > 2^(-24);
return res;
}
for(int i = 0 ; i < ALightGParam.x ; ++i)
{
//遍历外加光源列表,获取每个光源的信息;
ALightData aLDValue = GetALightData(i);
//编辑获取光源信息后处理着色器的相关逻辑;
}
#endif