首页 > 编程资源分享区 > C/C++源代码共享 > 在Direct3D中创建暗灯特效
2006
07-29

在Direct3D中创建暗灯特效

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


留下一个回复