Direct3D 11.1 功能
Direct3D 11.1 中添加了以下功能,Windows 8、Windows RT和Windows Server 2012随附此功能。 对 Direct3D 11.1 的部分支持通过适用于 Windows 7 的平台更新在 Windows 7 和 Windows Server 2008 R2 上提供,该更新可通过 Windows 7 的平台更新获得。
- 着色器跟踪和编译器增强功能
- Direct3D 设备共享
- 检查对新的 Direct3D 11.1 功能和格式的支持
- 使用 HLSL 最小精度
- 在 HLSL 中指定功能级别 9 及更高级别的用户剪辑平面
- 创建比着色器可访问的更大的常量缓冲区
- 在呈现器目标中使用逻辑操作
- 强制采样计数以创建光栅器状态
- 使用着色器处理视频资源
- 对共享 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 编译器的 Fxc.exe命令行版本一起位于 Windows SDK for Windows 8 的 \bin 文件夹中。
注意
虽然可以使用此库和 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 Graphics Infrastructure (DXGI) 1.2 还指定了新的 DXGI_FORMAT 值。
此 Direct3D 11.1 功能包含以下 API。
- 具有 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::CheckFeatureSupport
- 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 的操作系统。
在 HLSL 中指定功能级别 9 及更高级别的用户剪辑平面
从 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 资源,请在创建Windows 8) 标志时使用D3D11_RESOURCE_MISC_SHARED、D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX或D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX和D3D11_RESOURCE_MISC_SHARED_NTHANDLE (的组合。
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 保证可以共享创建的纹理 2D 资源(mipmap 级别为 1、数组大小为 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 结构。 如果硬件和驱动程序支持扩展的 Texture2D 资源共享,ID3D11Device::CheckFeatureSupport 会将 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
- mipmap 级别 (在 D3D11_TEXTURE2D_DESC) 的 MipLevels 成员中指定的 2D 纹理资源 (一 个或多个级别)
- 2D 纹理资源的数组 (D3D11_TEXTURE2D_DESC) 的 ArraySize 成员中指定的一个或多个纹理) (
- D3D11_BIND_DECODER
- D3D11_RESOURCE_MISC_RESTRICTED_CONTENT
- D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE
- D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE_DRIVER
注意
当 ExtendedResourceSharing 为 TRUE 时,指定用于共享 Texture2D 资源的绑定标志时,可以更加灵活。 图形驱动程序和硬件不仅支持更多绑定标志,还支持更多可能的绑定标志组合。 例如,可以只指定 D3D11_BIND_RENDER_TARGET 或不指定绑定标志,等等。
即使 ID3D11Device::CheckFeatureSupport 在 ExtendedResourceSharing 中返回 TRUE,仍无法共享使用这些功能和标志创建的资源:
- D3D11_BIND_DEPTH_STENCIL
- 使用DXGI_SAMPLE_DESC) 指定的多重采样抗锯齿 (MSAA) 模式 (中的 2D 纹理资源
- 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
这些指令存在于 ps_5_0 和 cs_5_0 的 Direct3D 11.0 中。 由于 Direct3D 11.1 使 UAV 在所有着色器阶段都可用,因此这些说明在所有着色器阶段都可用。
如果将编译的着色器 (VS/HS/DS/HS) 传递给在每个 (阶段不支持 UAV 的设备上使用上述任一指令的 VS/HS/DS/ HS) ) ,则 create-shader 函数将失败,创建着色器函数将失败。 如果着色器尝试使用超出硬件支持的 UAV 槽集的 UAV 槽,则 create-shader 函数也会失败。
这些指令引用的 UAV 在所有管道阶段之间共享。 例如,在 输出合并阶段 的槽 0 处绑定的 UAV 在槽 0 处可用于 VS/HS/DS/GS/PS。
在给定的 Draw* () 内执行或从 Dispatch* () 中的计算着色器发出的 UAV 访问不保证按照发出的顺序完成。 但所有 UAV 访问都会在 Draw* () 或 Dispatch* () 结束时完成。
对 WARP 设备的扩展支持
Direct3D 11.1 扩展了对 WARP 设备的支持,通过在 D3D11CreateDevice 的 DriverType 参数中传递D3D_DRIVER_TYPE_WARP来创建 WARP 设备。
从 Direct3D 11.1 WARP 设备支持开始:
WARP 设备不支持以下可选功能:
如果虚拟机 (VM) Hyper-V 运行,并且图形处理单元 (GPU) 禁用,或者没有显示驱动程序,则会获得友好名称为“Microsoft 基本显示适配器”的 WARP 设备。此 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 的阴影缓冲区。
相关主题