我对DX11的理解和简化框架与快速游戏制作(续2)

来源:互联网 发布:淘宝大码女装微胖 编辑:程序博客网 时间:2024/05/29 16:31

下面就先讲述下如何创建第一个基于DX11的窗口程序。(这是基于我的“简化框架”的流程设计)

首先建立个名为“DX.h”的头文件,我的框架程序程序不包含任何". ccp"文件也不生成任何lib和DLL,但需要在VS的环境变量中引用它的目录。这样是为了保证与C#的语法完全相等。

在头文件中调入下面的库:

//DX11所必须

#pragma comment (lib, "dxgi.lib")
#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3dx11.lib")
#pragma comment (lib, "d3dcompiler.lib ")

//DX10.1---D2D所必须

#pragma comment (lib, "D3D10_1.lib")
#pragma comment (lib, "D2D1.lib")
#pragma comment (lib, "dwrite.lib")

//windows变量的使用必须
#pragma comment(lib, "winmm.lib")

在以后的工程文件中再也不需要引用以上和以下的内容了,它已经包含再全局中

#include <initguid.h>
#include <dxgi.h>

#include <D3D10_1.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dcompiler.h>

#include <D2D1.h>
#include <dwrite.h>

#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <io.h>
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <math.h>

#ifndef Kill
#define Kill(p) { if (p) { (p)->Release(); (p)=NULL; } }
#endif

#include"Device.h"//以后需要用的DX11类
#include"SwapChain.h"

 

现在需要创建个DX11的容器来包含DX11的一些必要的指针。任何一个DX程序都需要个DEVICE设备来指向它所关联的资源。

创建个名为"Device.h"的头文件

struct Device
{
    ID3D11Device* dev;//device 设备
    ID3D11DeviceContext*  context;//device 资源管理

    ID3D11RasterizerState* cullback;//着色模式
 ID3D11RasterizerState* cullnone;
 ID3D11RasterizerState* cullfront;

  ID3D11DepthStencilState* stateA;//深度模式
     ID3D11DepthStencilState* stateB;

     ID3D11BlendState* stateC;;//混合模式
     ID3D11BlendState* stateD;
     ID3D11BlendState* stateE

 IDXGIAdapter1 *Adapter;//显示卡
 IDXGIFactory1* factory;//用于D2D的显示设备总和

 HRESULT Create()//创建Device设备 {
HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory);
 hr =factory->EnumAdapters1(0, &Adapter);

hr = D3D11CreateDevice(Adapter, D3D_DRIVER_TYPE_UNKNOWN, 0,  D3D11_CREATE_DEVICE_BGRA_SUPPORT,0, 0, D3D11_SDK_VERSION,
  &dev,0,&context);

        CreateState();//创建着色和混合等预定模式

context->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );//给显卡一个预定的基础渲染方式以避免显卡设备的丢失和黑屏。
  return hr;
 }

void Dispose()//必须清理程序退出后不用的资源
 {
  Kill(Adapter);Kill(factory);  Kill(cullback);Kill(cullnone); Kill(cullfront);  Kill(stateA);Kill(stateB);Kill(stateC);
  Kill(stateD);Kill(stateE);  context->ClearState();     Kill(context);Kill(dev);
 }

这里只是建立了显示DX资源的基础的设备,以后是几乎都不会修改到这些代码也无需为每个项目都重新粘贴他们。

未完待续

以后会一步步讲述直到完成下面的游戏。。。

原创粉丝点击