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

天行健 君子當自強而不息

Direct3D程序設計基礎(2)

創建窗口

Direct3D是基于Microsoft Windows的圖形開發接口,它的使用必須建立在Windows窗口的基礎上,這就需要創建一個窗口,而創建窗口首先需要注冊一個窗口類。示例程序中注冊窗口類并根據窗口類創建窗口的代碼如下:

	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, 200, 100, 600, 500,
NULL, NULL, wc.hInstance, NULL);
	if(hwnd == NULL)
return -1;

 

初始化Direct3D

創建了可供繪制圖形的窗口后,在使用Direct3D渲染圖形前,還需要進行與Direct3D相關的初始化操作,主要包括創建Direct3D對象并獲取其接口指針,通過Direct3D對象創建Direct3D設備對象。

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;
}

Direct3D設備(Direct3D Device)定義了Direct3D的所有繪圖操作,絕大多數Direct3D操作都是通過Direct3D設備接口進行的。比較而言,Direct3D對象更像是DirectX顯示信息的說明,而Direct3D設備對象則是3D功能的具體實現。

要創建Direct3D設備,可調用IDirect3D9::CreateDevice()函數。

Creates a device to represent the display adapter.

HRESULT CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS * pPresentationParameters,
IDirect3DDevice9 ** ppReturnedDeviceInterface
);

Parameters

Adapter
[in] Ordinal number that denotes the display adapter. D3DADAPTER_DEFAULT is always the primary display adapter.
DeviceType
[in] Member of the D3DDEVTYPE enumerated type that denotes the desired device type. If the desired device type is not available, the method will fail.
hFocusWindow
[in] The focus window alerts Direct3D when an application switches from foreground mode to background mode. See Remarks.
  • For full-screen mode, the window specified must be a top-level window.
  • For windowed mode, this parameter may be NULL only if the hDeviceWindow member of pPresentationParameters is set to a valid, non-NULL value.
BehaviorFlags
[in] Combination of one or more options that control device creation. For more information, see D3DCREATE.
pPresentationParameters

Pointer to a D3DPRESENT_PARAMETERS structure, describing the presentation parameters for the device to be created. If BehaviorFlags specifies D3DCREATE_ADAPTERGROUP_DEVICE, pPresentationParameters is an array. Regardless of the number of heads that exist, only one depth/stencil surface is automatically created.

[in, out] For Windows 2000 and Windows XP, the full-screen device display refresh rate is set in the following order:
  1. User-specified nonzero ForcedRefreshRate registry key, if supported by the device.
  2. Application-specified nonzero refresh rate value in the presentation parameter.
  3. Refresh rate of the latest desktop mode, if supported by the device.
  4. 75 hertz if supported by the device.
  5. 60 hertz if supported by the device.
  6. Device default.

An unsupported refresh rate will default to the closest supported refresh rate below it. For example, if the application specifies 63 hertz, 60 hertz will be used. There are no supported refresh rates below 57 hertz.

pPresentationParameters is both an input and an output parameter. Calling this method may change several members including:

  • If BackBufferCount, BackBufferWidth, and BackBufferHeight are 0 before the method is called, they will be changed when the method returns.
  • If BackBufferFormat equals D3DFMT_UNKNOWN before the method is called, it will be changed when the method returns.

 

ppReturnedDeviceInterface
[out, retval] Address of a pointer to the returned IDirect3DDevice9 interface, which represents the created device.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be one of the following: D3DERR_DEVICELOST, D3DERR_INVALIDCALL, D3DERR_NOTAVAILABLE, D3DERR_OUTOFVIDEOMEMORY.

Remarks

This method returns a fully working device interface, set to the required display mode (or windowed), and allocated with the appropriate back buffers. To begin rendering, the application needs only to create and set a depth buffer (assuming EnableAutoDepthStencil is FALSE in D3DPRESENT_PARAMETERS).

When you create a Direct3D device, you supply two different window parameters: a focus window (hFocusWindow) and a device window (the hDeviceWindow in D3DPRESENT_PARAMETERS). The purpose of each window is:

  • The focus window alerts Direct3D when an application switches from foreground mode to background mode (via Alt-Tab, a mouse click, or some other method). A single focus window is shared by each device created by an application.
  • 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.

This method should not be run during the handling of WM_CREATE. An application should never pass a window handle to Direct3D while handling WM_CREATE. Any call to create, release, or reset the device must be done using the same thread as the window procedure of the focus window.

Note that D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, and D3DCREATE_SOFTWARE_VERTEXPROCESSING are mutually exclusive flags, and at least one of these vertex processing flags must be specified when calling this method.

Back buffers created as part of the device are only lockable if D3DPRESENTFLAG_LOCKABLE_BACKBUFFER is specified in the presentation parameters. (Multisampled back buffers and depth surfaces are never lockable.)

The methods IDirect3DDevice9::Reset, IUnknown, and IDirect3DDevice9::TestCooperativeLevel must be called from the same thread that used this method to create a device.

D3DFMT_UNKNOWN can be specified for the windowed mode back buffer format when calling IDirect3D9::CreateDevice, IDirect3DDevice9::Reset, and IDirect3DDevice9::CreateAdditionalSwapChain. This means the application does not have to query the current desktop format before calling IDirect3D9::CreateDevice for windowed mode. For full-screen mode, the back buffer format must be specified.

If you attempt to create a device on a 0x0 sized window, IDirect3D9::CreateDevice will fail.

 

消息循環

在Direct3D中,渲染圖形通常是在消息循環中進行的:

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

這段代碼的主要部分由PeekMessage()、TranslateMessage()和DispatchMessage()構成,它們是Windows程序標準的消息循環處理代碼。當應用程序消息隊列中出現一條消息時,PeekMessage()返回布爾值TRUE,執行TranslateMessage()進行消息轉換,然后由DispatchMessage()把消息傳遞給窗口過程函數。

特別需要注意的是,在消息循環中使用的是PeekMessage()函數,而不是GetMessage()函數。函數PeekMessage()和GetMessage()的功能大體相同,作用都是從消息隊列中取一條消息出來,唯一不同的是,每當GetMessage()發現消息隊列中沒有消息時,過門不入,而PeekMessage()發現消息隊列中沒有消息時,會取回系統控制權,讓程序在此停留一段時間,應用程序就是在這時候處理render()函數。也就是說,渲染函數render()都是在程序運行時的空閑時間調用的。

注意理解PeekMessage()和GetMessage()運行機制的區別,這對理解Direct3D程序中如何實現動畫是很關鍵的。


posted on 2008-04-29 13:55 lovedday 閱讀(1272) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美伊人影院| 欧美大片免费| 鲁大师影院一区二区三区| 久久亚洲精品一区二区| 亚洲欧美在线磁力| 国产精品久久久久久久久婷婷| 亚洲自拍偷拍色片视频| 亚洲午夜女主播在线直播| 国产精品视频自拍| 麻豆精品在线视频| 欧美激情小视频| 亚洲综合另类| 久久久www成人免费无遮挡大片| 极品中文字幕一区| 亚洲日本aⅴ片在线观看香蕉| 欧美成人有码| 亚洲欧美激情诱惑| 欧美在线视频免费观看| 最近中文字幕mv在线一区二区三区四区| 欧美激情精品久久久久久| 欧美日韩一区在线观看视频| 久久gogo国模裸体人体| 裸体一区二区三区| 亚洲欧美日韩一区二区在线| 亚洲欧美另类综合偷拍| 亚洲激情自拍| 亚洲欧美激情一区| 91久久久一线二线三线品牌| 亚洲视频网在线直播| 在线精品一区二区| 中日韩在线视频| 亚洲国产综合视频在线观看| 亚洲天堂av图片| 亚洲第一精品影视| 亚洲欧美福利一区二区| 亚洲精品一区二区三区蜜桃久| 亚洲一区尤物| 91久久综合| 久久久久久久高潮| 亚洲欧美日韩一区二区| 欧美成人免费大片| 久久影院午夜片一区| 国产精品久久久久久久久久妞妞| 欧美国产综合一区二区| 国产午夜精品一区理论片飘花 | 亚洲国产免费看| 亚洲欧美一区二区原创| 一区二区黄色| 欧美成人免费大片| 女女同性女同一区二区三区91| 国产精品久久久久国产精品日日| 亚洲韩日在线| 亚洲国产成人在线视频| 久久成人综合网| 久久精品国产欧美亚洲人人爽| 欧美视频日韩视频| 妖精视频成人观看www| 日韩午夜中文字幕| 欧美第十八页| 亚洲国产视频一区| 99re这里只有精品6| 欧美肥婆bbw| 亚洲经典三级| 99av国产精品欲麻豆| 欧美二区在线播放| 亚洲三级电影全部在线观看高清| 在线观看久久av| 久热这里只精品99re8久| 久久资源av| 亚洲国产二区| 欧美激情视频网站| 亚洲另类在线一区| 亚洲一区二区三区高清 | 国产精品视频久久一区| 一区二区三区视频在线看| 亚洲一区二区av电影| 欧美日韩国产美女| 亚洲社区在线观看| 久久成人人人人精品欧| 国产综合久久| 麻豆av一区二区三区久久| 亚洲国产成人一区| 亚洲午夜久久久久久久久电影网| 欧美视频在线一区| 午夜日韩av| 欧美xart系列高清| 夜夜嗨av一区二区三区免费区| 欧美日韩在线免费观看| 亚洲视频一区二区免费在线观看| 欧美一二三视频| 曰韩精品一区二区| 欧美日韩国产高清| 亚洲欧美日韩区| 欧美国产先锋| 亚洲综合色自拍一区| 好吊色欧美一区二区三区四区| 久久夜色精品国产噜噜av| 亚洲精品视频在线观看免费| 午夜电影亚洲| 亚洲国产一区二区三区青草影视 | 欧美中文在线免费| 亚洲激情一区| 久久九九精品99国产精品| 91久久精品一区二区别| 欧美三区不卡| 久久这里有精品视频| 亚洲无线视频| 亚洲成人资源网| 久久aⅴ乱码一区二区三区| 亚洲精品日韩综合观看成人91| 国产精品久久久久久影视| 久久综合亚洲社区| 亚洲免费影院| 亚洲精品久久久久久久久| 欧美制服丝袜第一页| 一本大道久久a久久精品综合| 国产一区二区日韩精品| 欧美日韩岛国| 免费在线观看成人av| 欧美一区二区高清| 中国女人久久久| 最新日韩在线| 女人色偷偷aa久久天堂| 久久精品人人爽| 亚洲欧美激情视频| 99天天综合性| 亚洲日本视频| 亚洲电影免费在线观看| 国产亚洲精品久久久| 国产精品99一区| 欧美日韩精品三区| 欧美极品一区二区三区| 老**午夜毛片一区二区三区| 久久激情中文| 欧美影院在线播放| 午夜在线成人av| 午夜久久tv| 欧美伊人久久久久久午夜久久久久| 亚洲天堂免费观看| 亚洲天堂av高清| 亚洲一区二区三区精品动漫| 日韩一区二区福利| 一本久道久久久| 亚洲色诱最新| 亚洲伊人第一页| 亚洲欧美日韩另类| 性欧美暴力猛交另类hd| 亚洲欧美一区二区在线观看| 亚洲综合精品四区| 校园春色国产精品| 久久久xxx| 欧美成人免费小视频| 欧美精品国产精品| 欧美日韩国产bt| 国产精品久久久久久久午夜片| 国产精品白丝黑袜喷水久久久| 欧美午夜无遮挡| 国产视频不卡| 有码中文亚洲精品| 日韩香蕉视频| 亚洲免费视频中文字幕| 欧美一区二区三区在线观看| 久久久久高清| 欧美激情亚洲一区| 一本色道久久综合狠狠躁篇怎么玩 | 影音先锋中文字幕一区| 亚洲国产一成人久久精品| 日韩亚洲欧美精品| 亚洲一区美女视频在线观看免费| 性感少妇一区| 欧美1区3d| av成人免费在线观看| 性刺激综合网| 欧美v日韩v国产v| 国产精品视频一二三| 1204国产成人精品视频| 99国产精品久久久久久久久久| 亚洲欧美日韩国产成人| 久久综合色综合88| 99re8这里有精品热视频免费 | 亚欧成人精品| 欧美国产日韩二区| 国产日本亚洲高清| 亚洲免费电影在线观看| 久久精品国产精品亚洲| 亚洲第一页在线| 性欧美超级视频| 欧美日韩一级大片网址| 国产综合在线看| 亚洲一区二区在| 亚洲国产高潮在线观看| 欧美一区二区三区在线观看视频| 欧美激情综合色| 在线观看日韩| 久久精品国产99| 亚洲色图在线视频| 欧美精品手机在线| 亚洲国产日韩一区| 久久亚洲春色中文字幕| 亚洲视频在线观看网站|