每次查看SharpDX代码并尝试遵循DirectX文档时,我都很难受。是否清楚地列出了每个编号的类所映射的位置以及它们为什么存在?
我说的是
DXGI.Device
DXGI.Device1
DXGI.Device2
DXGI.Device3
DXGI.Device4
SharpDX.Direct3D11.Device
SharpDX.Direct3D11.Device1
SharpDX.Direct3D11.Device11On12
SharpDX.Direct3D11.Device2
SharpDX.Direct3D11.Device3
SharpDX.Direct3D11.Device4
SharpDX.Direct3D11.Device5
SharpDX.Direct3D11.DeviceContext
SharpDX.Direct3D11.DeviceContext1
SharpDX.Direct3D11.DeviceContext2
SharpDX.Direct3D11.DeviceContext3
SharpDX.Direct3D11.DeviceContext4
每次我都从代码开始时,我发现它似乎是被黑魔法选中的,我不知道从那里去哪里,例如我正在使用它(从我找到的代码中),我也不知道为什么它是device3 ,工厂3带有我们查询接口swapchain2的swapchain1:
using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface<DXGI.Device3>())
using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent<DXGI.Factory3>())
{
DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription);
this.swapChain = swapChain1.QueryInterface<DXGI.SwapChain2>();
}
如果完整的解释在答案范围之内太大,那么可以通过任何链接让我开始弄清楚什么C ++ DX映射到哪个编号对象以及为什么最受欢迎。
在这种情况下,我只对DX> = 11感兴趣,并且在UWP项目中使用SharpDX。
答案 0 :(得分:1)
Refer here可以找到所有所有SharpDx对象,特别是对于Here的DXGI
,在那里您可以看到Device
映射到IDXGIDevice
。
请注意,IDXGIDevice
是超链接,它们引用C ++对象的文档。并以此方式Device1
和Device2
等
您会发现这里有一个非常简单的逻辑,SharpDx
将C ++对象的名称分为Namespace
和class name
,
例如,您将获得命名空间:IDXGIDevice
和类名称:DXG
,而不是Device
。
在每个C ++对象的文档中,您可以找到here。
并且详细说明了可以使用该对象的操作系统。
随着数量的增加,该对象将在更新的操作系统中工作。
例如,IDXGIDevice1
在Windows 7
下工作,但是IDXGIDevice3
在Windows 8.1
或更高版本下工作。
答案 1 :(得分:1)
SharpDx是DirectX的一个非常薄的包装,DirectX中的几乎所有内容都在SharpDx中表示为传递,带有一些命名和调用约定,以适应.net世界。
有关SharpDx的真实文档基本上是不存在的,因此您必须做其他所有事情。如果您是从SharpDx入手,则直接查看SharpDx API列表和头文件,以了解要表达的基本DirectX函数。一旦有了DirectX函数的名称,就可以阅读MSDN文档以了解该函数的工作原理。如果您是从DirectX开始的,那么首先请看一下MSDN,以了解它的工作原理和命名方式,然后转到SharpDx API和头文件中,以了解在SharpDx中如何包装(命名和公开)该函数。
对于您提出的特定问题, SharpDx设备编号标识了要包装的Direct3D版本。
Direct3D 11.1 device
==> ID3D11Device1
==> SharpDX.Direct3D11.Device1
Direct3D 11.2 device
==> ID3D11Device2
==> SharpDX.Direct3D11.Device2
Direct3D 11.3 device
==> ID3D11Device3
==> SharpDX.Direct3D11.Device3
以此类推。
自然,每个版本都有一个略有不同(“改进”)的界面。较低的版本号几乎可以在任何地方工作,而较高的版本号包括附加功能,可能需要您的视频卡和/或操作系统特定的功能。您可以在here的小节中了解每种版本的API。
例如,添加到ID3D11Device5接口的新方法的描述(即,自ID3D11Device4以来的新功能)为here。在这种情况下,Device5可以创建围栏对象并打开共享围栏的句柄。
当示例代码使用特定的设备编号时,通常是因为该代码需要某些功能,而这些功能在Direct3D的早期版本中是不存在的。通常,您希望使用编号最小的设备(和工厂等),因为这样可以使您的代码在各种机器和视频卡上运行。
如果您发现示例代码创建了SharpDX.Direct3D11.Device1
,但似乎没有使用SharpDX.Direct3D11.Device
中的方法之外的任何方法,则可能是由于两个原因之一。首先,作者可能知道后面的示例将需要Direct3D 11.1之前不存在的方法或字段。其次,作者可能知道,所有能够运行该示例的视频卡和操作系统都将能够运行Direct3D 11.1。
对于刚起步的人,我建议您坚持使用Direct3D(和Direct2D)11.1版,即DXGI.Device1
,SharpDX.Direct3D11.Device1
和SharpDX.Direct3D11.DeviceContext1
。它们很可能在您会遇到的任何计算机上运行。仅在您确实需要该版本中未提供的某些功能时,才增加版本号。
另一个提示:如果您阅读了有关某些Direct3D或Direct2D功能的线程,而您似乎在SharpDx的任何地方都找不到它,请查看Direct3D API以了解哪个版本号首先包含该功能。然后浏览该版本的SharpDx API(或更好的头文件),直到看到一个类似命名的元素。它可能会以意想不到的方式包装,但是即使您很难找到它,AFAIK也会全部暴露出来。