Armazenando variáveis e tipos para sombreadores compartilharem

O objeto de vinculação de classe é um namespace para variáveis e tipos que vários sombreadores podem compartilhar. Quando você passa um objeto de vinculação de classe em uma chamada para criar um sombreador, o runtime reúne uma lista de variáveis e tipos que podem implementar cada interface no sombreador e armazena os nomes dessas variáveis e tipos no objeto de vinculação de classe.

Portanto, quando você chama o método ID3D11ClassLinkage::GetClassInstance para gerar instâncias de classe do objeto de vinculação de classe, o runtime pode recuperar a variável ou o tipo que corresponde ao nome fornecido em cada sombreador (se esse nome for válido para um determinado sombreador) e que é criado com o objeto de vinculação de classe fornecido.

Por exemplo, suponha que você tenha uma classe Light que implemente uma interface Color e use essa classe em seu sombreador de vértice e sombreador de pixel. Quando você cria um sombreador (por exemplo, chamando ID3D11Device::CreatePixelShader), o runtime determina que o tipo de classe Light está disponível em sombreadores de vértice e pixel e adiciona o tipo de classe Light ao objeto de vinculação de classe. Em seguida, você pode criar uma instância Light em um local desejado, associar os recursos para ambos os sombreadores e passar essa instância na matriz de instâncias de classe ao definir o sombreador para o dispositivo (por exemplo, chamando ID3D11DeviceContext::P SSetShader). Em seguida, o runtime executa a seguinte sequência:

  1. Verifica se a instância foi criada com o mesmo objeto de vinculação de classe.
  2. Verifica se o tipo de classe Light é availabe em sombreadores de vértice e pixel.
  3. Seleciona as tabelas de função corretas, que podem ser diferentes para os sombreadores de vértice e pixel.
  4. Envia os deslocamentos que a instância fornece.

O objeto de vinculação de classe é, em última análise, um repositório de nomes de tipo e variável. O número máximo de nomes disponíveis para cada item (tipo e variável) é 64K. Quanto mais longos forem os nomes de tipo e variável, maior será o requisito de armazenamento para os metadados de interface armazenados por sombreador. Isso ocorre porque o runtime deve armazenar um mapeamento para esses nomes para cada sombreador.

Vinculação dinâmica

Vinculação dinâmica