我只是想学习DirectX 11(不,我对OpenGL和Vulcan都不感兴趣)我正在使用最新的Windows 10内部版本。我知道有DirectX 12,但据我所知,非(A)AA比它的价值更麻烦。我完全清楚,为了让游戏运行起来,使用像虚幻引擎这样的现有游戏引擎会更合适。但我对制作一款有效的游戏并不感兴趣。我只想要一些不折旧的东西来取代GDI(+)。我一直想学习DirectX。我正在使用C ++,这可能是主编程语言。作为我的IDE,我使用的是Visual Studio 2017 Enterprise。我还应该补充一点,我熟悉Windows API(以前称为Win32 API)。
我可以访问Allen Sherrod和Wendy Jones的书籍Beginning DirectX 11游戏编程和Frank D. Luna的书籍DirectX 11的3D游戏编程简介。但两者都有一个主要问题:他们使用折旧的DirectX 11 June SDK这与Windows 8和10 SDK不兼容。虽然用WinAPI代码很容易替换错误管理代码,但我坚持:
bool compileResult = CompileD3DShader( "SolidGreenColor.fx", "VS_Main", "vs_4_0", &vsBuffer );
CompileD3DShader
似乎不存在。谷歌搜索它并没有太多运气。但是从我发现的结论来看,我已经得出结论,他们不仅仅重命名了它,而是通过其他一些机制取而代之。虽然我不确定。任何人都可以帮助我以Windows 8/10兼容的方式写这行吗?
还有一个问题,那些有用的书籍,只要我对使用旧的DirectX SDK不感兴趣吗?我正在考虑寻找好的在线教程。如果没有足够好的东西,我将被迫切换到Luna的DirectX 12书籍和一般的DirectX 12。不幸的是,似乎没有DirectX 12继承者开始DirectX 11游戏编程(分别有一本适用于DirectX 9和10的书),我更喜欢(我更喜欢首先学习API的基础知识,以便我可以之后关注数学。)
有没有人知道学习“现代”DirectX 11的良好,全面的资源?我对书籍和在线内容(包括YouTube视频)都持开放态度。
更新1: 鉴于不允许就替代倾斜材料征求意见(我忘记了,抱歉)我想强调我问题中最重要的部分。
为旧的Direct X SDK编写的书籍/在线教程是否仍适用于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
如果这些教程是最新的,我可能会弄清楚这两本书是否仍然有用。
答案 0 :(得分:1)
Direct3D 11上的所有各种书籍仍然适用于其核心API的涵盖范围,如何使用DirectX 11的概念和功能。由于使用了现有的传统DirectX SDK,问题就出现了。特别是D3DX,D3DXMath或XNAMath,以及旧版效果系统的使用。也就是说,你最终还是学习了如何进行Direct3D图形编程。我有一篇博文,详细介绍了各种各样的书籍,并附有一些需要注意的事项。见Book Recommendations。自我注意:我应该看一下Sherrod&琼斯预定并更新帖子。
请参阅Where is the DirectX SDK (2015 Edition)?,特别是MSDN,了解正确混合'的方法。带有旧版DirectX SDK的Windows 8.1 / 10 SDK,如果您仍想使用较旧的东西进行学习。
使用Windows 8.1 SDK或Windows 10 SDK时如何替换所有旧版DirectX SDK的完整指南是Living Without D3DX。您将注意到着色器编译API,它会链接到HLSL, FXC, and 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的其他有用的起始资源:
DirectX Tool Kit tutorials
Getting Started with Direct3D 11
Anatomy of Direct3D 11 Create Device