效果 10 和效果 11 之间的差异

本主题介绍效果 10 和效果 11 之间的差异。

设备上下文、线程处理和克隆

在 Direct3D 11 中,ID3D10Device 接口已拆分为两个接口:ID3D11Device 和 ID3D11DeviceContext。 可以创建多个 ID3D11DeviceContexts,以便于在多个线程上并发执行。 Effects 11 将此概念扩展到了 Effects 框架。

Effects 11 运行时是单线程的。 因此,不应同时使用具有多个线程的单个 ID3DX11Effect 实例。

若要在多个实例上使用 Effects 11 运行时,必须创建单独的 ID3DX11Effect 实例。 由于 ID3D11DeviceContext 也是单线程的,因此应在 Apply 上将不同的 ID3D11DeviceContext 实例传递给每个效果实例。 可以使用这些单独的设备上下文来创建命令列表,以便呈现线程可以在直接的设备上下文中应用它们。

创建封装相同功能的多个效果(用于多个线程)的最简单方法是创建一个效果,然后创建克隆的副本。 与从头开始创建多个副本时,克隆具有以下优势:

  1. 克隆例程比创建例程快。
  2. 克隆的效果共享创建的着色器、状态块和类实例 (,因此无需) 重新创建它们。
  3. 克隆的效果可以共享常量缓冲区。
  4. 克隆的效果从与当前效果 (变量值匹配的状态开始,无论它是否已) 优化。

有关详细信息 ,请参阅克隆效果

效果池和组

到目前为止,在 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::SetConstantBufferSetTextureBuffer 函数使常量缓冲区和纹理缓冲区由用户管理。 调用这些函数后,Effects 10 运行时不再管理常量缓冲区或纹理缓冲区,用户必须使用 ID3D10Device 接口填充数据。

在效果 11 中,还可以使用以下调用使状态块 (混合状态、光栅器状态、深度模具状态和采样器状态) 用户管理:

调用这些函数后,Effects 11 运行时不再管理状态块变量,并且其中的值将保持不变。 请注意,由于状态块是不可变的,因此用户必须设置新的状态块才能更改值。

还可以将常量缓冲区、纹理缓冲区和状态块还原为非用户托管状态。 如果取消设置这些变量,则 Effects 11 运行时将在必要时继续更新它们。 可以使用以下调用来取消设置用户托管变量:

效果虚拟机

删除了计算函数外部复杂表达式的效果虚拟机。

不支持以下复杂表达式的示例:

  1. SetPixelShader ( myPSArray ( i * 3 + j ) ) ;
  2. SetPixelShader ( myPSArray ( (float) i ) ;
  3. FILTER = i + 2;

支持以下非复杂表达式示例:

  1. SetPixelShader ( myPS ) ;
  2. SetPixelShader ( myPS[i] ) ;
  3. SetPixelShader ( myPS[ uIndex ] ) ;uIndex 是一个 uint 变量
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

这些表达式可能出现在 filter) 等状态块表达式 (中,并将表达式 ((如 SetPixelShader) )传递。

源可用性和位置

效果 10 在D3D10.dll中分布。 效果 11 作为源分发,使用相应的 Visual Studio 解决方案对其进行编译。 创建效果类型应用程序时,建议在这些应用程序中直接包含 Effects 11 源。

可以从 Direct3D 11 更新效果获取效果 11

Direct3D 11) (效果