青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

Direct3D程序設計基礎(1)

Direct3D對象

Microsoft Direct3D的一種實現方式是通過組件對象模型(Component Object Model, COM)及其接口實現的,在用C++語言和COM接口方式開發的程序中可以直接訪問這些接口和對象。Direct3D對象是Direct3D程序中需要創建的第一個對象,也是需要最后一個釋放的對象,這里所說的對象是指COM對象。通過Direct3D對象,可以枚舉和檢索Direct3D設備,這樣應用程序就可以在不需要創建設備對象的前提下選擇Direct3D渲染設備。

在用C++語言編寫Direct3D程序時,需要先獲取一個指向IDirect3D9接口的指針,從而可以通過該接口調用Direct3D對象的功能。

 

創建Direct3D設備對象

創建Direct3D設備對象時,需要先創建Direct3D對象,然后再調用Direct3D對象的接口函數IDirect3D9::CreateDevice創建Direct3D設備對象。通過同一個Direct3D對象創建的所有Direct3D設備對象共享相同的物理資源(顯卡)。因為共享同一硬件,所以如果通過一個Direct3D對象創建多個Direct3D渲染設備對象會明顯降低系統性能。

在創建Direct3D設備對象之前,還需要先初始化D3DPRESENT_PARAMETERS結構,該結構用于創建Direct3D設備對象。D3DPRESENT_PARAMETERS結構定義了Direct3D設備對象的相關信息,而這些信息將會影響Direct3D設備的顯示方法。該結構的定義如下:

Describes the presentation parameters.

typedef struct D3DPRESENT_PARAMETERS {
UINT BackBufferWidth, BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;

Members

BackBufferWidth, BackBufferHeight
Width and height of the new swap chain's back buffers, in pixels. If Windowed is FALSE (the presentation is full-screen), these values must equal the width and height of one of the enumerated display modes found through IDirect3D9::EnumAdapterModes. If Windowed is TRUE and either of these values is zero, the corresponding dimension of the client area of the hDeviceWindow (or the focus window, if hDeviceWindow is NULL) is taken.
BackBufferFormat
The back buffer format. For more information about formats, see D3DFORMAT. This value must be one of the render-target formats as validated by IDirect3D9::CheckDeviceType. You can use IDirect3DDevice9::GetDisplayMode to obtain the current format.

In fact, D3DFMT_UNKNOWN can be specified for the BackBufferFormat while in windowed mode. This tells the runtime to use the current display-mode format and eliminates the need to call IDirect3DDevice9::GetDisplayMode.

For windowed applications, the back buffer format no longer needs to match the display-mode format because color conversion can now be done by the hardware (if the hardware supports color conversion). The set of possible back buffer formats is constrained, but the runtime will allow any valid back buffer format to be presented to any desktop format. (There is the additional requirement that the device be operable in the desktop mode; devices typically do not operate in 8 bits per pixel modes.)

Full-screen applications cannot do color conversion.

BackBufferCount
This value can be between 0 and D3DPRESENT_BACK_BUFFERS_MAX (or D3DPRESENT_BACK_BUFFERS_MAX_EX when using Direct3D 9Ex). Values of 0 are treated as 1. If the number of back buffers cannot be created, the runtime will fail the method call and fill this value with the number of back buffers that could be created. As a result, an application can call the method twice with the same D3DPRESENT_PARAMETERS structure and expect it to work the second time.

The method fails if one back buffer cannot be created. The value of BackBufferCount influences what set of swap effects are allowed. Specifically, any D3DSWAPEFFECT_COPY swap effect requires that there be exactly one back buffer.

MultiSampleType
Member of the D3DMULTISAMPLE_TYPE enumerated type. The value must be D3DMULTISAMPLE_NONE unless SwapEffect has been set to D3DSWAPEFFECT_DISCARD. Multisampling is supported only if the swap effect is D3DSWAPEFFECT_DISCARD.
MultiSampleQuality
Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. Paired values of render targets or of depth stencil surfaces and D3DMULTISAMPLE_TYPE must match.
SwapEffect
Member of the D3DSWAPEFFECT enumerated type. The runtime will guarantee the implied semantics concerning buffer swap behavior; therefore, if Windowed is TRUE and SwapEffect is set to D3DSWAPEFFECT_FLIP, the runtime will create one extra back buffer and copy whichever becomes the front buffer at presentation time.

D3DSWAPEFFECT_COPY requires that BackBufferCount be set to 1.

D3DSWAPEFFECT_DISCARD will be enforced in the debug runtime by filling any buffer with noise after it is presented.

hDeviceWindow
The device window determines the location and size of the back buffer on screen. This is used by Direct3D when the back buffer contents are copied to the front buffer during IDirect3DDevice9::Present.
  • For a full-screen application, this is a handle to the top window (which is the focus window).

    For applications that use multiple full-screen devices (such as a multimonitor system), exactly one device can use the focus window as the device window. All other devices must have unique device windows.

  • For a windowed-mode application, this handle will be the default target window for IDirect3DDevice9::Present. If this handle is NULL, the focus window will be taken.

Note that no attempt is made by the runtime to reflect user changes in window size. The back buffer is not implicitly reset when this window is reset. However, the IDirect3DDevice9::Present method does automatically track window position changes.

Windowed
TRUE if the application runs windowed; FALSE if the application runs full-screen.
EnableAutoDepthStencil
If this value is TRUE, Direct3D will manage depth buffers for the application. The device will create a depth-stencil buffer when it is created. The depth-stencil buffer will be automatically set as the render target of the device. When the device is reset, the depth-stencil buffer will be automatically destroyed and recreated in the new size.

If EnableAutoDepthStencil is TRUE, then AutoDepthStencilFormat must be a valid depth-stencil format.

AutoDepthStencilFormat
Member of the D3DFORMAT enumerated type. The format of the automatic depth-stencil surface that the device will create. This member is ignored unless EnableAutoDepthStencil is TRUE.
Flags
One of the D3DPRESENTFLAG constants.
FullScreen_RefreshRateInHz
The rate at which the display adapter refreshes the screen. The value depends on the mode in which the application is running:
  • For windowed mode, the refresh rate must be 0.
  • For full-screen mode, the refresh rate is one of the refresh rates returned by IDirect3D9::EnumAdapterModes.
PresentationInterval
The maximum rate at which the swap chain's back buffers can be presented to the front buffer. For a detailed explanation of the modes and the intervals that are supported, see D3DPRESENT.

 

Direct3D程序基本結構

雖然Direct3D功能非常強大,但是Direct3D程序的基本結構非常簡單清晰,它主要有5個步驟:

(1)創建一個Windows窗口。

(2)初始化Direct3D,包括創建Direct3D對象、Direct3D設備對象以及要渲染的圖形對象。

(3)消息循環。

(4)渲染圖形。

(5)清除在初始化時創建的所有COM對象,退出程序。

其中消息循環和渲染圖形不斷進行,如果程序有消息需要處理,則先處理消息,然后再渲染圖形;如果沒有消息處理,則一直不停地渲染圖形,直到退出Direct3D程序。

 

最簡單的Direct3D程序

#include <d3d9.h>

#define CLASS_NAME    "GameApp"

#define release_com(p)    { if(p) { (p)->Release(); (p) = NULL; } }

IDirect3D9
*            g_d3d;
IDirect3DDevice9
*    g_device;

bool init_d3d(HWND hwnd)
{
    g_d3d 
= Direct3DCreate9(D3D_SDK_VERSION);

    
if(g_d3d == NULL)
        
return false;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(
&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed            
= TRUE;
    d3dpp.SwapEffect        
= D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat    
= D3DFMT_UNKNOWN;

    
if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  
&d3dpp, &g_device)))
    {
        
return false;
    }

    
return true;
}

void cleanup()
{
    release_com(g_device);
    release_com(g_d3d);
}

void render()
{
    g_device
->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(4550170), 1.0f0);

    g_device
->BeginScene();

    
// render game scene here 

    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);
}

LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_KEYDOWN:
        
if(wParam == VK_ESCAPE)
            DestroyWindow(hwnd);
        
break;

    
case WM_DESTROY:        
        PostQuitMessage(
0);
        
return 0;
    }

    
return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
{
    WNDCLASSEX wc;

    wc.cbSize            
= sizeof(WNDCLASSEX);
    wc.style            
= CS_CLASSDC;
    wc.lpfnWndProc        
= WinProc;
    wc.cbClsExtra        
= 0;
    wc.cbWndExtra        
= 0;
    wc.hInstance        
= inst;
    wc.hIcon            
= NULL;
    wc.hCursor            
= NULL;
    wc.hbrBackground    
= NULL;
    wc.lpszMenuName        
= NULL;
    wc.lpszClassName    
= CLASS_NAME;
    wc.hIconSm            
= NULL;

    
if(! RegisterClassEx(&wc))
        
return -1;

    HWND hwnd 
= CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100600500,
                             NULL, NULL, wc.hInstance, NULL);

    
if(hwnd == NULL)
        
return -1;

    
if(init_d3d(hwnd))
    {
        ShowWindow(hwnd, SW_SHOWDEFAULT);
        UpdateWindow(hwnd);

        MSG msg;
        ZeroMemory(
&msg, sizeof(msg));

        
while(msg.message != WM_QUIT)
        {
            
if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
            {
                TranslateMessage(
&msg);
                DispatchMessage(
&msg);
            }
            
else
            {
                render();
            }
        }
    }

    cleanup();

    UnregisterClass(CLASS_NAME, wc.hInstance);    

    
return 0;
}

 

運行截圖:


posted on 2008-04-29 12:57 lovedday 閱讀(2804) 評論(2)  編輯 收藏 引用

評論

# re: Direct3D程序設計基礎(1) 2008-07-19 17:58 riki

真佩服你,你是從哪里找來那么全的資料的。我看你資料好久了。  回復  更多評論   

# re: Direct3D程序設計基礎(1) 2008-08-18 05:10 lyra

我也很佩服 人真好啊 弄這么多資料讓我們學習  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩午夜精品| 亚洲欧美日韩中文视频| 久久久99国产精品免费| 亚洲一区二区三区成人在线视频精品 | 狠狠色伊人亚洲综合网站色| 久久精品免视看| 欧美一区二区三区视频在线| 国产亚洲一本大道中文在线| 久久网站热最新地址| 久久久91精品国产一区二区三区 | 国产视频一区二区在线观看| 欧美中文在线观看国产| 久久本道综合色狠狠五月| 一区在线免费| 亚洲精品1区2区| 欧美日韩精品一区二区三区四区 | av不卡免费看| 亚洲女同在线| 亚洲高清毛片| 一级日韩一区在线观看| 国产一区视频观看| 亚洲大胆女人| 国产精品久久影院| 玖玖视频精品| 欧美日本一道本| 久久久精品日韩欧美| 免费日韩一区二区| 午夜精品www| 蜜臀av一级做a爰片久久| 99re8这里有精品热视频免费| 亚洲图片激情小说| 亚洲电影自拍| 在线一区二区三区四区五区| 今天的高清视频免费播放成人| 亚洲欧洲一区| 激情视频一区二区三区| 日韩午夜av在线| 国内激情久久| 亚洲无毛电影| 亚洲精品国产精品久久清纯直播| 亚洲尤物在线视频观看| 亚洲国产一二三| 欧美一区二区三区在线| 亚洲一区激情| 欧美chengren| 狂野欧美激情性xxxx| 国产精品久久久久国产精品日日 | 久久国产日韩欧美| 欧美激情在线观看| 久久一区欧美| 国产九九精品视频| 中日韩视频在线观看| 亚洲破处大片| 鲁大师影院一区二区三区| 欧美在线免费观看亚洲| 欧美系列亚洲系列| 亚洲精品你懂的| 亚洲精品视频啊美女在线直播| 欧美在线一区二区| 久久成人综合视频| 国产精品视频一区二区高潮| av成人天堂| 在线亚洲国产精品网站| 欧美理论电影网| 亚洲福利视频免费观看| 亚洲人成亚洲人成在线观看| 久久一区中文字幕| 欧美成人a∨高清免费观看| 红桃av永久久久| 久久精品国产一区二区三区免费看| 亚洲欧美日韩高清| 国产精品一区二区黑丝| 午夜精品国产精品大乳美女| 欧美在线日韩精品| 国产视频一区欧美| 欧美专区亚洲专区| 久久久久久综合网天天| 激情久久久久| 欧美暴力喷水在线| 亚洲精品国精品久久99热| 一区二区欧美国产| 国产精品久久久久久久久久免费 | 亚洲无限乱码一二三四麻| 亚洲网站在线| 国产精品视频免费一区| 亚洲欧美国产高清va在线播| 欧美在线三区| 一色屋精品视频免费看| 美女成人午夜| 日韩一级大片在线| 欧美一区亚洲二区| 在线观看成人av电影| 欧美精品福利在线| 亚洲视频电影在线| 美女黄毛**国产精品啪啪| 最新高清无码专区| 国产精品扒开腿爽爽爽视频| 欧美一区在线看| 亚洲电影av| 午夜精品一区二区三区电影天堂 | 亚洲精品乱码久久久久久日本蜜臀| 欧美激情自拍| 亚洲欧美一区二区三区在线 | 一本久道久久综合婷婷鲸鱼| 国产精品家教| 久热综合在线亚洲精品| 亚洲深夜福利| 欧美v国产在线一区二区三区| 亚洲最新在线视频| 国产一区二区三区网站| 欧美精品一区二区三区蜜桃| 亚洲欧美日韩中文播放| 亚洲国产日韩欧美在线动漫| 亚洲欧美视频在线观看视频| 亚洲高清av| 国产欧美一级| 欧美日韩综合另类| 久久影院午夜片一区| 亚洲在线成人精品| 亚洲精品国产精品国自产在线| 久久黄色网页| 亚洲深夜福利视频| 亚洲九九精品| 在线看视频不卡| 国产一区二区三区免费不卡| 欧美视频在线观看 亚洲欧| 美日韩精品免费观看视频| 欧美一区二区私人影院日本| 一本到高清视频免费精品| 欧美粗暴jizz性欧美20| 久久久久久久综合日本| 亚洲欧美日韩系列| 一区二区三区久久| 亚洲精品孕妇| 亚洲精品久久| 亚洲黄色影院| 在线观看一区二区精品视频| 国产香蕉97碰碰久久人人| 欧美性猛交xxxx乱大交蜜桃| 欧美另类99xxxxx| 欧美国产先锋| 欧美成人tv| 欧美激情第三页| 欧美激情第4页| 欧美顶级大胆免费视频| 欧美成人中文字幕| 男人插女人欧美| 欧美成人蜜桃| 欧美福利网址| 欧美日韩伦理在线免费| 欧美日韩亚洲一区在线观看| 欧美精品系列| 欧美日韩另类综合| 欧美日一区二区三区在线观看国产免| 欧美激情综合五月色丁香小说| 噜噜噜躁狠狠躁狠狠精品视频| 蜜臀av一级做a爰片久久| 久久婷婷一区| 欧美剧在线免费观看网站| 欧美涩涩网站| 国产日韩欧美综合精品| 一区二区三区在线视频播放| 亚洲第一级黄色片| 日韩网站在线观看| 亚洲综合大片69999| 久久超碰97人人做人人爱| 久久国产精彩视频| 欧美激情欧美狂野欧美精品| 亚洲国产另类精品专区| 一本色道久久加勒比88综合| 亚洲永久在线观看| 久久亚洲国产精品日日av夜夜| 欧美高清在线一区| 国产精品日韩欧美| 一区二区三区在线免费视频 | 国产精品免费一区二区三区观看| 国产精品嫩草久久久久| 曰韩精品一区二区| 亚洲精品一区二区三区在线观看| 亚洲视频在线看| 久久亚洲精品伦理| 亚洲免费不卡| 久久9热精品视频| 欧美日韩精品免费| 狠狠操狠狠色综合网| 一本久道综合久久精品| 久久精品午夜| 99视频热这里只有精品免费| 欧美中文字幕精品| 欧美日韩一区二区在线| 狠狠久久婷婷| 午夜精品久久久久久久男人的天堂 | 国产精品免费久久久久久| 精品999久久久| 亚洲欧美日韩国产一区| 欧美大片va欧美在线播放| 亚洲欧美日韩视频一区| 欧美激情一区二区三区全黄| 一区二区在线视频播放| 午夜伦理片一区|