• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            光照與材質(3)

            設置燈光

            在Direct3D的一個場景中,最多可設置8個光源,設置光源由IDirect3DDevice9::SetLight()函數完成。該函數的聲明如下:

            Assigns a set of lighting properties for this device.

            HRESULT SetLight(
            DWORD Index,
            CONST D3DLight9 * pLight
            );

            Parameters

            Index
            [in] Zero-based index of the set of lighting properties to set. If a set of lighting properties exists at this index, it is overwritten by the new properties specified in pLight.
            pLight
            [in] Pointer to a D3DLIGHT9 structure, containing the lighting parameters to set.

            Return Values

            If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

            Remarks

            Set light properties by preparing a D3DLIGHT9 structure and then calling the IDirect3DDevice9::SetLight method. The IDirect3DDevice9::SetLight method accepts the index at which the device should place the set of light properties to its internal list of light properties, and the address of a prepared D3DLIGHT9 structure that defines those properties. You can call IDirect3DDevice9::SetLight with new information as needed to update the light's illumination properties.

            The system allocates memory to accommodate a set of lighting properties each time you call the IDirect3DDevice9::SetLight method with an index that has never been assigned properties. Applications can set a number of lights, with only a subset of the assigned lights enabled at a time. Check the MaxActiveLights member of the D3DCAPS9 structure when you retrieve device capabilities to determine the maximum number of active lights supported by that device. If you no longer need a light, you can disable it or overwrite it with a new set of light properties.

            The following example prepares and sets properties for a white point-light whose emitted light will not attenuate over distance.

            // Assume d3dDevice is a valid pointer to an IDirect3DDevice9 interface.
            D3DLight9 d3dLight;
            HRESULT hr;

            // Initialize the structure.
            ZeroMemory(&D3dLight, sizeof(d3dLight));

            // Set up a white point light.
            d3dLight.Type = D3DLIGHT_POINT;
            d3dLight.Diffuse.r = 1.0f;
            d3dLight.Diffuse.g = 1.0f;
            d3dLight.Diffuse.b = 1.0f;
            d3dLight.Ambient.r = 1.0f;
            d3dLight.Ambient.g = 1.0f;
            d3dLight.Ambient.b = 1.0f;
            d3dLight.Specular.r = 1.0f;
            d3dLight.Specular.g = 1.0f;
            d3dLight.Specular.b = 1.0f;

            // Position it high in the scene and behind the user.
            // Remember, these coordinates are in world space, so
            // the user could be anywhere in world space, too.
            // For the purposes of this example, assume the user
            // is at the origin of world space.
            d3dLight.Position.x = 0.0f;
            d3dLight.Position.y = 1000.0f;
            d3dLight.Position.z = -100.0f;

            // Don't attenuate.
            d3dLight.Attenuation0 = 1.0f;
            d3dLight.Range = 1000.0f;

            // Set the property information for the first light.
            hr = d3dDevice->SetLight(0, &d3dLight);
            if (SUCCEEDED(hr))
            // Handle Success
            else
            // Handle failure

            Enable a light source by calling the IDirect3DDevice9::LightEnable method for the device.

            函數IDirect3DDevice9::SetLight()只是設置光源,在默認情況下,設置的任何光源都還不起作用,具體使用哪些光源,由函數IDirect3DDevice9::LightEnable()確定,該函數聲明如下:

            Enables or disables a set of lighting parameters within a device.

            HRESULT LightEnable(
            DWORD LightIndex,
            BOOL bEnable
            );

            Parameters

            LightIndex
            [in] Zero-based index of the set of lighting parameters that are the target of this method.
            bEnable
            [in] Value that indicates if the set of lighting parameters are being enabled or disabled. Set this parameter to TRUE to enable lighting with the parameters at the specified index, or FALSE to disable it.

            Return Values

            If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

            Remarks

            If a value for LightIndex is outside the range of the light property sets assigned within the device, the IDirect3DDevice9::LightEnable method creates a light source represented by a D3DLIGHT9 structure with the following properties and sets its enabled state to the value specified in bEnable.

            Member Default
            Type D3DLIGHT_DIRECTIONAL
            Diffuse (R:1, G:1, B:1, A:0)
            Specular (R:0, G:0, B:0, A:0)
            Ambient (R:0, G:0, B:0, A:0)
            Position (0, 0, 0)
            Direction (0, 0, 1)
            Range 0
            Falloff 0
            Attenuation0 0
            Attenuation1 0
            Attenuation2 0
            Theta 0
            Phi 0

            因為鏡面反射的計算量很大,所以Direct3D在默認狀態下不進行鏡面反射運算。如果想得到鏡面反射效果,可以先設置好結構體D3DLIGHT9的Specular成員和物體表面材質結構體D3DMATERIAL9的Specular和Power成員,然后通過下面的代碼激活鏡面反射運算。

            g_device->SetRenderState(D3DRS_SPECULARENABLE, TRUE);

            如果需要進行漫反射或鏡面反射運算,那么在頂點緩沖區中必須包含頂點的法向量信息,這是因為Direct3D在進行光照運算時,要用到頂點法向量。

             

            材質

            對于光照計算,光源和材質兩者缺一不可,物體表面材質屬性決定了它能反射什么顏色的光線以及能反射多少,在Direct3D中,物體表面材質屬性由結構體D3DMATERIAL9定義:

            Specifies material properties.

            typedef struct D3DMATERIAL9 {
            D3DCOLORVALUE Diffuse;
            D3DCOLORVALUE Ambient;
            D3DCOLORVALUE Specular;
            D3DCOLORVALUE Emissive;
            float Power;
            } D3DMATERIAL9, *LPD3DMATERIAL9;

            Members

            Diffuse
            Value specifying the diffuse color of the material. See D3DCOLORVALUE.
            Ambient
            Value specifying the ambient color of the material. See D3DCOLORVALUE.
            Specular
            Value specifying the specular color of the material. See D3DCOLORVALUE.
            Emissive
            Value specifying the emissive color of the material. See D3DCOLORVALUE.
            Power
            Floating-point value specifying the sharpness of specular highlights. The higher the value, the sharper the highlight.

            Remarks

            To turn off specular highlights, set D3DRS_SPECULARENABLE to FALSE, using D3DRENDERSTATETYPE. This is the fastest option because no specular highlights will be calculated.

            For more information about using the lighting engine to calculate specular lighting, see Specular Lighting (Direct3D 9).

            浮點成員Power為鏡面反射指數,即鏡面反射光照計算模型計算公式中的n,Power值越大,高光強度和周圍亮度相差越大。

            Emissive表示物體自身的發光度,以R、G、B表示。

            物體頂點的顏色亮度總和為:

            Itotal = Iambient + Idiffuse + Ispecular + Iemissive

            I表示物體的顏色值,上式表示物體的顏色總和 = 物體反射環境光 + 物體反射漫反射光 + 物體反射鏡面光 + 物體自發光。

             

            設置材質

            函數IDirect3DDevice9::SetMaterial()用來設置Direct3D當前材質屬性,該函數聲明如下:

            Sets the material properties for the device.

            HRESULT SetMaterial(
            CONST D3DMATERIAL9 * pMaterial
            );

            Parameters

            pMaterial
            [in] Pointer to a D3DMATERIAL9 structure, describing the material properties to set.

            Return Values

            If the method succeeds, the return value is D3D_OK. D3DERR_INVALIDCALL if the pMaterial parameter is invalid.

            下面的示例代碼設置當前材質為能漫反射50%紅光、80%綠光和60%藍光的表面。

            D3DMATERIAL9 material;
            ZeroMemory(&material, sizeof(material));

            material.Diffuse.r = 0.5f;
            material.Diffuse.g = 0.8f;
            material.Diffuse.b = 1.6f;
            material.Diffuse.a = 0.0f;

            g_device->SetMaterial(&material);

            Direct3D圖形系統在進行光照計算時,會根據3種光照計算模型分別進行計算,然后將計算結果疊加在一起,作為頂點的光照顏色值,如果物體表面只能進行漫反射,則鏡面反射系數應當為0,這時鏡面反射計算得到的顏色值顯然為0,從而使物體不具有鏡面反射效果,但是實際上鏡面反射計算也在進行。因為鏡面反射計算量大,會對性能造成沖擊,所以如果物體表面不具有鏡面反射效果,就不要啟用鏡面反射計算。

            如果應用程序沒有指定材質屬性,系統將使用默認材質。默認材質反射所有漫反射光,沒有環境反射和鏡面反射,也沒有自發光顏色。

            默認材質的光照屬性

            成員

            默認值

            Diffuse (R:1, G:1, B:1, A:0)
            Specular (R:0, G:0, B:0, A:0)
            Ambient (R:0, G:0, B:0, A:0)
            Emissive (R:0, G:0, B:0, A:0)
            Power (0.0)

             

            獲取材質屬性

            通過調用接口函數IDirect3DDevice9::GetMaterial()可獲取渲染設備當前正在使用的材質屬性。

            Retrieves the current material properties for the device.

            HRESULT GetMaterial(
            D3DMATERIAL9 * pMaterial
            );

            Parameters

            pMaterial
            [out] Pointer to a D3DMATERIAL9 structure to fill with the currently set material properties.

            Return Values

            If the method succeeds, the return value is D3D_OK. D3DERR_INVALIDCALL if the pMaterial parameter is invalid.

            Remarks

            This method will not return device state for a device that is created using D3DCREATE_PUREDEVICE. If you want to use this method, you must create your device with any of the other values in D3DCREATE.


            posted on 2008-05-04 14:48 lovedday 閱讀(1337) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            伊人久久成人成综合网222| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩精品久久免费| 久久亚洲国产欧洲精品一| 一级女性全黄久久生活片免费 | 久久er99热精品一区二区| 99久久精品国产一区二区三区 | 久久精品国产半推半就| 伊人久久大香线蕉av不卡| 亚洲国产精品无码久久久久久曰 | 一本久久a久久精品综合夜夜| 亚洲欧美一级久久精品| 国产成人精品免费久久久久| 国产精品久久久久久久人人看| 99国产精品久久| 日本三级久久网| 久久综合给久久狠狠97色| 久久人人爽人人爽人人片AV不| 老司机国内精品久久久久| 亚洲AV无码一区东京热久久| 亚洲精品乱码久久久久久蜜桃图片| 夜夜亚洲天天久久| 久久精品人人槡人妻人人玩AV | 国内精品久久久久久中文字幕| 99久久人人爽亚洲精品美女| 日产精品久久久一区二区| 日韩亚洲国产综合久久久| 香蕉aa三级久久毛片| 久久97久久97精品免视看秋霞| 精品久久无码中文字幕| 漂亮人妻被黑人久久精品| 久久亚洲精品无码VA大香大香| 久久久国产一区二区三区| 久久久久亚洲av综合波多野结衣| 久久强奷乱码老熟女网站| 中文国产成人精品久久不卡| 久久综合视频网站| 无码人妻少妇久久中文字幕| 久久国产香蕉视频| 亚洲精品97久久中文字幕无码| 热久久国产欧美一区二区精品|