Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows 10上的DirectX 11_C++_Windows 10_Directx 11 - Fatal编程技术网

C++ Windows 10上的DirectX 11

C++ Windows 10上的DirectX 11,c++,windows-10,directx-11,C++,Windows 10,Directx 11,我只是想学习DirectX 11(不,我对OpenGL和Vulcan都不感兴趣),我正在使用最新的Windows10内部版本。我知道有DirectX 12,但据我所知,对于非-(A)AA而言,这比它的价值更麻烦。我非常清楚,为了让游戏启动并运行,使用一个已经存在的游戏引擎(比如虚幻引擎)会更合适。但我对工作游戏并不感兴趣。我只是想要一些不贬值的好东西来取代GDI(+)。我一直想学习DirectX。我用的是C++,顺便说一下可以是主要的编程语言。作为我的IDE,我使用Visual Studio 2

我只是想学习DirectX 11(不,我对OpenGL和Vulcan都不感兴趣),我正在使用最新的Windows10内部版本。我知道有DirectX 12,但据我所知,对于非-(A)AA而言,这比它的价值更麻烦。我非常清楚,为了让游戏启动并运行,使用一个已经存在的游戏引擎(比如虚幻引擎)会更合适。但我对工作游戏并不感兴趣。我只是想要一些不贬值的好东西来取代GDI(+)。我一直想学习DirectX。我用的是C++,顺便说一下可以是主要的编程语言。作为我的IDE,我使用Visual Studio 2017 Enterprise。我还应该补充一点,我熟悉Windows API(以前称为Win32 API)

我有机会阅读艾伦·谢罗德和温迪·琼斯的《开始DirectX 11游戏编程》一书,以及弗兰克·D·卢纳的《使用DirectX 11进行3D游戏编程入门》一书。但两者都存在一个主要问题:它们使用的是被贬低的DirectX 6月11日SDK,它与Windows 8和10 SDK都不兼容。虽然用WinAPI代码替换错误管理代码很容易,但我仍然坚持:

bool compileResult = CompileD3DShader( "SolidGreenColor.fx", "VS_Main", "vs_4_0", &vsBuffer );

CompileD3DShader
似乎不存在。我在谷歌搜索时运气不太好。但根据我的发现,我得出的结论是,他们不仅重新命名了它,而且用其他机制取代了它。虽然我不确定。有人能帮我用Windows8/10兼容的方式写这行吗

还有一个问题,如果我对使用旧的DirectX SDK不感兴趣,这些书有用吗?我正在考虑寻找好的在线教程。如果没有足够好的,我将被迫转向Luna的DirectX 12书籍和DirectX 12。不幸的是,在开始DirectX 11游戏编程(有一本分别针对DirectX 9和DirectX 10的书)之前,似乎没有一本DirectX 12的继任者,我更喜欢这本书(我更喜欢先学习API的基础知识,这样我以后可以专注于数学)

有人知道学习“现代”DirectX 11的好的、全面的来源吗?我对书籍和在线内容(包括YouTube视频)都持开放态度

更新1: 考虑到就替代学习材料征求建议似乎是不允许的(我忘了,很抱歉),我想强调我问题中最重要的部分

为旧的Direct X SDK编写的书籍/在线教程是否仍然适用于Windows 8/8.1/10 SDK?我知道我必须使用不同的头,有些东西已经重新命名,DirectX错误处理库已经删除。除了DirectX错误处理库之外,我是否可以重新命名一些函数,代码将正常工作,或者差异是否更大

更新2: 我发现了两个似乎更为最新的来源。虽然我必须给他们一个更仔细的观察,但我想为任何和我有同样问题的人发布他们的链接,如果他们无法通过谷歌找到正确的答案:


如果这些教程是最新的,我也许能够弄清楚这两本书是否仍然有用。

所有关于Direct3D 11的各种书籍仍然适用于它们对核心API、概念以及如何使用DirectX 11的功能的介绍。这些问题是由于他们使用了现在遗留的DirectX SDK造成的。特别是D3DX、D3DXMath或XNAMath,以及遗留效果系统的使用。也就是说,您最终还是要学习如何进行Direct3D图形编程。我有一篇博文,详细介绍了各种各样的书,其中有一些值得注意的事情。看见自我提醒:我应该看一看谢罗德和琼斯的书并更新帖子

如果您仍然想使用旧的东西进行学习,请参阅,特别是关于将Windows 8.1/10 SDK与旧的DirectX SDK“混合”的正确方法


有关如何在使用Windows 8.1 SDK或Windows 10 SDK时替换所有旧版DirectX SDK的完整指南如下所示。您将注意到着色器编译API,它链接到。正如有人在评论中指出的那样,
CompileD3DShader
只是本书作者提供的一些辅助功能。现在,您只需调用
D3DCompileFromFile
。我还用它是一个很好的智能指针,它可以用现代Direct3D C++编程。
#include <d3d11.h>
#include <d3dcompiler.h>
#include <wrl/client.h>

using Microsoft::WRL::ComPtr;
#包括
#包括
#包括
使用Microsoft::WRL::ComPtr;

ComPtr shaderBlob;
ComPtr-errorBlob;
HRESULT hr=D3DCompileFromFile(L“SolidGreenColor.fx”,
nullptr,
D3D\u编译\u标准\u文件\u包括:,
“VS_Main”、“VS_4_0”,
0/*您可能希望在调试版本中使用D3DCOMPILE_DEBUG*/,
0,
shaderBlob.GetAddressOf(),
errorMsg.GetAddressOf());
#ifdef_调试
if(errorBlob)
{ 
OutputDebufferStringA(重新解释转换(errorBlob->GetBufferPointer());
} 
#恩迪夫
如果(失败(小时))
//错误条件
学习Direct3D 11的其他有用起始资源:




对此,我很抱歉。我只是觉得加上它会很好。我的实际问题是,这些书对于针对Windows10SDK编程是否仍然有用,以及CompileD3DShader的替代品是什么。我在互联网上发现了很多关于这个的困惑,几乎没有答案。
CompileD3DShader
是你正在阅读的书中定义的一个函数。它不是一个由DirectX API定义的函数。你的想法是reast-12并没有完全取代11-11,这在Windows上仍然是完全相关和有用的,尤其是在你提到的场景中。是的,我知道这一点。DirectX 12适用于AAA游戏开发人员,而11仍将适用于独立游戏开发人员和其他只需要在程序中添加一些图形的人。DirectX 11的问题不是折旧问题,即使它是微型的
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