如何使用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.h>头文件的宏命令,并且确保不使用d3dx11.lib/d3dxd.lib。因为新版本的DirectX已经不再包含D3DX11库了。
2.移除与dxerr.lib相关的库文件。添加dxerr.h/.cpp进你的项目并将#include<dxerr.h>改为#inlcude"dxerr.h"
3.添加 #include"DDSTextureLoader.h"宏命令在d3dUtl.h中。
4.将所有#include<xnamath.h>宏命令替换为#include<DirectXmath.h>,此外我们还需要使用DirectX命名空间来使用DirectX math库中的预定义数据类型(XMVECTOR, XMFLOAT4X4, XMMatrixTranspose等),一般而言我们可以使用 using namespace DirectX;
5.所以关于XMCOLOR的声明语句需要加上前缀PackedVector,并加上<DirectxPackedVector.h>头文件的引用。因为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”应该可以正常编译和运行;
————————————————
版权声明:本文为CSDN博主「Pobber」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Pobber/article/details/51971939

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《编译原理第三版龙书》是一本经典的编译原理教材,广泛被国内外大学所采用。该教材以清晰简练的语言,全面系统地介绍了编译器的原理和实现方法。 该书内容包括了编译器的各个环节,如词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。每个环节都讲解了相关的理论知识,并通过实例深入探讨了各个概念和技术的具体应用。 与前两版相比,第三版对内容进行了全面更新和补充。特别是在词法分析和语法分析的部分,增加了更多最新的技术和算法,如正则表达式、自上而下和自下而上的分析方法、语法制导翻译等。此外,该书还在语义分析和目标代码生成的章节中介绍了常用的语言处理工具,如Yacc和Lex。 除了理论知识的讲解外,该书还包含了大量的实例和习题。这些练习和实例旨在帮助读者更好地理解和应用所学的知识。通过完成这些习题,读者可以加深对编译原理的理解,提高解决实际问题的能力。 总而言之,编译原理第三版龙书是一本权威的编译原理教材,无论是对于学习编译原理的学生还是从事编译器开发的工程师,都是一本不可或缺的参考书。它不仅详细介绍了编译器的原理和实现方法,而且通过实例和习题的形式提供了很好的学习和练习机会。 ### 回答2: 《编译原理(第三版)龙书》是一本经典的编译原理教材,全名为《编译原理》(原书第三版)。这本书由Alfred V. Aho、Monica S. Lam、Ravi Sethi和Jeffrey D. Ullman合作编写,系统地介绍了编译原理的相关内容。 龙书详细讲解了编译原理的基本概念和原理,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等各个方面。书中使用了大量的例子和算法描述,帮助读者理解和掌握编译原理的核心知识。 《编译原理》(第三版)龙书的PDF版本,即电子书版本,是广大学生和编译原理爱好者广泛使用的资源之一。这个PDF版本可以方便地在各种电子设备上阅读,如电脑、平板和手机等。它拥有书籍的完整内容,配有书中的插图和代码示例,方便读者学习和实践。 值得一提的是,虽然这本书被称为龙书,但它的书名实际上是《编译原理》(原书第三版)。之所以被称为龙书,是因为封面上绘有一条龙,这成为了它的代称。 总之,《编译原理》(第三版)龙书的PDF版本是学习编译原理的一个很好的资源,通过阅读和实践,能够帮助读者全面理解编译原理的基本概念和原理,并能够应用于实际的编译器开发和优化工作中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值