Direct3D 11.2 功能
Direct3D 11.2 中添加了以下功能,Windows 8.1、Windows RT 8.1 和 Windows Server 2012 R2 附带。
平铺资源
Direct3D 11.2 允许创建可视为使用少量物理内存的大型逻辑资源的平铺资源。 平铺资源 (非常有用,例如,在游戏中使用地形) 和应用 UI。
平铺资源是通过指定 D3D11_RESOURCE_MISC_TILED 标志创建的。 若要使用平铺资源,请使用以下 API:
- ID3D11Device2::GetResourceTiling
- ID3D11DeviceContext2::UpdateTiles
- ID3D11DeviceContext2::UpdateTileMappings
- ID3D11DeviceContext2::CopyTiles
- ID3D11DeviceContext2::CopyTileMappings
- ID3D11DeviceContext2::ResizeTilePool
- ID3D11DeviceContext2::TiledResourceBarrier
- 具有 ID3D11Debug::SetFeatureMask 的D3D11_DEBUG_FEATURE_DISABLE_TILED_RESOURCE_MAPPING_TRACKING_AND_VALIDATION标志
有关平铺资源的详细信息,请参阅 平铺资源。
检查平铺资源支持
在使用平铺资源之前,需要了解设备是否支持平铺资源。 下面介绍了如何检查对平铺资源的支持:
HRESULT hr = D3D11CreateDevice(
nullptr, // Specify nullptr to use the default adapter.
D3D_DRIVER_TYPE_HARDWARE, // Create a device using the hardware graphics driver.
0, // Should be 0 unless the driver is D3D_DRIVER_TYPE_SOFTWARE.
creationFlags, // Set debug and Direct2D compatibility flags.
featureLevels, // List of feature levels this app can support.
ARRAYSIZE(featureLevels), // Size of the list above.
D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Windows Store apps.
&device, // Returns the Direct3D device created.
&m_d3dFeatureLevel, // Returns feature level of device created.
&context // Returns the device immediate context.
);
if (SUCCEEDED(hr))
{
D3D11_FEATURE_DATA_D3D11_OPTIONS1 featureData;
DX::ThrowIfFailed(
device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS1, &featureData, sizeof(featureData))
);
m_tiledResourcesTier = featureData.TiledResourcesTier;
}
对 WARP 设备的扩展支持
Direct3D 11.2 扩展了对 WARP 设备的支持,通过在 D3D11CreateDevice 的 DriverType 参数中传递D3D_DRIVER_TYPE_WARP来创建 WARP 设备。 Direct3D 11.2 中的 WARP 软件呈现器添加了对 Direct3D 功能级别 11_1 的完全支持,包括 平铺资源、 IDXGIDevice3::Trim、共享 BCn 表面、minblend 和地图默认值。 还启用了 HLSL 着色器中的双重支持,同时支持 16x MSAA。
批注图形命令
Direct3D 11.2 允许使用以下 API 批注图形命令:
- ID3D11DeviceContext2::IsAnnotationEnabled
- ID3D11DeviceContext2::BeginEventInt
- ID3D11DeviceContext2::SetMarkerInt
- ID3D11DeviceContext2::EndEvent
HLSL 着色器链接
Windows 8.1添加了 HLSL 着色器的独立编译和链接,使图形程序员能够创建预编译的 HLSL 函数,将它们打包到库中,并在运行时将它们链接到完整的着色器。 这实质上等效于 C/C++ 的单独编译、库和链接,它允许程序员编写预编译的 HLSL 代码(当更多信息可用于完成计算)。 有关如何使用着色器链接的详细信息,请参阅 使用着色器链接。
完成这些步骤,在运行时使用动态链接创建最终着色器。
创建和使用着色器链接
- 创建 ID3D11Linker 链接器对象,该对象表示链接上下文。 单个上下文不能用于生成多个着色器;链接上下文用于生成单个着色器,然后丢弃链接上下文。
- 使用 D3DLoadModule 从库 Blob 加载和设置库。
- 使用 D3DLoadModule 加载和设置条目着色器 Blob,或创建 FLG 着色器。
- 使用 ID3D11Module::CreateInstance 创建 ID3D11ModuleInstance 对象,然后对这些对象调用函数以将资源重新绑定到其最终槽。
- 将库添加到链接器,然后调用 ID3D11Linker::Link 以生成最终的着色器字节代码,这些代码随后可以在运行时中加载和使用,就像完全预编译和链接的着色器一样。
函数链接图 (FLG)
Windows 8.1还添加了函数链接图 (FLG) 。 可以使用 FLG 构造由一系列相互传递值的预编译函数调用组成的着色器。 使用 FLG 时,无需编写 HLSL 并调用 HLSL 编译器。 而是使用 C++ API 调用以编程方式指定着色器结构。 FLG 节点表示输入和输出签名以及预编译库函数的调用。 注册函数调用节点的顺序定义调用序列。 必须先指定输入签名节点,最后必须指定输出签名节点。 FLG 边缘定义值从一个节点传递到另一个节点的方式。 传递的值的数据类型必须相同;没有隐式类型转换。 形状和重排规则遵循 HLSL 行为,值只能按此顺序向前传递。 有关 FLG API 的信息,请参阅 ID3D11FunctionLinkingGraph。
收件箱 HLSL 编译器
HLSL 编译器现在位于 Windows 8.1 及更高版本的收件箱中。 现在,大多数着色器编程 API 都可用于为 Windows 8.1 及更高版本构建的 Windows 应用商店应用。 许多用于着色器编程的 API 不能用于为Windows 8生成的 Windows 应用商店应用;这些 API 的参考页带有注释标记。 但某些着色器 API (例如, D3DCompileFromFile) 仍只能用于开发 Windows 应用商店应用,而不能用于提交到 Windows 应用商店的应用;这些 API 的参考页仍标有注释。
相关主题