添加中央环境光源¶
本书的在线资源包含两个小的光照破解示例。第一个是 main.cpp 中的 enableLightHackDirectional() 函数,如清单 9-1 所示。
void enableLightHackDirectional(LPDIRECT3DDEVICE9
pDevice)
{
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL;
1.0f);
light.Direction = D3DXVECTOR3(-1.0f, -0.5f,
-1.0f);
pDevice->SetLight(0, &light);
pDevice->LightEnable(0, TRUE);
}
清单 9-1:方向光光照破解
这段代码从 EndScene() 钩子调用,通过创建名为 light 的光源向场景添加光。代码把 light.Type 设为 directional,意味着光源会像聚光灯一样朝特定方向投射光线。然后代码把 light.Diffuse 的红、绿、蓝值设为 0.5、0.5 和 0.5,让光线从表面反射时呈现灰白色光泽。接下来,它把 light.Direction 设为三维空间中的一个任意点。最后,代码用游戏的 Direct3D 设备在索引 0 设置光源并启用光照效果。
注 在示例应用中,光线从场景的左下方向右上方照射。根据目标游戏的渲染方式,你可能需要更改这个位置。
注意在索引 0 插入光源对这个概念验证有效,但并不总是有效。游戏通常定义多个光源,把你的光源设置在游戏使用的索引上可能会覆盖关键的光照效果。实践中,你可以尝试把索引设置为任意高的数字。不过这类光照破解有一个问题:方向光会被墙壁、生物和地形等物体阻挡,意味着仍然可以投射阴影。方向光在开阔空间效果很好,但在蜿蜒的走廊或地下洞穴中效果不佳。