效果 10 和效果 11 之间的差异
本主题介绍效果 10 和效果 11 之间的差异。
设备上下文、线程处理和克隆
在 Direct3D 11 中,ID3D10Device 接口已拆分为两个接口:ID3D11Device 和 ID3D11DeviceContext。 可以创建多个 ID3D11DeviceContexts,以便于在多个线程上并发执行。 Effects 11 将此概念扩展到了 Effects 框架。
Effects 11 运行时是单线程的。 因此,不应同时使用具有多个线程的单个 ID3DX11Effect 实例。
若要在多个实例上使用 Effects 11 运行时,必须创建单独的 ID3DX11Effect 实例。 由于 ID3D11DeviceContext 也是单线程的,因此应在 Apply 上将不同的 ID3D11DeviceContext 实例传递给每个效果实例。 可以使用这些单独的设备上下文来创建命令列表,以便呈现线程可以在直接的设备上下文中应用它们。
创建封装相同功能的多个效果(用于多个线程)的最简单方法是创建一个效果,然后创建克隆的副本。 与从头开始创建多个副本时,克隆具有以下优势:
- 克隆例程比创建例程快。
- 克隆的效果共享创建的着色器、状态块和类实例 (,因此无需) 重新创建它们。
- 克隆的效果可以共享常量缓冲区。
- 克隆的效果从与当前效果 (变量值匹配的状态开始,无论它是否已) 优化。
有关详细信息 ,请参阅克隆效果 。
效果池和组
到目前为止,在 Direct3D 10 中,效果池最普遍的使用是对材料进行分组。 效果池已从效果 11 中删除,并添加了组,这是对材料进行分组的更高效方法。
效果组只是一组技术。 有关详细信息 ,请参阅 Direct3D 11) (效果组语法 。
请考虑以下效果层次结构,其中包含四个子效果和一个效果池:
// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }
// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }
// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }
// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }
可以使用组在效果 11 中实现相同的功能:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
新的着色器阶段
Direct3D 11 中有三个新的着色器阶段:外壳着色器、域着色器以及计算着色器。 效果 11 的处理方式与顶点着色器、几何着色器和像素着色器类似。
已向效果 11 添加了三个新的变量类型:
- 赫尔沙德
- DomainShader
- ComputeShader
如果在某个技术中使用这些着色器,则必须将该技术标记为“技术 11”,而不是“技术 10”。 计算着色器不能与任何其他图形状态 (其他着色器、状态块或呈现目标) 在同一传递中设置。
新的纹理类型
Direct3D 11 支持以下纹理类型:
无序访问视图
效果 11 支持获取和设置新的无序访问视图类型。 其工作方式与纹理类似。
请考虑以下效果 HLSL 示例:
RWTexture1D<float> myUAV;
可以在 C++ 中设置此变量,如下所示:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 支持以下无序访问视图类型:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
接口和类实例
有关接口和类语法,请参阅 接口和类。
有关在效果中使用接口和类的信息,请参阅 接口和效果中的类。
可寻址流出
在 Direct3D 10 中,几何着色器可以将一个数据流输出到流输出单元和光栅器单元。 在 Direct3D11 中,几何着色器最多可以将四个数据流输出到流输出单元,最多可以将其中一个数据流输出到光栅器单元。 ConstructGSWithSO 内部函数已更新,以反映这一新功能。
有关详细信息 ,请参阅 Stream Out 语法 。
设置和取消设置设备状态
在效果 10 中,可以使用 ID3D10EffectConstantBuffer::SetConstantBuffer 和 SetTextureBuffer 函数使常量缓冲区和纹理缓冲区由用户管理。 调用这些函数后,Effects 10 运行时不再管理常量缓冲区或纹理缓冲区,用户必须使用 ID3D10Device 接口填充数据。
在效果 11 中,还可以使用以下调用使状态块 (混合状态、光栅器状态、深度模具状态和采样器状态) 用户管理:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
调用这些函数后,Effects 11 运行时不再管理状态块变量,并且其中的值将保持不变。 请注意,由于状态块是不可变的,因此用户必须设置新的状态块才能更改值。
还可以将常量缓冲区、纹理缓冲区和状态块还原为非用户托管状态。 如果取消设置这些变量,则 Effects 11 运行时将在必要时继续更新它们。 可以使用以下调用来取消设置用户托管变量:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
效果虚拟机
删除了计算函数外部复杂表达式的效果虚拟机。
不支持以下复杂表达式的示例:
- SetPixelShader ( myPSArray ( i * 3 + j ) ) ;
- SetPixelShader ( myPSArray ( (float) i ) ;
- FILTER = i + 2;
支持以下非复杂表达式示例:
- SetPixelShader ( myPS ) ;
- SetPixelShader ( myPS[i] ) ;
- SetPixelShader ( myPS[ uIndex ] ) ;uIndex 是一个 uint 变量
- FILTER = i;
- FILTER = ANISOTROPIC;
这些表达式可能出现在 filter) 等状态块表达式 (中,并将表达式 ((如 SetPixelShader) )传递。
源可用性和位置
效果 10 在D3D10.dll中分布。 效果 11 作为源分发,使用相应的 Visual Studio 解决方案对其进行编译。 创建效果类型应用程序时,建议在这些应用程序中直接包含 Effects 11 源。
相关主题