zoukankan      html  css  js  c++  java
  • 在Direct3D中创建暗灯特效

    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;

  • 相关阅读:
    laravel blog 一
    dede:channelartlist currentstyle高亮显示
    dede调用导航/幻灯
    rmp 安装LNMP环境
    无极分类之子孙树、父辈树
    创始人 密码
    mysql报错显示法文解决办法
    渐变色背景
    laravel sendmail
    工作流系统webservice服务
  • 原文地址:https://www.cnblogs.com/carl2380/p/1934330.html
Copyright © 2011-2022 走看看