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

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

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

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

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

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

动态链接

动态链接