# 使用光源
# 场景树中管理光源
在开发者工具的场景树面板右键可添加指定类型的光源。我们将光强最大的方向光作为主光源,其他光源称为附加光源。在小游戏框架里,附加光源默认是通过ForwardAdd
的渲染Pass
来实现。
# 自定义Effect的附加光照
如果用户要在自定义的Effect中使用多光源,那么:
- 在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,...);
}
}