为了在Direct3D的立即模式中定义赋予给对象某种材料的颜色,颜色组件值定义每个使用此材料表面反映的发光部分的数量。如果我们设置某个材料的RGB值为(1.0,1.0,1.0),它将反映出所有采样光。如果RGB的值为(0.0,0.0,0.0),则一点光线都不会反映出来。
在通常的0.0-1.0范围之外,Direct3D允许我们在发光部分指定负数值和大于1.0的值,Direct3D会将结果光线作为暗灯对待,它从场景中移走光线。
我们还可以指定比1.0大的值,Direct3D会产生特别明亮的光线。
暗灯在表现动画世界中的3D场景方面能产生非常独特的效果。用它我们设置环绕区域(象整个房间)具有常态环境光线,并且在这个区域中的某个区域具有变暗效果。我们可以在3D幻想游戏中创建数个区域,看起来象神话护身符的黑色符咒,围绕它的发光效果。
为了创建一个发光对象,我们可以调用IDirect3D3::CreateLight方法。第一个参数传递一个结构变量的地址,一旦调用成功,则在其中填写有效的IDirect3DLight接口指针。第二个参数必须为NULL。
创建了发光对象后,我们可以通过设置D3DLIGHT2结构来设置光线的属性,并用D3DLIGHT2结构的地址作为参数调用IDirect3DLight::SetLight方法。不管什么时候想更新光的照明属性时,可以用新的信息再次调用IDirect3DLight::SetLight方法.
下面的代码示范了如何创建发光对象并设置暗等效果:
//
// g_lpD3D3 保存IDirect3D3 接口的地址
//
LPDIRECT3DLIGHT g_lpD3DLight;
HRESULT hr;
hr = g_lpD3D3->CreateLight (&g_lpD3DLight, NULL);
if (SUCCEEDED(hr))
{
//
// g_lpD3DLight 变量是一个指向IDirect3D3接口的有效指针
//
D3DLIGHT2 g_light;
HRESULT hr;
//
// 初始化结构
//
ZeroMemory(&g_light, sizeof(D3DLIGHT2));
g_light.dwSize = sizeof(D3DLIGHT2); // MUST set the size!
//
// 创建暗点灯光
//
g_light.dltType = D3DLIGHT_POINT;
g_light.dcvColor.r = -0.5f;
g_light.dcvColor.g = -0.5f;
g_light.dcvColor.b = -0.5f;
//
// 在场景中以及阅读器背后定位光线高度,
// 这些坐标在world 空间里,所以阅读器可以在world空间中的任何位置
// 在这个例子中,阅读器位于world空间的原点
//
g_light.dvPosition.x = 0.0f;
g_light.dvPosition.y = 1000.0f;
g_light.dvPosition.z = -100.0f;
//
// 不要衰减
//
g_light.dvAttenuation0 = 1.0f;
g_light.dvRange = D3DLIGHT_RANGE_MAX;
//
// 时光线成为活动光
//
g_light.dwFlags = D3DLIGHT_ACTIVE;
//
// 设置光线的属性信息
// 必须强制将LPD3DLIGHT2 转换为LPD3DLIGHT.
//
hr = g_lpD3DLight->SetLight((LPD3DLIGHT)&g_light);
if (SUCCEEDED(hr))
{
//
// 将光线添加到视口
//
}
else
return hr;
}
else
return hr;
>> 本文固定链接: http://www.vcgood.com/archives/935