我只是试着学习DirectX 11 (不,我对OpenGL和Vulcan都不感兴趣),我正在使用最新的Windows 10内部构建。我知道有DirectX 12,但据我所知,这是更多的麻烦非-(A)AA比它的价值。我非常清楚,对于一个游戏的启动和运行,使用一个已经存在的游戏引擎,如虚幻引擎将是更合适的。但我并不是真正感兴趣的一个工作游戏。我只想要一些没有贬值和好的东西来代替GDI(+)。我一直想学DirectX。我使用的是C++,顺便说一句,这是主要的编程语言。作为我的IDE,我正在使用VisualStudio2017 Enterprise。我还应该补充一点,我熟悉Windows (以前称为Win32 API)。
我可以阅读艾伦·舍罗德和温迪·琼斯的“开始DirectX 11游戏编程”和弗兰克·D·露娜的书“DirectX 11 3D游戏编程导论”。但这两本书都存在一个主要问题:他们使用的是已经贬值的DirectX 11 6月11日SDK,它既不兼容Windows 8,也不兼容10 SDK。虽然用WinAPI代码替换错误管理代码很容易,但我仍然坚持:
bool compileResult = CompileD3DShader( "SolidGreenColor.fx", "VS_Main", "vs_4_0", &vsBuffer );
CompileD3DShader
似乎不存在。我在谷歌搜索的时候运气不佳。但根据我的发现,我得出的结论是,他们不仅重新命名了它,而且用其他机制取代了它。虽然我不太确定。有人能帮我用Windows 8/10兼容的方式写这一行吗?
还有另一个问题,如果我对使用旧的DirectX SDK不感兴趣,这些书是否有用?我正在考虑寻找好的在线教程。如果没有足够好的书,我会被迫切换到露娜的DirectX 12书和一般的DirectX 12。不幸的是,DirectX 12似乎并不是DirectX 11游戏编程的继承者(分别为DirectX 9和10编写了一本书),我更喜欢它(我更喜欢先学习API的基础知识,这样以后我就可以专注于数学了)。
有没有人知道一个好的,全面的来源来学习“现代”DirectX 11?我对书籍和在线内容(包括YouTube视频)都是开放的。
更新1:考虑到征求关于其他学习材料的建议似乎是不允许的(我忘记了,很抱歉),我想强调我问题中最重要的部分。
为旧的Direct编写的书籍/在线教程是否仍然适用于Windows 8/ 8.1 / 10 SDK?我知道我必须使用不同的头,有些东西已经被重新命名,DirectX错误处理库已经被删除。除了DirectX错误处理库之外,我是否可以重新命名一些函数,代码是否可以工作,或者差异是否更大?
更新2:我发现了两个似乎更最新的源代码。当我要仔细看他们的时候,我想把他们的链接贴给那些和我有同样问题的人,他们在Google:http://www.directxtutorial.com/Lesson.aspx?lessonid=111-4-1上找不到合适的答案。
https://msdn.microsoft.com/en-us/library/ee416804(v=VS.85).aspx
如果这些教程是最新的,我可能会弄清楚这两本书是否仍然有用。
发布于 2017-07-14 05:54:11
关于Direct3D 11的所有书籍仍然适用于对核心API的介绍、如何使用DirectX 11的概念和功能。这些问题都是由于使用了现在遗留的DirectX SDK而产生的。特别是D3DX、D3DXMath或XNAMath,以及遗留效果系统的使用。尽管如此,您最终还是会学习如何进行Direct3D图形编程。我有一篇博文,详细介绍了各种书籍的细节,还有一些值得留心的笔记。见书籍推荐。自我注意:我应该看看谢罗德和琼斯的书,并更新这篇文章。
请参阅DirectX SDK (2015年版)在哪里?,特别是关于将Windows8.1/10 SDK与遗留的DirectX SDK“混合”的适当方法的MSDN,如果您仍然希望使用旧的DirectX SDK来学习。
关于如何在使用Windows8.1SDK或Windows10SDK时替换所有遗留的DirectX SDK的完整指南是无D3DX生活。您将注意到着色器编译API,它链接到HLSL、FXC和D3DCompile。正如注释中所指出的,CompileD3DShader
只是图书作者提供的一些帮助函数。现在你可以直接打电话给D3DCompileFromFile
了。我还使用了Microsoft::WRL::ComPtr,它是一个很好的智能指针,可以与现代的Direct3D C++编程一起使用。
#include <d3d11.h>
#include <d3dcompiler.h>
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;
..。
ComPtr<ID3DBlob> shaderBlob;
ComPtr<ID3DBlob> errorBlob;
HRESULT hr = D3DCompileFromFile( L"SolidGreenColor.fx",
nullptr,
D3D_COMPILE_STANDARD_FILE_INCLUDE,
"VS_Main", "vs_4_0",
0 /* You probably want to use D3DCOMPILE_DEBUG in debug builds */,
0,
shaderBlob.GetAddressOf(),
errorMsg.GetAddressOf()));
#ifdef _DEBUG
if (errorBlob)
{
OutputDebugStringA( reinterpret_cast<const char*>( errorBlob->GetBufferPointer() ) );
}
#endif
if (FAILED(hr))
// Error condition
学习Direct3D 11的其他有用的启动资源:
https://stackoverflow.com/questions/45067894
复制相似问题