Direct3D 11.1 功能
Direct3D 11.1 中添加了以下功能,Windows 8、Windows RT 和 Windows Server 2012 随附此功能。 Windows 7 和 Windows Server 2008 R2 上提供了对 Direct3D 11.1 的部分支持,可通过适用于 Windows 7 的 平台更新获取。
- 着色器跟踪和编译器增强功能
- Direct3D 设备共享
- 检查对新的 Direct3D 11.1 功能和格式的支持
- 使用 HLSL 最小精度
- 在功能级别 9 和更高级别的 HLSL 中指定用户剪辑平面
- 创建比着色器可以访问 更大的常量缓冲区
- 在呈现目标 中使用逻辑作
- 强制采样计数创建光栅器状态
- 使用着色器处理视频资源
- 对共享 Texture2D 资源的扩展支持
- 使用新复制选项更改子资源
- 放弃资源和资源视图
- 支持大量 UAV
- 将常量缓冲区的子范围绑定到着色器
- 检索绑定到着色器 的常量缓冲区的子范围
- 清除资源视图的所有或部分
- 使用 NO_OVERWRITE 映射动态缓冲区的 SRV
- 在每个管道阶段使用 UAV
- 对 WARP 设备的扩展支持
- 会话 0 进程中使用 Direct3D
- 对功能级别 9 上的阴影缓冲区的支持
- 相关主题
着色器跟踪和编译器增强功能
Direct3D 11.1 允许你使用着色器跟踪来确保代码按预期执行,如果无法发现并解决问题。 适用于 Windows 8 的 Windows 软件开发工具包(SDK)包含 HLSL 编译器增强功能。 着色器跟踪和 HLSL 编译器在 D3dcompiler_nn.dll中实现。
着色器跟踪 API 和 HLSL 编译器的增强功能包括以下方法和函数。
- ID3D11RefDefaultTrackingOptions::SetTrackingOptions
- ID3D11RefTrackingOptions::SetTrackingOptions
- ID3D11TracingDevice::SetShaderTrackingOptions
- ID3D11TracingDevice::SetShaderTrackingOptionsByType
- ID3D11ShaderTraceFactory::CreateShaderTrace
- ID3D11ShaderTrace::TraceReady
- ID3D11ShaderTrace::ResetTrace
- ID3D11ShaderTrace::GetTraceStats
- ID3D11ShaderTrace::P SSelectStamp
- ID3D11ShaderTrace::GetInitialRegisterContents
- ID3D11ShaderTrace::GetStep
- ID3D11ShaderTrace::GetWrittenRegister
- ID3D11ShaderTrace::GetReadRegister
- D3DCompile2
- D3DCompileFromFile
- D3DDisassemble11Trace
- D3DDisassembleRegion
- D3DGetTraceInstructionOffsets
- D3DReadFileToBlob
- D3DSetBlobPart
- D3DWriteBlobToFile
D3dcompiler.lib 库需要 D3dcompiler_nn.dll。 此 DLL 不是 Windows 8 的一部分;它位于 HLSL 编译器的 \bin folder of the Windows SDK for Windows 8 along with the Fxc.exe 命令行版本中。
注意
虽然可以使用此库和 DLL 组合进行开发,但不能部署使用此组合的 Windows 应用商店应用。 因此,在交付 Windows 应用商店应用之前,必须编译 HLSL 着色器。 可以将 HLSL 编译二进制文件写入磁盘,或者编译器可以使用包含着色器 blob 数据的静态字节数组生成标头。 可以使用 ID3DBlob 接口访问 blob 数据。 若要开发 Windows 应用商店应用,请调用 D3DCompile2 或 D3DCompileFromFile 编译原始 HLSL 源,然后将生成的 blob 数据馈送到 Direct3D。
Direct3D 设备共享
Direct3D 11.1 使 Direct3D 10 API 和 Direct3D 11 API 能够使用一个基础呈现设备。
此 Direct3D 11.1 功能包括以下方法和接口。
- ID3D11Device1::CreateDeviceContextState
- ID3D11DeviceContext1::SwapDeviceContextState
- ID3DDeviceContextState
检查对新的 Direct3D 11.1 功能和格式的支持
Direct3D 11.1 允许检查图形驱动程序可能支持的新功能以及设备上支持格式的新方法。 Microsoft DirectX 图形基础结构 (DXGI) 1.2 还指定新的 DXGI_FORMAT 值。
此 Direct3D 11.1 功能包括以下 API。
- ID3D11Device::CheckFeatureSupport,其中包含 D3D11_FEATURE_DATA_D3D11_OPTIONS、D3D11_FEATURE_DATA_ARCHITECTURE_INFO、D3D11_FEATURE_DATA_D3D9_OPTIONS、D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT和 D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT 结构
- ID3D11Device::CheckFormatSupport 与 D3D11_FORMAT_SUPPORT_DECODER_OUTPUT、D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT、D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT、D3D11_FORMAT_SUPPORT_VIDEO_ENCODER和 D3D11_FORMAT_SUPPORT2_OUTPUT_MERGER_LOGIC_OP
使用 HLSL 最小精度
从 Windows 8 开始,图形驱动程序可以使用大于或等于指定位精度的任何精度来实现最小精度 HLSL 标量数据类型。 在实现 HLSL 最小值精度的硬件上使用 HLSL 最小精度着色器代码时,使用更少的内存带宽,因此还使用更少的系统电源。
可以通过使用 D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT 值调用 ID3D11Device::CheckFeatureSupport 来查询图形驱动程序提供的最小精度支持。 在此 ID3D11Device::CheckFeatureSupport 调用中,将指针传递给 ID3D11Device::CheckFeatureSupport 驱动程序为像素着色器阶段和其他着色器阶段支持的最小精度级别填充的 D3D11_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT 结构。 返回的信息只是指示图形硬件可以比标准 32 位浮点精度低执行 HLSL作,但不保证图形硬件实际以较低的精度运行。
无需创作多个执行且不使用最小精度的着色器。 相反,如果图形驱动程序报告它不支持任何最小精度,则创建精度最低的着色器,并且最小精度变量的行为为完全 32 位精度。 有关 HLSL 最小值的详细信息,请参阅 使用 HLSL 最小值。
HLSL 最小精度着色器不适用于早于 Windows 8 的作系统。
在功能级别 9 及更高级别上在 HLSL 中指定用户剪辑平面
从 Windows 8 开始,可以在 HLSL 函数声明中使用 剪贴板 函数属性,而不是 SV_ClipDistance 使着色器能够 功能级别 9_x 以及功能级别 10 及更高。 有关详细信息,请参阅功能级别 9 硬件 上的用户剪辑平面。
创建比着色器可以访问的更大的常量缓冲区
Direct3D 11.1 允许创建大于着色器可以访问的最大常量缓冲区大小的常量缓冲区(4096 32 位*4 组件常量 – 64KB)。 稍后,将缓冲区绑定到管道(例如,通过 PSSetConstantBuffers 或 PSSetConstantBuffers1)时,可以指定着色器可以访问的缓冲区范围,这些缓冲区可以符合 4096 限制。
Direct3D 11.1 更新此功能的 ID3D11Device::CreateBuffer 方法。
在呈现目标中使用逻辑作
Direct3D 11.1 允许使用逻辑作,而不是在呈现目标中混合。 但是,不能将逻辑作与跨多个呈现目标混合。
此 Direct3D 11.1 功能包括以下 API。
强制采样计数创建光栅器状态
Direct3D 11.1 允许在创建光栅器状态时指定力样本计数。
此 Direct3D 11.1 功能包括以下 API。
注意
如果要使用强制为 1 或更高版本的示例计数进行呈现,必须遵循以下准则:
- 不要绑定深度模具视图。
- 禁用深度测试。
- 确保着色器不会输出深度。
- 如果绑定了任何呈现目标视图(D3D11_BIND_RENDER_TARGET),并且强制样本计数大于 1,请确保每个呈现目标只有一个样本。
- 不要以采样频率运行着色器。 因此,ID3D11ShaderReflection::IsSampleFrequencyShader 返回 FALSE。
否则,呈现行为是未定义的。 有关如何配置深度模具的信息,请参阅 配置 Depth-Stencil 功能。
使用着色器处理视频资源
Direct3D 11.1 允许创建视频资源的视图(SRV/RTV/UAV),以便 Direct3D 着色器可以处理这些视频资源。 基础视频资源的格式限制视图可以使用的格式。 DXGI_FORMAT 枚举包含新的视频资源格式值。 这些 DXGI_FORMAT 值指定了可以创建的有效视图格式以及 Direct3D 11.1 运行时如何映射视图。 可以创建同一图面不同部分的多个视图,具体取决于格式,视图的大小可能彼此不同。
Direct3D 11.1 更新此功能的以下方法。
- ID3D11Device::CreateShaderResourceView
- ID3D11Device::CreateRenderTargetView
- ID3D11Device::CreateUnorderedAccessView
对共享 Texture2D 资源的扩展支持
Direct3D 11.1 保证可以共享使用特定资源类型和格式创建的 Texture2D 资源。 若要共享 Texture2D 资源,请在创建这些资源时使用 D3D11_RESOURCE_MISC_SHARED、D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX或 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 和 D3D11_RESOURCE_MISC_SHARED_NTHANDLE(Windows 8 的新增)标志的组合。
Direct3D 11.1 保证可以使用这些 DXGI_FORMAT 值共享创建的 Texture2D 资源:
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
此外,Direct3D 11.1 还保证可以共享使用 mipmap 级别 1 创建的 Texture2D 资源,数组大小为 1、绑定标志 D3D11_BIND_SHADER_RESOURCE 和 D3D11_BIND_RENDER_TARGET 组合、使用默认值(D3D11_USAGE_DEFAULT),并且仅使用以下 D3D11_RESOURCE_MISC_FLAG 值:
- D3D11_RESOURCE_MISC_SHARED
- D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
- D3D11_RESOURCE_MISC_SHARED_NTHANDLE
- D3D11_RESOURCE_MISC_GDI_COMPATIBLE
Direct3D 11.1 允许共享更多样化的 Texture2D 资源类型和格式。 可以通过使用 D3D11_FEATURE_D3D11_OPTIONS 值调用 ID3D11Device::CheckFeatureSupport 来查询图形驱动程序和硬件是否支持扩展的 Texture2D 资源共享。 在此 ID3D11Device::CheckFeatureSupport 调用中,传递指向 D3D11_FEATURE_DATA_D3D11_OPTIONS 结构的指针。 ID3D11Device::CheckFeatureSupport 如果硬件和驱动程序支持扩展 Texture2D 资源共享,D3D11_FEATURE_DATA_D3D11_OPTIONS 的 ExtendedResourceSharing 成员设置为 TRUE。
如果 ID3D11Device::CheckFeatureSupport 在 ExtendedResourceSharing中返回 TRUE,则可以共享使用以下 DXGI_FORMAT 值创建的资源:
- DXGI_FORMAT_R32G32B32A32_TYPELESS
- DXGI_FORMAT_R32G32B32A32_FLOAT
- DXGI_FORMAT_R32G32B32A32_UINT
- DXGI_FORMAT_R32G32B32A32_SINT
- DXGI_FORMAT_R16G16B16A16_TYPELESS
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R16G16B16A16_UNORM
- DXGI_FORMAT_R16G16B16A16_UINT
- DXGI_FORMAT_R16G16B16A16_SNORM
- DXGI_FORMAT_R16G16B16A16_SINT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R10G10B10A2_UINT
- DXGI_FORMAT_R8G8B8A8_TYPELESS
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_R8G8B8A8_UINT
- DXGI_FORMAT_R8G8B8A8_SNORM
- DXGI_FORMAT_R8G8B8A8_SINT
- DXGI_FORMAT_B8G8R8A8_TYPELESS
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_TYPELESS
- DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
- DXGI_FORMAT_R32_TYPELESS
- DXGI_FORMAT_R32_FLOAT
- DXGI_FORMAT_R32_UINT
- DXGI_FORMAT_R32_SINT
- DXGI_FORMAT_R16_TYPELESS
- DXGI_FORMAT_R16_FLOAT
- DXGI_FORMAT_R16_UNORM
- DXGI_FORMAT_R16_UINT
- DXGI_FORMAT_R16_SNORM
- DXGI_FORMAT_R16_SINT
- DXGI_FORMAT_R8_TYPELESS
- DXGI_FORMAT_R8_UNORM
- DXGI_FORMAT_R8_UINT
- DXGI_FORMAT_R8_SNORM
- DXGI_FORMAT_R8_SINT
- DXGI_FORMAT_A8_UNORM
- DXGI_FORMAT_AYUV
- DXGI_FORMAT_YUY2
- DXGI_FORMAT_NV12
- DXGI_FORMAT_NV11
- DXGI_FORMAT_P016
- DXGI_FORMAT_P010
- DXGI_FORMAT_Y216
- DXGI_FORMAT_Y210
- DXGI_FORMAT_Y416
- DXGI_FORMAT_Y410
如果 ID3D11Device::CheckFeatureSupport 在 ExtendedResourceSharing中返回 true,则可以共享使用这些功能和标志创建的资源:
- D3D11_USAGE_DEFAULT
- D3D11_BIND_SHADER_RESOURCE
- D3D11_BIND_RENDER_TARGET
- D3D11_RESOURCE_MISC_GENERATE_MIPS
- D3D11_BIND_UNORDERED_ACCESS
- 2D 纹理资源中的 Mipmap 级别(一个或多个级别)(在 MipLevels 成员中指定的 D3D11_TEXTURE2D_DESC)
- 二维纹理资源的数组(一个或多个纹理)(在 ArraySize 成员 D3D11_TEXTURE2D_DESC中指定的)
- D3D11_BIND_DECODER
- D3D11_RESOURCE_MISC_RESTRICTED_CONTENT
- D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE
- D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE_DRIVER
注意
当 ExtendedResourceSharingTRUE时,在指定用于共享 Texture2D 资源的绑定标志时,可以更加灵活。 图形驱动程序和硬件不仅支持更多绑定标志,还支持绑定标志的可能组合。 例如,可以仅指定 D3D11_BIND_RENDER_TARGET 或无绑定标志,等等。
即使 ID3D11Device::CheckFeatureSupport 在 ExtendedResourceSharing中返回 true,你仍无法共享使用这些功能和标志创建的资源:
- D3D11_BIND_DEPTH_STENCIL
- 多采样抗锯齿模式(MSAA)模式下的 2D 纹理资源(使用 DXGI_SAMPLE_DESC指定)
- D3D11_RESOURCE_MISC_RESOURCE_CLAMP
- D3D11_USAGE_IMMUTABLE、D3D11_USAGE_DYNAMIC或 D3D11_USAGE_STAGING(即可映射)
- D3D11_RESOURCE_MISC_TEXTURECUBE
使用新的复制选项更改子资源
Direct3D 11.1 允许使用新的复制标志来复制和更新子资源。 复制子资源时,源和目标资源可以相同,源和目标区域可以重叠。
此 Direct3D 11.1 功能包括以下 API。
放弃资源和资源视图
Direct3D 11.1 允许从设备上下文中放弃资源和资源视图。 此新功能通知 GPU 不再需要资源或资源视图中的现有内容。
此 Direct3D 11.1 功能包括以下 API。
- ID3D11DeviceContext1::D iscardResource
- ID3D11DeviceContext1::D iscardView
- ID3D11DeviceContext1::D iscardView1
支持更多 UAV
Direct3D 11.1 允许将资源绑定到 输出合并阶段 以及为无序资源设置视图数组时,可以使用更多 UAV。
Direct3D 11.1 更新此功能的以下方法。
- ID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews
- ID3D11DeviceContext::CSSetUnorderedAccessViews
将常量缓冲区的子范围绑定到着色器
Direct3D 11.1 允许绑定常量缓冲区的子范围,以便着色器访问。 可以提供更大的常量缓冲区,并指定着色器可以使用的子范围。
此 Direct3D 11.1 功能包括以下 API。
- ID3D11DeviceContext1::CSSetConstantBuffers1
- ID3D11DeviceContext1::D SSetConstantBuffers1
- ID3D11DeviceContext1::GSSetConstantBuffers1
- ID3D11DeviceContext1::HSSetConstantBuffers1
- ID3D11DeviceContext1::P SSetConstantBuffers1
- ID3D11DeviceContext1::VSSetConstantBuffers1
检索绑定到着色器的常量缓冲区的子范围
Direct3D 11.1 允许检索绑定到着色器的常量缓冲区的子范围。
此 Direct3D 11.1 功能包括以下 API。
- ID3D11DeviceContext1::CSGetConstantBuffers1
- ID3D11DeviceContext1::D SGetConstantBuffers1
- ID3D11DeviceContext1::GSGetConstantBuffers1
- ID3D11DeviceContext1::HSGetConstantBuffers1
- ID3D11DeviceContext1::P SGetConstantBuffers1
- ID3D11DeviceContext1::VSGetConstantBuffers1
清除资源视图的所有或部分
Direct3D 11.1 允许清除资源视图(RTV、UAV 或任何 Texture2D 图面的视频视图)。 将相同的颜色值应用于视图的所有部分。
此 Direct3D 11.1 功能包括以下 API。
使用NO_OVERWRITE映射动态缓冲区的 SRV
Direct3D 11.1 允许使用 D3D11_MAP_WRITE_NO_OVERWRITE 映射动态缓冲区的着色器资源视图(SRV)。 Direct3D 11 及更早的运行时限制到顶点或索引缓冲区的映射。
Direct3D 11.1 更新此功能的 ID3D11DeviceContext::Map 方法。
在每个管道阶段使用 UAV
Direct3D 11.1 允许在所有着色器阶段使用以下着色器模型 5.0 指令,这些指令以前只用于像素着色器和计算着色器。
- dcl_uav_typed
- dcl_uav_raw
- dcl_uav_structured
- ld_raw
- ld_structured
- ld_uav_typed
- store_raw
- store_structured
- store_uav_typed
- sync_uglobal
- 所有原子和直接原子(例如,atomic_and 和 imm_atomic_and)
Direct3D 11.1 更新此功能的以下方法。
- ID3D11DeviceContext::CreateDomainShader
- ID3D11DeviceContext::CreateGeometryShader
- ID3D11DeviceContext::CreateGeometryShaderWithStreamOutput
- ID3D11DeviceContext::CreateHullShader
- ID3D11DeviceContext::CreateVertexShader
这些指令存在于 direct3D 11.0 中的 ps_5_0 和 cs_5_0中。 由于 Direct3D 11.1 使 UAV 在所有着色器阶段都可用,因此这些说明在所有着色器阶段都可用。
如果将使用上述任何说明的已编译着色器(VS/HS/DS/HS)传递给创建着色器函数(如 CreateVertexShader),则不支持每个阶段(包括未使用此功能实现的现有驱动程序)的设备上,create-shader 函数将失败。 如果着色器尝试使用 UAV 槽超出硬件支持的 UAV 槽集,则创建着色器函数也会失败。
这些指令引用的 UAV 在所有管道阶段共享。 例如,在 输出合并阶段 槽 0 处绑定的 UAV 在槽 0 到 VS/HS/DS/GS/PS。
UAV 访问从给定 Draw*() 内执行的着色器阶段或从 Dispatch*() 中的计算着色器发出的问题,不能保证按颁发顺序完成。 但所有 UAV 访问在 Draw*() 或 Dispatch*()结束时完成。
对 WARP 设备的扩展支持
Direct3D 11.1 扩展了对 WARP 设备的支持,通过在 D3D11CreateDevice的 DriverType 参数中传递 D3D_DRIVER_TYPE_WARP 来创建这些设备。
从 Direct3D 11.1 WARP 设备开始支持:
WARP 设备不支持以下可选功能:
运行虚拟机(VM)、Hyper-V(禁用图形处理单元(GPU)或没有显示驱动程序时,将获得一个 WARP 设备,其友好名称为“Microsoft基本显示适配器”。此 WARP 设备可以运行完整的 Windows 体验,其中包括 DWM、Internet Explorer 和 Windows 应用商店应用。 此 WARP 设备还支持运行使用 DirectDraw 或运行使用 Direct3D 3 到 Direct3D 11.1 的应用的旧版应用。
在会话 0 进程中使用 Direct3D
从 Windows 8 和 Windows Server 2012 开始,可以在会话 0 进程中使用大部分 Direct3D API。
注意
这些输出、窗口、交换链和与演示文稿相关的 API 在会话 0 进程中不可用,因为它们不适用于会话 0 环境:
- IDXGIFactory::CreateSwapChain
- IDXGIFactory::GetWindowAssociation
- IDXGIFactory::MakeWindowAssociation
- IDXGIAdapter::EnumOutputs
- ID3D11Debug::SetFeatureMask
- ID3D11Debug::SetPresentPerRenderOpDelay
- ID3D11Debug::SetSwapChain
- ID3D10Debug::SetFeatureMask
- ID3D10Debug::SetPresentPerRenderOpDelay
- ID3D10Debug::SetSwapChain
- D3D10CreateDeviceAndSwapChain
- D3D10CreateDeviceAndSwapChain1
- D3D11CreateDeviceAndSwapChain
如果在会话 0 进程中调用上述 API 之一,它将返回 DXGI_ERROR_NOT_CURRENTLY_AVAILABLE。
支持功能级别 9 上的阴影缓冲区
使用 Direct3D 10_0+ 阴影缓冲区功能的子集在 功能级别上实现阴影效果 9_x。 有关在功能级别9_x上实现阴影效果需要执行的作的信息,请参阅 实现 Direct3D 功能级别 9的阴影缓冲区。
相关主题
-
Direct3D 11 中的新增功能