(本系列文章由pancy12138编写,转载请注明出处:http://blog.csdn.net/pancy12138)
这篇文章应该属于开始编程的第一节了,这一节我们将要讲解如何使用C++初始化directx,以及一些新的调试技巧。因为windows程序框架相关的内容在入门篇的时候讲过了,而且也非常简单,如当初所说,大部分都是些傀儡代码,没什么难处。大家很容易就能看懂。所以这里不会再继续讲解这些东西,以图形学相关的知识为重点。
首先,我们需要知道directx11是面向对象的,这一点和openGL有本质上的区别。在dx11里面,其所有API函数几乎都被封装在了两个类里面,一个是d3ddevice(也就是d3d设备),一个是d3dcontex(也就是渲染描述表)。这两个类一个负责管理资源,一个负责管理绘制。这与当年的dx9是不同的,dx9当初把所有的API函数都封装在了d3ddevice里面,并没有把渲染部分的API拆成一个单独的类。因此dx11的架构可以说是更为细致和方便了一些。那么我们程序的书写方式也就很明显了,既然所有的API函数都存放在这两个类里面,那么我们自然应该首先注册和初始化这两个类了。那么注册这两个类需要神马东西呢。很显然,至少我们得需要一些窗口的信息,不然的话d3d是无法知道该在哪个窗口上做绘制工作的。那么也就是说在注册这两个类之前我们必须要先把窗口给注册了。那么下面我截取一部分winmain函数的代码来大致说明一下directx的两个重要的类(d3d设备以及d3d描述表)在winmain函数里的注册方式:
wndclass.lpfnWndProc = WndProc; //确定窗口的回调函数,当窗口获得windows的回调消息时用于处理消息的函数。
wndclass.cbClsExtra = 0; //为窗口类末尾分配额外的字节。
wndclass.cbWndExtra = 0; //为窗口类的实例末尾额外分配的字节。
wndclass.hInstance = hInstance; //创建该窗口类的窗口的句柄。
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口类的图标句柄。
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口类的光标句柄。
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口类的背景画刷句柄。
wndclass.lpszMenuName = NULL; //窗口类的菜单。
wndclass.lpszClassName = TEXT("pancystar_engine"); //窗口类的名称。
if (!RegisterClass(&wndclass)) //注册窗口类。
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
TEXT("pancystar_engine"), MB_ICONERROR);
return E_FAIL;
}
RECT R = { 0, 0, window_width, window_hight };
AdjustWindowRect(&R, WS_OVERLAPPEDWINDOW, false);
int width = R.right - R.left;
int height = R.bottom - R.top;
hwnd = CreateWindow(TEXT("pancystar_engine"), // window class name创建窗口所用的窗口类的名字。
TEXT("pancystar_engine"), // window caption所要创建的窗口的标题。
WS_OVERLAPPEDWINDOW, // window style所要创建的窗口的类型(这里使用的是一个拥有标准窗口形状的类型,包括了标题,系统菜单,最大化最小化等)。
CW_USEDEFAULT, // initial x position窗口的初始位置水平坐标。
CW_USEDEFAULT, // initial y position窗口的初始位置垂直坐标。
width, // initial x size窗口的水平位置大小。
height, // initial y size窗口的垂直位置大小。
NULL,