(注:【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. 包含
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的初始化了。