DirectX11程序从VS2010转到VS2015的配置与使用

 

这篇文章是CSDN文章“龙书D3D11 Demo配置(VS2015+win10)”的一个实践(另一篇文章“如何使用VS2015编译运行DX11版本龙书配套源码”也讲了同样的内容)。写下来的目的一是巩固所学知识,二是防止原博客丢失造成的损失。两篇原文的链接如下:

https://blog.csdn.net/tjj00686/article/details/49110501

https://blog.csdn.net/Pobber/article/details/51971939

首先,我已经有Introduction_to_3D_Game_Programming_with_Directx_11教材的随书源码,这些源码例子已经在VS2010上成功编译运行。由于VS2010已经比较过时,为了配合后续程序编写,我希望能够写一个VS2015版本的DirectX11程序。尽管VS2015已经能够直接使用DirectX11进行编程,但由于我是通过指导教材来学习的,暂时还没有时间去尝试新版(VS2015)的DirectX11;所以我希望把之前在旧版(VS2010编写)所做的工作迁移到VS2015上。以后有时间再去研究新版DirectX11的使用。

接下来是具体的迁移步骤:

1、下载Effects framework,原文给出的链接如下:

https://github.com/Microsoft/FX11

“下载源代码,打开Effects11_2015.sln解决方案,并且使用VS2015重新生成lib库文件的Debug版本和Release版本。将Debug版本的lib库文件重命名为Effects11d.lib,Release版本的lib库文件重命名为Effects11.lib。并复制d3dx11effect.h和Effects11d.lib和Effects11.lib到本书代码附带的Common文件夹里(覆写旧的文件)。”这是原文的描述,但我希望我的DirectX11程序在最终发布的时候是静态编译的,所以我需要生成静态库。因此在生成库文件的时候要做两点改变,如下图所示:

这样修改之后编译运行生成的就是win32、debug版本的静态库,如果要生成x64或者release版本的库,只要修改属性页的相应位置并保证“MFC的使用”和“运行库”匹配就行了。此外,我希望生成多个版本的库文件,以便调试和发布的时候可以方便的切换版本,所以我没有将库文件放入Common文件夹中,而是单独创建了一个库文件夹。我在这里首先是创建了一个DirectX11的文件夹,专门用来放置DirectX11项目需要引用的文件。然后把库文件夹放在了这个文件夹下。如下所示:

        

2、下载供VS2015使用的Common文件夹。原文链接如下:

https://github.com/DrinkMoon/directx11-pratices/tree/master/Common_vs2015

我把这个Common_VS2015文件夹放在DirectX11文件夹下,和库文件夹并列。如下所示:

         在下载的FX-master项目中找到d3dx11effect.h,并放入到Common_VS2015文件夹下,替换旧的文件(查看d3dx11effect.h的源代码,发现它是有版本号的,如果不进行替换,编译所使用的d3dx11effect.h与引用的d3dx11effect.h版本号就很可能会不一致,进而出现问题。由于没有这样测试过,所以不清楚具体会出什么问题,有待考证)。d3dx11effect.h的位置如下:

         3、下载DDSTextureLoader。原文给出的下载链接如下:

https://github.com/Microsoft/DirectXTex

         我使用了纹理,理论上需要下载这个,并将DDSTextureLoader.h/cpp放到Common_VS2015文件夹下。但是由于我用的是别人用过的Common_VS2015,实际上他已经做了替换,所以我没有进行替换,只是重新加载了Common_VS2015中的文件。因为这个链接上的代码一直在更新,所以是否需要下载并替换要自己做决定。

4、下载dxerr.lib的替代品。原文给出了一个博客链接,在这篇文章的最后有一个链接可以下载dxerr_nov2015.zip,解压之后放到Common_VS2015文件夹中。原文博客链接如下:

https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/

5、关于Mesh。原文提到了Mesh相关函数集的下载,但是没有说具体用法。我没有下载。在其他配置完成之后发现不需要下载这个,Demo也能正常运行。它的作用可能是曲面细分之类的,我没有用到,具体功能有待进一步研究。

现在按照原文中的步骤来修改Demo。步骤如下:

1、将随书源码中的例子BlendDemo复制到VS2015常放置项目的文件夹下(修改复制的文件是良好的习惯,建议这样做)。然后用VS2015打开它,提示要升级,点击确定。这个时候Common文件夹中的文件无法打开,需要重新加载,把Common_VS2015中需要使用到的文件加载进来。这里我把它们全部加载了进来。

2、修改项目属性。

(1)、“VC++目录”->“包含目录”->“D:\Tools\DirectX11\Common_VS2015”。包含目录填写自己的Common_VS2015文件夹所在目录。

(2)、“VC++目录”->“库目录”->“D:\Tools\DirectX11\Effects11\Win32_Debug_Static_MTd”。库目录填写自己要使用的Effects11库的目录。

(3)、“配置属性”->“常规”->“MFC的使用”->“在静态库中使用MFC”。

(4)、“配置属性”->“C/C++目录”->“代码生成”->“运行库”->“多线程调试 (/MTd)”。

(5)、“配置属性”->“链接器”->“输入”->“附加依赖项”。填写以下值:

d3d11.lib

Effects11d.lib

d3dcompiler.lib

dxguid.lib

下面这些是系统默认库,如果已经继承了就不用填写,如果没有继承就需要手动填写。我这里刚打开的时候是默认继承的,但是删掉dxerr.lib库之后就不会继承了,所以进行了手动添加。

winmm.lib

comctl32.lib

usp10.lib

kernel32.lib

user32.lib

gdi32.lib

winspool.lib

comdlg32.lib

advapi32.lib

shell32.lib

ole32.lib

oleaut32.lib

uuid.lib

odbc32.lib

odbccp32.lib

(6)、“配置属性”->“常规”->“字符集”->“使用多字节字符集”。

3、移除代码中的#include <d3dx11.h>, 以及链接的d3dx11.lib, 还有其他一切依赖于d3dx11的代码(这个地方需要注意,并不是说只要包含d3dx11这样字符的就要删除,需要仔细辨别)。

4、移除链接的dxerr.lib, 添加dxerr.h/cpp到Demo中,修改#include <dxerr.h>为#include “dxerr.h”。

5、添加#include "DDSTextureLoader.h"到 d3dUtil.h。

6、替换#include <xnamath.h>#为include <DirectXMath.h>和#include <DirectXPackedVector.h>。

7、在使用类似XMVector,XMMatrixTranspose时, 改为DirectX::XMVector, DirectX::XMMatrixTranspose。为了避免这么麻烦,可以在引用DirectXMath.h的地方添加using namespace DirectX,在引用DirectXPackedVector.h的地方添加using namespace DirectX::PackedVector,这样就不用到处添加名字空间前缀了。

8、移除所有使用D3DX11INLINE的地方,或者替换为C++关键字inline。

9、取消使用d3dHelper::CreateTexture2DArraySRV,推荐使用texassemble工具(https://directxtex.codeplex.com/wikipage?title=Texassemble&referringTitle=Texconv)离线创建纹理数组。

10、在d3dUtil.h中,替换DXTrace调用时用到的参数__FILE__为__FILEW__, 因为现在获取文件名以宽字符串的方式。

11、在d3dUtil.cpp中,修改ExtractFrustumPlanes函数:

void ExtractFrustumPlanes(XMFLOAT4 planes[6], CXMMATRIX T)

{

    XMFLOAT4X4 M;

    XMStoreFloat4x4(&M, T);

    //

    // Left

    //

    planes[0].x = M(0,3) + M(0,0);

    planes[0].y = M(1,3) + M(1,0);

    planes[0].z = M(2,3) + M(2,0);

    planes[0].w = M(3,3) + M(3,0);



    //

    // Right

    //

    planes[1].x = M(0,3) - M(0,0);

    planes[1].y = M(1,3) - M(1,0);

    planes[1].z = M(2,3) - M(2,0);

    planes[1].w = M(3,3) - M(3,0);



    //

    // Bottom

    //

    planes[2].x = M(0,3) + M(0,1);

    planes[2].y = M(1,3) + M(1,1);

    planes[2].z = M(2,3) + M(2,1);

    planes[2].w = M(3,3) + M(3,1);



    //

    // Top

    //

    planes[3].x = M(0,3) - M(0,1);

    planes[3].y = M(1,3) - M(1,1);

    planes[3].z = M(2,3) - M(2,1);

    planes[3].w = M(3,3) - M(3,1);



    //

    // Near

    //

    planes[4].x = M(0,2);

    planes[4].y = M(1,2);

    planes[4].z = M(2,2);

    planes[4].w = M(3,2);



    //

    // Far

    //

    planes[5].x = M(0,3) - M(0,2);

    planes[5].y = M(1,3) - M(1,2);

    planes[5].z = M(2,3) - M(2,2);

    planes[5].w = M(3,3) - M(3,2);



    // Normalize the plane equations.

    for(int i = 0; i < 6; ++i)

    {

        XMVECTOR v = XMPlaneNormalize(XMLoadFloat4(&planes[i]));

        XMStoreFloat4(&planes[i], v);

    }

}

12、替换D3DX11CreateShaderResourceViewFormFile为DirectX::CreateDDSTextureFromFile, 在BlendDemo中:

    ID3D11Resource* texResource = nullptr;

    HR(DirectX::CreateDDSTextureFromFile(md3dDevice,

        L"Textures/grass.dds", &texResource, &mGrassMapSRV));

    ReleaseCOM(texResource); // view saves reference



    HR(DirectX::CreateDDSTextureFromFile(md3dDevice,

        L"Textures/water2.dds", &texResource, &mWavesMapSRV));

    ReleaseCOM(texResource); // view saves reference



    HR(DirectX::CreateDDSTextureFromFile(md3dDevice,

        L"Textures/WireFence.dds", &texResource, &mBoxMapSRV));

    ReleaseCOM(texResource); // view saves reference

经过这些修改之后,就可以编译运行了(可能需要添加图形工具,如果原来没有添加的话)。以下链接是我修改好的BlendDemo以及相关的资料。

https://download.csdn.net/download/liang9jian/10866377

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值