在Direct3D中创建暗灯特效

来源:互联网 发布:苹果电脑换windows系统 编辑:程序博客网 时间:2024/05/14 09:48

http://www.vckbase.com/bbs/prime/viewprime.asp?id=366

 

为了在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;

原创粉丝点击