d3d基本框架

 

一、D3D簡述

        由微軟公司開發的DirectX,並不是一個單純的圖形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個組件,它提供了一整套的多媒體接口方案。

        D3D即Direct3D是DirectX的三維部分,集成了開發DirectX程序三維圖形部分的所有API程序,同時它支持與CUDA的互操作,這樣經CUDA並行計算後圖像數據可以直接供D3D做顯示,這非常適合圖形圖像系統的研發。

 

二、D3D程序基本結構

          一個D3D程序除去Windows窗口生成和消息傳遞,主要包含3個步驟:

       初始化D3D設備資源--->圖形顯示設置---->D3D資源設備釋放。

 

1、初始化D3D設備資源

     建一個D3D接口:

      LPDIRECT3D9   g_pD3D = NULL;

      g_pD3D                               =Direct3DCreate9(D3D_SDK_VERSION);

   LPDIRECT3D9的對象是D3D程序的最頂層對象,其它對象都必須通過它的接口函數調用得到。

   Direct3DCreate9(D3D_SDK_VERSION)函數就是創建一個當前版本的一個D3D對象並返回接口。

 

     創建D3D設備對象:

    

D3DPRESENT_PARAMETERS d3dpp;                                    //顯示參數

d3dpp.BackBufferWidth = 800;                                                    //顯示像素x

d3dpp.BackBufferHeight = 600;                                                   //顯示像素y

d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;                 //32位像素格式

d3dpp.BackBufferCount = 1;                                                        //備緩衝表面的數量,通常設爲“1

d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;         //全屏抗鋸齒的類型

d3dpp.MultiSampleQuality = 0;                                                     //全屏抗鋸齒的質量等級

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;            //指定表面在交換鏈中是如何被交換的

d3dpp.hDeviceWindow = hwnd;

d3dpp.Windowed = false;                                                               //true表示窗口顯示,false爲全屏顯示

d3dpp.EnableAutoDepthStencil = true;                                        //設爲trueD3D將自動創建深度/模版緩衝                         

d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;              // 深度/模版緩衝的格式

d3dpp.Flags = 0;                                                                            //附加特性,可以設爲D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL

//深度/模版緩衝在調用IDirect3DDevice9::present方法後將被刪除,這有利於提程序性能提升

 

d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;   //刷新率,設定D3DPRESENT_RATE_DEFAULT使用默認 刷新率

d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;    //PresentationInterval——屬於D3DPRESENT成員,又有兩個 常用標誌,其餘請查SDK

   D3DPRESENT_INTERVAL_IMMEDIATE——立即交換

  D3DPRESENT_INTERVAL_DEFAULT——D3D選擇交換速度,通常等於刷新率

 

IDirect3DDevice9* device = 0;                                                   //d3d設備

hr = g_pD3D->CreateDevice(

     D3DADAPTER_DEFAULT,                                                 // 指定對象要表示的物理顯示設備

     D3DDEVTYPE_HAL,                                                            // 定設備類型 硬件設備D3DDEVTYPE_HAL,     

                                                                                                                                軟件設備D3DDEVTYPE_REF

     hwnd,                                                                                        // window associated with device

     D3DCREATE_HARDWARE_VERTEXPROCESSING,  // 頂點處理類型,硬件處理方式。軟件處理方式爲

                                                                                                         D3DCREATE_SOFTWARE_VERTEXPROCESSING

     &d3dpp,                                                                                   // 顯示參數

     &device);                                                                                

   if( FAILED(hr) )

   {

     ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);

     return 0;

   }

 

 2、圖形顯示

HRESULT IDirect3DDevice9::Clear()函數的作用是在繪製函數前,重置viewport的緩衝區,這是在繪製3D圖形前必須調用的

BeginScene()和EndScene()分別爲開始和結束渲染,兩者必須成對出現,並且不允許嵌套和交錯。注意圖形渲染的結果是存儲在後臺緩衝區的。

HRESULT IDirect3DDevice9:: Present()函數是將圖形渲染的結果由後臺緩衝區複製到前臺緩衝區予以顯示。

 

               device->Clear(0, 0,

                     D3DCLEAR_TARGET ,

                     D3DCOLOR_XRGB(125,0,255), 1.0f,0);

              device->BeginScene();

                   // ........ //添加紋理渲染,圖元繪製等函數

              device->EndScene();

              //將渲染的結果存儲到後臺緩衝區

              //0表示更新所有的緩衝區

              device->Present(0, 0, 0, 0);

 

3、D3D設備資源釋放

       釋放D3D設備資源的方法如下:

       if( device )    device->Release();

       if(g_pD3D)  g_pD3D->Release();

     

Release()函數會將調用這個設備的DirectX對象的引用計數減1,當DirectX對象的引用計數爲0時,它就會釋放它所佔有的資源。

 

 

 

 

 

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章