存储要共享的着色器的变量和类型

类链接对象是多个着色器可以共享的变量和类型的命名空间。 在调用中传递类链接对象以创建着色器时,运行时将收集可在着色器中实现每个接口的变量和类型的列表,并将这些变量和类型的名称存储在类链接对象中。

因此,调用 ID3D11ClassLinkage::GetClassInstance 方法以从类链接对象生成类实例时,运行时可以检索与每个着色器中提供的名称相对应的变量或类型 (如果该名称对给定着色器) 有效并且是使用给定类链接对象创建的。

例如,假设你有一个实现 Color 接口的 Light 类,并在顶点着色器和像素着色器中使用此类。 例如,通过调用 ID3D11Device::CreatePixelShader) 创建着色器 (时,运行时确定 Light 类类型在顶点着色器和像素着色器中均可用,并将 Light 类类型添加到类链接对象。 然后,可以在所需位置创建 一个 Light 实例,绑定两个着色器的资源,并在将着色器设置为设备 (时,通过调用 ID3D11DeviceContext::P SSetShader) 将此实例传递到类实例数组中。 然后,运行时将执行以下顺序:

  1. 验证实例是否使用同一类链接对象创建。
  2. 验证 Light 类类型在顶点着色器和像素着色器中是否可用。
  3. 选择正确的函数表,对于顶点着色器和像素着色器,这些函数表可能有所不同。
  4. 向下发送实例提供的偏移量。

类链接对象最终是类型和变量名称的存储库。 每个项 (类型和变量) 的最大可用名称数为 64K。 类型和变量名称越长,存储对每个着色器存储的接口元数据的存储要求就越高。 这是因为运行时必须为每个着色器存储这些名称的映射。

动态链接

动态链接