# 使用光源

# 场景树中管理光源

在开发者工具的场景树面板右键可添加指定类型的光源。我们将光强最大的方向光作为主光源,其他光源称为附加光源。在小游戏框架里,附加光源默认是通过ForwardAdd的渲染Pass来实现。

# 自定义Effect的附加光照

如果用户要在自定义的Effect中使用多光源,那么:

  1. 在Effect文件中配置名为ForwardAdd的Pass,需要注意这个Pass里的混合因子。
    passes": [
        {
            "lightMode": "ForwardBase",
            ...
        },
        {
            "lightMode": "ForwardAdd",
            "vs": "./LitAdd.vertex.hlsl",
            "ps": "./LitAdd.pixel.hlsl",
            "compileFlags": [...],
            "multiCompile": [...],
            "shaderFeatures": [],
            "skipVariants": [],
            "useMaterialRenderStates": false,
            "renderStates": {
                "blendOn": true,
                "blendSrc": "ONE",
                "blendDst": "ONE",
                "blendFunc": "ADD",
                "cullOn": true,
                "cullFace": "BACK"
            }
        }
    ],

完整的Effect编写规则参照创建Effect文件 2. 在ForwardAdd的PixelShader中,获取光源的属性,并进行光照计算。 我们在shader内置了光源Light的数据结构:

struct Light{
    half3 direction;
    half3 color;
    half attenuation;
};
float3 lighting = float3(0, 0, 0);
// MAX_LIGHT_NUM_FA为内置宏定义,每帧最多的附加光源数,当前设为4
for (int i = 0; i < MAX_LIGHT_NUM_FA; i++)
{
    // LIGHT_NUM为内置宏定义,获取影响当前对象的光源数
    if (i < LIGHT_NUM)
    {
        // GetAdditionalLight为内置函数,获取光源的属性
        Light light = GetAdditionalLight(i, In.positionWS.xyz);
        // Lighting为用户自定义的光照函数
        lighting += Lighting(light,...);
    } 
}