【D3D11遊戲編程】學習筆記四:準備工作

       (注:【D3D11遊戲編程】學習筆記系列由CSDN作者BonChoix所寫,轉載請註明出處:http://blog.csdn.net/BonChoix,謝謝~)

 

       現在可以開始接觸D3D了,但是在開始前,還有一小部分準備工作要做,即配置開發環境。

       配置環境相當簡單,屬於一勞永逸那種。接觸過遊戲編程的同學絕大多數應該很熟悉這個步驟了,但爲了保證一致,防止後面學習過程中因爲遺漏掉哪一部而浪費大量時間,我在這裏把所有必要步驟整理一下,按照這些步驟做完,後面學習過程基本上就再也不用爲這類問題耗費時間了。

       一、 安裝最新版的DirectX SDK

       這一步對於已經在學遊戲編程的同學來說,肯定早就完成啦。除非在通過OpenGL學習,否則任何一本教材第一件事都會告訴你,到微軟官方網站下載、安裝最新的SDK。目前最新版的SDK爲2010年六月份推出的版本,選擇自己喜歡的目錄安裝。安裝成功後所在目錄文件夾名爲“Microsoft DirectX SDK (June 2010)”。後面配置IDE環境變量時都跟這目錄有關。

       二、 編譯DirectX自帶的Effect框架

       這一步可能很多人沒做過。Effect框架是微軟額外提供的一個程序框架,使用戶在程序中使用shader時與C++程序更方便地銜接。這個框架對於編寫D3D程序來說不是必需的,好比D3DX庫對於D3D程序來說也是可有可無的。但它畢竟大大方便了我們使用shader,在學習過程把心思放在要點上,因此在後面學習過程中將全程使用Effect框架。但是從direct11開始,Effect框架開始以源碼形式提供,而不是直接編譯好的,因此需要我們手動來編譯,以生成相應的.lib庫(針對Debug和Release各一個)文件在程序鏈接時使用。

       編譯方法很簡單,進入到你安裝SDK的目錄,即“Microsoft DirectX SDK (June 2010)”,進Samples目錄,繼續進C++\Effects11目錄,這裏就是微軟提供給我們的Effect框架的所有源代碼。找到相應版本的Visual Studio對應的.sln文件,打開。(注意不同版本的VS要使用不同的.sln文件,比如2008版的跟2010版的就不一樣。)打開後即可以直接Build了。選擇Debug和Release配置各Build一次,在相應的Debug和Release目錄裏面會出現對應的Effects11.lib文件,這就是我們要的東西。注意Debug配置下Build出來的.lib文件名字應該跟Release下出來的名字一樣(Effects11.lib),把它改名爲Effects11d.lib,以區別於Release模式對應的文件。這兩個文件在後面工程中會跟d3d11.lib等這些lib文件一樣使用,因此最好找個固定的地方放起來(可以跟其他lib文件放到一個目錄下),這樣配置目錄時更方便。

       這裏給出Build的方法,即右鍵單擊側邊欄中的項目名字,出現菜單中第一行即是Build。如下圖:

       三、 配置Visual Studio環境變量

       我自己最喜歡使用的IDE是Visual Studio,2010版。畢竟學習的是微軟的技術,用自家的IDE肯定最合適不過了。對於習慣使用其他IDE的也一樣,配置原理都一樣的。首先當然是創建Win32應用程序,項目建立起來後開始配置。

       同樣是項目名字右鍵單擊,選最下方Properties(屬性),

 

       彈出的對話框中左側欄選擇VC++ Directories,

 

       右邊的Include Directories和Library Directories即是我們要修改的地方。

       在Include Directories裏面最前方把你安裝SDK的Include那個目錄(即:xxx\Microsoft DirectX SDK (June 2010)\Include)複製進去即可,最加加分號(;)與後面的目錄分開。其次還要記得把Effect框架對應的頭文件目錄也加進來,即之前Build框架時所在的目錄裏面的Inc目錄(我們要的頭文件爲”d3dx11effect.h")。對於Library Directories也一樣,把你SDK目錄對應的Lib目錄(X64還是X86取決於你機器是64位還是32位,不過x64都適合,即:xxx\Microsoft DirectX SDK (June 2010)\Lib\x86)複製到Library Directories裏面最前面即可,分號結尾。(注意:如果你沒把剛Build出來的Effect框架對應的兩個.lib文件放到這個目錄,則記得把那兩個文件對應的目錄也複製進來。)

       頭文件、庫文件目錄配置完畢。

       下面來指定鏈接的庫文件。在當前對話框左側欄繼續選擇“Linker",進一步選擇裏面的”Input",

       右邊第一行即“Additional Dependencies",把我們需要的.lib文件寫到這裏面即可。

       在我們學習d3d11過程中,要用到的庫文件爲(Debug模式):d3d11.lib、d3dx11d.lib、D3DCompiler.lib、Effects11d.lib、dxerr.lib、dxgi.lib、dxguid.lib。把所有這些庫文件添到每一行的最開始處,各文件間用分號分開。在對話框上面分別選擇Debug和Release兩種模式進行配置,

       對於Release模式,把末尾有'd'字符的去年'd'即可,比如Effects11d.lib在Release模式下對應的Effects11.lib文件,其他一樣。

       配置完畢,點擊”確定“結束對話框。

       四、 永久保存配置

       以上過程即是配置IDE的整個過程,即我們學習d3d11過程中創建項目完、開始寫代碼前要做的事情。但是按照這種方法配置是針對單個項目的,即每次新建項目後都要重新進行配置。我們學習d3d11過程中要經常創建新項目,每次配置環境是件很麻煩的事情,因此最好能在一次配置完畢後,可以永久保存,這樣以後再建項目就不用關心這個了。方法如下:

       在菜單中選擇"View",

       下拉框中選擇”Property  Manager“,

       在左側新出現的欄中雙擊項目名。

       此時會彈出一個跟剛纔配置環境時一樣的對話框,按照上面的步驟操作即可,Release和Debug都配置下。這時配置好、確定後,以後再打開不同項目時配置就已經保存在裏面啦~

       五、 Windows編程基礎

       把環境配置好之後,就可以真正開始寫代碼啦~ 不過學習d3d11前還有一點要求,就是熟悉下Win32編程。其實對於Win32編程完全沒必要精通,只要熟悉下最基本的原理即可,包括WinMain入門函數、創建窗口類、創建窗口、顯示窗口、消息循環、消息處理函數等。熟悉這些就足夠了,因爲我們學的是3D編程,而不是Windows桌面應用程序開發。只要熟悉下這些基礎知識,一次寫好代碼,以後是可以直接重用的,很少需要再關注Win32相關的代碼(偶爾個別程序需要特定的Win32 API來實現某個功能除外,查下MSDN即可)。

       作爲第一次創建Win32程序,最簡單的代碼如下:

       1. 包含<Windows.h>頭文件

       2. 指定入門函數int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int cmdShow)

       3. 創建、註冊窗口類WNDCLASS

	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0;
	wndcls.cbWndExtra = 0;
	wndcls.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
	wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
	wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wndcls.hInstance = hInstance;
	wndcls.lpfnWndProc = WinProc;
	wndcls.lpszClassName = L"d3d11";
	wndcls.lpszMenuName = NULL;
	wndcls.style = CS_HREDRAW | CS_VREDRAW;

	if(!RegisterClass(&wndcls))
	{
		MessageBox(NULL,L"窗口註冊失敗!",L"錯誤",MB_OK);
		return false;
	}


       4. 創建窗口CreateWindow

	HWND hWnd = CreateWindow(L"d3d11",
						L"D3D11學習",
						WS_OVERLAPPEDWINDOW,
			 			CW_USEDEFAULT,CW_USEDEFAULT,
						640,480,
						NULL,
						NULL,
						hInstance,
						NULL);
	if(!hWnd)
	{
		MessageBox(NULL,L"窗口創建失敗!",L"錯誤",MB_OK);
		return -1;
	}

       5. 顯示、更新窗口ShowWindow(),UpdateWindow()

	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);

       6. 進入消息循環

	MSG msg = {0};
	//主消息循環,也是遊戲當中的主循環
	while(msg.message != WM_QUIT)
	{
		if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);

		}
		else
		{
			//在這裏做該做的事
		}
	}

       7. 退出循環,結束

	return msg.wParam;

       此外,每個程序還要指定消息處理函數,比如WinProc,d3d應用程序中最簡單的消息處理函數如下:

	LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
	{
		switch(msg)
		{
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		}

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

       基本Win32程序就這樣,這裏只是把關鍵點列了下,如果完全沒接觸過Windows編程的話還是需要找專門的書來先學習下。這些基礎知識就可以作爲學習D3D11的開始了。

       以下是上述基本Win32程序整理後的代碼:

       BasicWin32

      

       接下來就是D3D的初始化了。

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