• <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>
            Dict.CN 在線詞典, 英語學習, 在線翻譯

            學海苦作舟,書山勤為徑

            留下點回憶

            常用鏈接

            統計

            積分與排名

            Denoise

            English study

            Web技術

            數據壓縮

            一些連接

            最新評論

            DirectX圖形的設備類型-D3D入門

            D3D設備是D3D的粉刷組件;它封裝并存儲粉刷的狀態,另外,D3D設備執行轉換和光操作,并光柵化一個圖像到一個面上。

            本節主要包括內容:

            1.  設備類型

            2.  創建設備

            3.  選擇設備

            4.  不為人知的設備

            5.  決定硬件支持

            6.  處理頂點數據

            7.  設備支持的初基類型

            按照架構來說,D3D設備包含一個轉換模塊、一個光模塊、一個光柵化模塊;如下圖所示:

            D3D Device ar.JPG


            D3D當前支持兩種主要類型的D3D設備:帶硬件加速的光柵化以及硬件和軟件頂點處理的陰影HAL設備、一個引用設備。

            你可以將這些設備看作兩個獨立的驅動。軟件和引用設備通過軟件驅動來表示,HAL設備通過硬件驅動來表示。最通常的利用這些設備的方式是在shipping程序中使用HAL設備作,在特性測試的時候引用驅動。第三方提供枚舉特殊的設備----例如,開發的硬件沒有發布。

            程序創建的D3D設備必須于程序正在運行的設備性能相匹配,通過訪問安裝在計算機上的硬件來訪問或者枚舉軟件中3D硬件能力來訪問。因此,D3D為硬件訪問和軟件枚舉提供設備。

            硬件加速設備比軟件設備有更好的性能,HAL設備類型在所有支持D3D圖像卡上可用。在大多數情況下,程序將有硬件加速的計算機作為目標并依賴軟件來適應低端計算機。

            由于引用設備的異常,軟件設備并不總是能提供和硬件設備相同的特性。程序可以查詢來決定設備支持那些特性。

            因為DirectX9提供的引用設備和軟件的行為等同于HAL設備,基于HAL設備上的程序編碼在軟件或引用設備無須修改。注意,提供的軟件或引用設備行為與HAL設備相同的時候,設備性能變化,特殊軟件設備可能實現較小部分的能力。

            行為

            D3D讓你可以指定設備行為,例如設備類型,IDirect3D9::CreateDevice方法來促使一個或多個行為多哥標志的聯合來控制D3D設備的全局行為。這些行為指定什么需要或不需要在D3D運行時維護,使用所有設備類型和所有設備行為是可能的。例如,在設備創建的時候使用D3DCREATE_PUREDEVICE來指定D3DDEVTYPE_SW是有效的。

            1.1.1.      設備類型

            ?       HAL設備

            最基本的設備類型是HAL設備,它支持硬件加速光柵化,且支持硬件和軟件頂點處理。如果你的正在運行程序的計算機配備了支持微軟Direct3D功能,你應該使用顯示卡來支持3D操作。Direct3D HAL設備以硬件的形式實現了全部或部分轉換、光和光柵化模塊。

            程序不需要直接訪問3D卡,它們調用Direct3D函數和方法,Direct3D通過HAL來訪問硬件。如果你的程序正在運行的那臺計算機上支持HAL,那么它通過使用HAL設備將獲得最好的性能。

            C++創建一個HAL設備,需要調用IDirect3D9::CreateDevice方法,并傳遞D3DDEVTYPE_HAL常量作為設備類。

            備注:硬件設備不能粉刷8位粉刷目標表面。

            ?       引用設備

            D3D另外支持引用設備類型或者叫引用光柵,與軟件設備不同的是,引用設備支持每個D3D特性,因為這些功能為了實現精確,而不是速度,并且以軟件實現,所以結果不是很快。無論什么時候,引用設備都利用特定的CPU指令,但它并不是為了某些程序使用的,使用引用設備僅僅是為了功能測試或演示的目的。

            為了在C++創建一個引用設備,調用IDirect3D9::CreateDevice方法,并傳遞D3DDEVTYPE_REF常量作為設備類型。

            1.1.2.    創建一個設備

            備注:所有通過給定的微軟D3D對象創建的粉刷設備都共享相同的物理資源。雖然你的程序能從一個單個D3D對象創建多個粉刷設備,由于他們使用同一個設備,所以你必須付出極端性能的懲罰。

            為了在C++程序中創建D3D設備,你的程序應該首先創建一個D3D對象,這個將在D3D對象中解釋。

            首先,初始化D3DPRESENT_PARAMETERS結構,它在創建D3D設備的時候用到,下面的代碼例子詳細說明一個窗口程序后臺緩沖區彈出到前臺緩沖區。

            LPDIRECT3DDEVICE9 pDevice = NULL;
            D3DPRESENT_PARAMETERS d3dpp; 
            ZeroMemory (&d3dpp, sizeof (d3dpp));
            d3dpp.Windowed   = TRUE;
            d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;

            下面,創建D3D設備,下面的IDirect3D9::CreateDevice調用指定默認的適配器,一個硬件抽象層設備和軟件頂點處理。

            if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&d3dDevice)))
            return E_FAIL;

            注意,創建、釋放、復位設備的調用應該在和焦點窗口的窗口程序在同一個線程中。

            在創建設備之后,設置它的狀態。

            1.1.3.    選擇一個設備

            程序能夠查詢硬件來檢查支持D3D設備的類型。本節包含在枚舉顯示適配器和選擇D3D設備的基本任務。

            程序必須執行一系列的任務來選擇一個適當的D3D設備。注意,下面的步驟目的是一個滿屏幕的程序,在多數情況下,一個窗口程序不能下面步驟的大部分。

            1.  初始化;

            程序必須枚舉系統上的顯示卡;一個卡就是一個物理硬件塊。注意,可能不止一塊圖形卡,例如雙重顯示的情況。與多監視器無關的程序可以忽略這步,并在第二步中傳遞D3DADAPTER_DEFAULT來調用IDirect3D9::EnumAdapterModes方法。

            2.  對于每塊卡,程序調用IDirect3D9::EnumAdapterModes來枚舉支持的顯示模式。

            3. 如果必要的話,程序需要調用IDirect3D9::CheckDeviceType來檢查每種枚舉模式中的硬件加速情況,如下面代碼所示。注意,這是唯一可能使用IDirect3D9::CheckDeviceType的地方,詳細見:判斷硬件支持。

            D3DPRESENT_PARAMETERS Params;

            // Initialize values for D3DPRESENT_PARAMETERS members.

            Params.BackBufferFormat = D3DFMT_X1R5G5B5;

            if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter,                           Device.m_DevType,Params.BackBufferFormat,  Params.BackBufferFormat,  FALSE)))

                    return E_FAIL;

            4.  程序檢查調用IDirectD39::GetDeviceCaps方法來檢查該卡上期望的設備功能級別。該方法過濾那些不支持需要功能的設備,IDirect3D9::GetDeviceCaps返回的設備能力對于一個通過所有IDirect3D9::CheckDeviceType檢查的設備來說是一個常量。

            5.  設備總是能夠粉刷設備支持一個枚舉顯示模式格式的面。如果要求粉刷一個不同格式的面,它調用IDirect3D9::CheckDeviceFormat,如果設備能粉刷這個格式,就可以保證所有IDirect3D9::GetDeviceCaps返回的能力都適用。

            6.  最后,程序可以決定是否采用多采樣技術,例如:使用IDirect3D9::CheckDeviceMultiSampleType方法來支持一個全場景 antialiasing作為粉刷格式。

            在完成上面的步驟之后,程序應該有一個它可以操作的顯示模式列表,最后一步就是核實有足夠可用的設備可訪問的內存來滿足緩沖區和antialiasing的需要。這個測試是必要的,因為模式和多采樣合并的內存消耗在核實之前并不可預知,另外,有些顯卡結構并不是有一個固定的設備訪問內存;這意味著程序或許會在“滿屏模式”的時候報“顯存溢出”的錯誤。典型地,程序應該從它提供給用戶的模式列表中刪除滿屏模式,或者應該試著通過減少后臺內存的數量來消耗較少的內存,或者使用不是怎么復雜的多采樣技術。

            窗口程序執行同樣的一系列任務。

            1.  判斷被窗口客戶區覆蓋的桌面矩形

            2.  枚舉顯卡,查詢顯卡看哪個監視器覆蓋了客戶區,如果客戶區被多個卡擁有,那么程序能選擇獨立地驅動每塊卡,或者驅動單個卡且有D3D從一個設備到另一個設備傳遞像素。程序也可以不管上面的兩步而使用D3DADAPTER_DEFAULT卡。注意,這可能導致將窗口放置到一個次要的監視器較慢。

            3.  程序應該調用IDirect3D9::CheckDeviceType來決定在桌面模式下設備是否能支持指定格式的后臺緩沖區的粉刷。IDirect3D9::GetAdapterDisaplayMode可用來判斷桌面顯示格式,如下面代碼:

            D3DPRESENT_PARAMETERS Params;

            // Initialize values for D3DPRESENT_PARAMETERS members.

            // Use the current display mode.

            D3DDISPLAYMODE mode;

            if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter, &mode)))

            return E_FAIL;

            Params.BackBufferFormat = mode.Format;

            if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter,Device.m_DevType,Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))

                   return E_FAIL;

            1.1.4.    放棄一個設備

            微軟的D3D設備可以處在操作狀態或放棄狀態;操作狀態是設備的正常的狀態,設備按照預期來運行和表現所有的粉刷。當一個事件發生時,設備會轉換到放棄狀態,例如在滿屏模式下丟失鍵盤焦點,導致粉刷變成不可能。丟失狀態是所有粉刷操作平靜失敗的表現,這意味著粉刷操作不能返回成功代碼,即使是在粉刷操作失敗的情況下(The lost state is characterized by the silent failure of all rendering operations, which means that the rendering methods can return success codes even though the rendering operations fail);在這種情況下,IDirect3DDevice9::Presenter將返回錯誤代碼D3DERR_DEVICELOST

            根據設計,能導致設備變成丟失狀態的全套場景是不確定的,某些典型的例子包括焦點丟失,例如當用戶按下ALT+TAB或一個系統對話框被初始化時,設備也可以由于電源管理事件而丟失,或者當另外一個程序采用滿屏操作時;另外任何來自IDirect3DDevice9::Reset的失敗都將導致設備進入丟失狀態。

            所有繼承自IUnknow的方法都可保證在設備丟失之后正常工作。在設備都是之后,每個函數通常有三個選擇:

            1.              失敗并返回D3DERR_DEVICELOST;這意味著程序需要認識丟失的設備,以便于程序能標識那些不能按照預期發生的事情。

            2.              安靜地失敗,返回S_OK或者其他的返回值-如果一個函數安靜地失敗,程序通常不能區分是成功的結果還是安靜地失敗

            3.              函數返回一個返回值。

            1.1.4.1.    對丟失設備的響應

            一個丟失的設備在它已經被復位以后必須重創建資源(包括顯存資源)。如果一個設備丟失了,程序查詢設備來看是否能夠恢復到操作狀態;如果不能,程序等待,直到設備可以被恢復。

            如果設備可以被恢復,程序通過銷毀所有的顯存資源和任何交換鏈來準備設備,然后,程序調用IDirect3DDeivice9::Reset方法;方法Reset是設備丟失之后唯一有效的方法,也是程序唯一用來改變丟失設備到操作狀態的方法。IDirect3DDevice9::Reset只有在程序釋放了所有以D3DPOOL_DEFAULT方式分配的資源時才會失敗,這些資源包括由IDirect3DDevice9::CreateRenderTargetIDirect3DDevice9::CreateDepthStencilSurface方法創建的資源。

            大部分情況,頻繁的調用D3D并不會返回設備已經丟失的信息。程序能繼續調用粉刷方法,例如:IDirect3DDevice9::DrawPrimitive,如果沒有接收到設備丟失的通知;而在內部,這些操作被拋棄直到設備被復位為可操作狀態。

            程序可以通過查詢IDirect3DDevice9::TestCooperativeLevel方法來決定遇到丟失設備的時候如何做。

            1.1.4.2.    鎖定操作

            D3D內部,其做了充分的工作保證設備丟失之后鎖定操作能成功;然而,它不保證在鎖定操作過程中顯存資源數據是準確的。它確保不返回錯誤代碼,這允許程序在鎖定操作過程中是可寫的如果不關心設備丟失。

            1.1.4.3.    資源

            資源能消耗顯存,因為一個丟失設備從顯卡擁有的顯存斷開,在設備丟失時不可能擔保分配顯存。結果所有資源創建方法都被實現為成功返回D3D_OK,但實際上僅僅分配虛擬系統內存;因為任何顯存資源必須在設備調整大小的之前被銷毀,沒有過量分配顯存的問題。這些虛擬的表面允許鎖定和復制操作看起來運行的很正常,直到程序調用IDirect3DDevice9::Present和發現設備已經丟失了。

            所有顯存必須在設備從丟失狀態被復位為操作狀態之前釋放;這意味著程序應該釋放任何通過IDirect3DDevice9::CreateAdditionalSwapChain創建的交換鏈和任何放在D3DPOOL_DEFAULT內存類中的資源,其他狀態數據會在轉換到操作狀態時自動被銷毀。

            開發一個單響應設備丟失編碼途徑是值得鼓勵的;如果不同,這個編碼途徑很可能與設備啟動時初始化的編碼途徑相似。

            1.1.4.4.    重新得到數據

            D3D允許程序允許程序驗證紋理并粉刷狀態,而不是通過IDirect3DDevice::ValidateDevice硬件來單向粉刷。這個方法通常在程序初始化的時候調用,如果設備丟失將返回D3DERR_DEVICELOST。

            D3D也允許程序從顯存資源復制產生的和以前寫的圖像到永久系統內存資源,因為源圖像可能在任何時候丟失,D3D允許在設備都是的時候復制操作失敗。

            關于異步查詢,如果FLUSH標志被設置,IDirect3DQuery9::GetData返回D3DERR_DEVICELOST,為了指示IDirect3DQuery9::GetData永遠不會返回S_OK。

            復制操作,IDirect3DDevice9::GetFontBufferData失敗并返回D3DERR_DEVICELOST,由于在設備丟失的時候沒有基本的表面。IDirect3DDevice9::CreateAdditionalSwapChain在設備的丟失的時候不能創建BACK緩沖區而失敗并返回D3DERR_DEVICELOST。這些情況是除IDirect3DDevice9::Present 、IDirect3DDevice9::TestCooperativeLevelIDirect3DDevice9::Reset方法之外返回D3DERR_DEVICELOST的唯一情況。

            1.1.4.5.    可編程陰影

            在微軟D3D 9.0中,Vertex Shader1_1Pixel_Shader_1_X并不需要在復位之后重新創建,他們會被記住。在以前的DirectX版本中,丟失設備要求陰影也需要重新創建。

            1.1.5.    判斷硬件支持

            微軟D3D提供了下面的函數來判斷硬件的支持情況。

            1.  IDirect3D9::CheckDeviceFormat

            用來判斷一個表面格式是是否可以用作紋理,一個格式是否能用作紋理和粉刷對象或者一個表面格式是否可以用作深度模板緩沖區。另外,這個方法被用來驗證深度緩沖區格式支持和深度模板緩沖區格式支持。

            2.  IDirect3D9::CheckDeviceType

            用來驗證設備執行硬件加速的能力,一個設備能力來為表現構造交換鏈,或者一個粉刷當前顯示格式的設備能力。

            3.  IDirect3D9::CheckDpthStencilMatch

            用來驗證一個深度模板緩沖區格式是否和一個粉刷目標格式相兼容。注意,在調用該方法之前,程序應該調用在深度模板和粉刷目標格式上都調用過IDirect3D9::CheckDeviceFormat方法。

            1.1.6.    處理頂點數據

            IDirect3DDevice9接口支持以軟件和硬件的方式的頂點處理。通常對于軟件和硬件頂點處理的設備能力是不同的;硬件能力是可邊的,依賴于顯示卡和驅動,而軟件呢能是固定的。

            下面的標志用來控制HAL和引用設備的頂點處理行為。

            l         D3DCREATE_SOFTWARE_VERTEXPROCESSING

            l         D3DCREATE_HARDWARE_VERTEXPROCESSING

            l         D3DCREATE_MIXED_VERTEXPROCESSING

            在調用IDirect3D9::CreateDevice時指定頂點處理行為標志之一,也可以指定混合模式,用來表示可以指定硬件和軟件頂點處理模式。在任何時候僅僅可以為一個設備設置一種頂點處理標志。注意,D3DCREATE_HARDWARE_VERTEXPROCESSING標志在創建虛設備(D3DCREATE_PUREDEVICE)的時候要求被設置。

            為了避免在單個設備上的多重頂點處理,僅僅硬件頂點處理能力可以在運行時查詢,軟件頂點處理能力是固定的,在運行時不能查詢。

            你能和D3DCAPS9VerterProcessingCaps成員商討來決定設備的硬件處理能力,對于軟件頂點處理支持下面的能力:

            l         D3DVTXPCAPSD3DVTXPCAPS_DIRECTIONALLLIGHTS成員

            l         D3DVTXPCAPSD3DVTXPCAPS_LOCALVIEWER成員

            l         D3DVTXPCAPSD3DVTXPCAPS_POSITIONALLIGHTS成員

            l         D3DVTXPCAPSD3DVTXPCAPS_TEXGEN成員

            l         D3DVTXPCAPSD3DVTXPCAPS_TWEENING成員

            另外,下表列出了軟件頂點出來模式時D3DCAPS9成員的設置值:

            成員

            軟件頂點處理能力

            MaxActiveLights

            無限制

            MaxUserClipPlanes

            6

            MaxVertexBlendMatrices

            4

            MaxStreams

            16

            MaxVertexIndex

            0xFFFFFFFF

            軟件頂點處理提供一系列頂點處理能力,包括一些極大數量的光和可編程頂點陰影完全支持。你能夠在使用HAL設備的任何時候在軟件和硬件頂點處理之間切換,唯一同時支持硬件和軟件頂點處理的設備類型。唯一要求是用做軟件頂點處理的頂點緩沖區必須被分配在系統內存中。

            posted on 2006-02-25 01:03 笨笨 閱讀(2190) 評論(0)  編輯 收藏 引用 所屬分類: DirectX3D

            99久久亚洲综合精品网站| 亚洲国产精品无码久久一区二区| 国产精品天天影视久久综合网| 久久香蕉国产线看观看99| 久久毛片免费看一区二区三区| 久久乐国产综合亚洲精品| 亚洲精品美女久久777777| 国产精品永久久久久久久久久| 一本久道久久综合狠狠躁AV| 久久精品黄AA片一区二区三区| 久久久久国产亚洲AV麻豆| 国产成人精品综合久久久| 精品久久久久一区二区三区| 亚洲va久久久噜噜噜久久天堂| 99久久精品无码一区二区毛片 | 狠狠色噜噜色狠狠狠综合久久| 男女久久久国产一区二区三区 | 久久乐国产精品亚洲综合| 久久久精品人妻一区二区三区四 | 久久国产精品-久久精品| 久久亚洲精品国产亚洲老地址| 久久99精品国产99久久6| 久久精品国产亚洲麻豆| 蜜臀久久99精品久久久久久小说| 亚洲午夜精品久久久久久浪潮| 91亚洲国产成人久久精品网址| 99久久99久久久精品齐齐| 午夜欧美精品久久久久久久| 久久久久亚洲AV无码专区首JN| 日韩AV毛片精品久久久| 久久se这里只有精品| 久久成人永久免费播放| 国产精品美女久久久网AV| 久久精品国产精品青草| 久久美女人爽女人爽| 国产2021久久精品| 国产精品亚洲综合专区片高清久久久 | 伊人久久大香线蕉av一区| 久久久久久精品免费免费自慰| 成人久久免费网站| 亚洲女久久久噜噜噜熟女|