如何使用VS2015编译运行DX11版本龙书配套源码

这篇文章是翻译http://www.d3dcoder.net/网站上Frank Luna(龙书作者本人)的解决方案。




近来,我收到求助emails,emalis询问如何解决本书附带的代码使用Visula Studio 2015编译失败的问题。
这篇文章将讲解使用VS2015编译所必须的步骤,但在此之前,让我们先来看看为什么同样的代码在VS2015编译失败吧.


从Windows 8开始 DirectX不再作为独立的一部本而被集成在操作系统中,并且在之后的版本中DirectX随着系统的更新而更新。而且D3DX库被抛弃了并没有被集成在Windows8及以后的Windows版本中。同时XNA Math数学库也更名为DirectX Math库。
此外,当使用VS2015时,dxerr.lib库已经不适用了。所以我们使用VS2015编译本书附带的代码的策略如下:
1 寻找到代码中使用的D3DX函数的替代函数。这比听起来还要简单。因为DirectX小组已经开源了大部分的D3DX函数。


2 将xnamath替换为DirectX Math 这也同样很简单 因为DirectX Math和xnamth库基本上相同。我们只需要将所使用的结构都放入DirectX 命名空间;


3 找到dxerr.lib的替代品,或者停止使用dxerr.lib的函数。我们可以使用如下代码作为我们的错误追踪代码:
       
  #define HR(x)                                               \
        {                                                           \
            HRESULT hr = (x);                                       \
            if(FAILED(hr))                                          \
            {                                                       \
                DXTrace(__FILEW__, (DWORD)__LINE__, hr, L#x, true); \
            }                                                       \
        }
 
请牢记:一个可选的策略是安装 老版本的2010DirectX SDK 获得D3DX 和XNA Maht 但这样做会带来一些需要解决的附加的冲突,并且这个版本的DirectX SDK 已有6年之久。所以我建议我们不应该使用这种需要下载旧版本DirectX SDK的老方法。




下载
本书附带的代码使用 Effects framework,和windows 8及以上版本的windows兼容的Effects framework能够在如下的网址中找到
https://github.com/Microsoft/FX11


下载源代码,打开Effects11_2015 解决方案 并且使用VS2015重新生成lib库文件的Debug版本和Release版本
将Debug版本的lib库文件重命名为Effects11d.lib,Release版本的lib库文件重命名为Effectsll.lib.并复制
d3dx11effect.h和effect1d.lib和Effectsll.lib到本书代码附带的Common文件夹里(覆写旧的文件). 
  接下来,我们需要用于加载网格函数的替代品.同样的 D3DXcode用来加载网格的函数也已经开源啦。
你可以在如下网址下载到:
https://github.com/Microsoft/DirectXTex


将 DDSTextureLoader.h/cpp放入本书代码附带的Common文件夹里,并将他们添加到你的项目中去。我们将使用其中的函数从硬盘中加载网格。
  最后,我们需要dxerr.lib的替代品,这篇博客总结了我们为什么需要dxerr.lib的细节。https://blogs.msdn.microsoft.com/chuckw/2012/04/24/wheres-dxerr-lib/。简而言之,刚才那个链接里面有一个下载dxerr_nov2015.zip的链接。dxerr_nov2015.zip中包含dxerr.h和dxerr.cpp两个文件。将其拷贝到我们的Common文件夹里。我们就可以使用我们需要的dxerr函数啦。记得要将这两个文件加载进你的项目。
  读者可能会回忆起 D3DX库中还有一些有用的构建mesh的函数。幸运的是,DirectX小组同样公开了这部分的源代码。这两个网址是相关下载地址。
https://blogs.msdn.microsoft.com/chuckw/2014/06/27/directxmesh/
https://github.com/Microsoft/DirectXMesh


项目改变
 在C/C++项目页面->通常属性栏里 添加这本书的Common 文件夹目录进 附加包含目录。
 在链接项目页面->通常属性栏里 添加这本书的Common 文件夹目录进 附加库目录。


代码改变
在这部分,我将讲解编译运行“BlendDemo”所必须应用的代码改变。
1.移除所有对头文件的宏命令,并且确保不使用d3dx11.lib/d3dxd.lib。因为新版本的DirectX已经不再包含D3DX11库了。
2.移除与dxerr.lib相关的库文件。添加dxerr.h/.cpp进你的项目并将#include改为#inlcude"dxerr.h"
3.添加 #include"DDSTextureLoader.h"宏命令在d3dUtl.h中。
4.将所有#include宏命令替换为#include,此外我们还需要使用DirectX命名空间来使用DirectX math库中的预定义数据类型(XMVECTOR, XMFLOAT4X4, XMMatrixTranspose等),一般而言我们可以使用 using namespace DirectX;
5.所以关于XMCOLOR的声明语句需要加上前缀PackedVector,并加上头文件的引用。因为XMCOLOR存在于PackedVector命名空间中。
6.移除所有的关于D3DX11INLINE的引用。你可以仅仅删除它们,或者使用inline代替。
7.移除d3dUtil.h头文件中的d3dHelper::CreateTexture2DArraySRV函数,你可以使用texassemble工具()https://directxtex.codeplex.com/wikipage?title=Texassemble&referringTitle=Texconv来在线创建一个texture数组。这是一种更好的方式。
8.在d3dUtil.h头文件中 将DXTrace宏函数中的__FILE__替换为__FILEW__,这样我们就可以得到文件名的宽字符版本。
9.在d3dUtil.h头文件中像如下一样重写ExtractFrustumPlanes(这将把输入的阵的格式改变为XMFLOAT4X4,这样以来,我们就能使用重载圆括号的语法得到其中的元素了)
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);
}
}


10.将D3DX11CreateShaderResourceViewFromFile函数替换为DirectX::CreateDDSTextureFromFile.以“Blend Demo”举例来说 我们替换
HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,
    L"Textures/grass.dds", 0, 0, &mGrassMapSRV, 0 ));
 
HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,
    L"Textures/water2.dds", 0, 0, &mWavesMapSRV, 0 ));
 
HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,
    L"Textures/WireFence.dds", 0, 0, &mBoxMapSRV, 0 ));

 
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
 

应用这些更改,“Blend Demo”应该可以正常编译和运行;






你可能感兴趣的:(如何使用VS2015编译运行DX11版本龙书配套源码)