Diferenças entre efeitos 10 e efeitos 11

Este tópico mostra as diferenças entre efeitos 10 e efeitos 11.

Contextos de dispositivo, threading e clonagem

A interface ID3D10Device foi dividida em duas interfaces no Direct3D 11: ID3D11Device e ID3D11DeviceContext. Você pode criar vários ID3D11DeviceContexts para facilitar a execução simultânea em vários threads. Os Efeitos 11 estendem esse conceito para a estrutura Efeitos.

O runtime do Effects 11 é de thread único. Por esse motivo, você não deve usar uma única instância ID3DX11Effect com vários threads simultaneamente.

Para usar o runtime do Effects 11 em várias instâncias, você deve criar instâncias ID3DX11Effect separadas. Como ID3D11DeviceContext também é de thread único, você deve passar instâncias ID3D11DeviceContext diferentes para cada instância de efeito em Apply. Você pode usar esses contextos de dispositivo separados para criar listas de comandos para que o thread de renderização possa aplicá-los no contexto imediato do dispositivo.

A maneira mais fácil de criar vários efeitos que encapsulam a mesma funcionalidade, para uso em vários threads, é criar um efeito e, em seguida, fazer cópias clonadas. A clonagem tem as seguintes vantagens em relação à criação de várias cópias do zero:

  1. A rotina de clonagem é mais rápida do que a rotina de criação.
  2. Os efeitos clonados compartilham sombreadores criados, blocos de estado e instâncias de classe (para que não precisem ser recriados).
  3. Os efeitos clonados podem compartilhar buffers constantes.
  4. Os efeitos clonados começam com o estado que corresponde ao efeito atual (valores variáveis, se ele foi otimizado ou não).

Consulte Clonando um efeito para obter mais informações.

Pools e grupos de efeitos

De longe, o uso mais prevalente de pools de efeito no Direct3D 10 foi para agrupar materiais. Os pools de efeitos foram removidos dos Efeitos 11 e os grupos foram adicionados, que é um método mais eficiente de agrupamento de materiais.

Um grupo de efeitos é simplesmente um conjunto de técnicas. Consulte Sintaxe do grupo de efeitos (Direct3D 11) para obter mais informações.

Considere a seguinte hierarquia de efeitos com quatro efeitos filho e um pool de efeitos:

// 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 { ... }

Você pode obter a mesma funcionalidade nos Efeitos 11 usando grupos:

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

Novos estágios do sombreador

Há três novos estágios de sombreador no Direct3D 11: o sombreador de casco, o sombreador de domínio e o sombreador de computação. Os efeitos 11 os manipulam de maneira semelhante aos sombreadores de vértice, sombreadores de geometria e sombreadores de pixel.

Três novos tipos de variáveis foram adicionados aos Efeitos 11:

  • HullShader
  • DomainShader
  • ComputeShader

Se você usar esses sombreadores em uma técnica, deverá rotular essa técnica como "técnica11" e não "técnica10". O sombreador de computação não pode ser definido na mesma passagem que qualquer outro estado gráfico (outros sombreadores, blocos de estado ou destinos de renderização).

Novos tipos de textura

O Direct3D 11 dá suporte aos seguintes tipos de textura:

Exibições de acesso não ordenadas

O Effects 11 dá suporte à obtenção e à definição dos novos tipos de exibição de acesso não ordenado. Isso funciona de maneira semelhante às texturas.

Considere este exemplo de Efeitos HLSL:

  
RWTexture1D<float> myUAV;

Você pode definir essa variável em C++ da seguinte maneira:

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

O Direct3D 11 dá suporte aos seguintes tipos de exibição de acesso não ordenado:

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Interfaces e instâncias de classe

Para obter a sintaxe de interface e classe, consulte Interfaces e classes.

Para usar interfaces e classes em efeitos, consulte Interfaces e classes em efeitos.

Fluxo endereçável

No Direct3D 10, os sombreadores de geometria podem gerar um fluxo de dados para a unidade de saída de fluxo e a unidade de rasterizador. No Direct3D11, os sombreadores de geometria podem gerar até quatro fluxos de dados para a unidade de saída de fluxo e, no máximo, um desses fluxos para a unidade de rasterizador. O intrínseco ConstructGSWithSO foi atualizado para refletir essa nova funcionalidade.

Confira Sintaxe do Stream Out para obter mais informações.

Configurando e desmarcando o estado do dispositivo

Em Efeitos 10, você pode tornar buffers constantes e buffers de textura gerenciados pelo usuário usando as funções ID3D10EffectConstantBuffer::SetConstantBuffer e SetTextureBuffer . Depois de chamar essas funções, o runtime do Effects 10 não gerencia mais o buffer constante ou o buffer de textura e o usuário deve preencher os dados usando a interface ID3D10Device.

Em Efeitos 11, você também pode tornar os blocos de estado (estado de mesclagem, estado do rasterizador, estado de estêncil de profundidade e estado do sampler) gerenciados pelo usuário usando as seguintes chamadas:

Depois de chamar essas funções, o runtime de Efeitos 11 não gerencia mais as variáveis de bloco de estado e os valores permanecerão inalterados. Observe que, como os blocos de estado são imutáveis, o usuário deve definir um novo bloco de estado para alterar os valores.

Você também pode reverter buffers constantes, buffers de textura e blocos de estado para o estado gerenciado não usuário. Se você desmarcá-las, o runtime do Effects 11 continuará a atualizá-las quando necessário. Você pode usar as seguintes chamadas para remover a definição de variáveis gerenciadas pelo usuário:

Máquina Virtual de Efeitos

A máquina virtual de efeitos, que avaliou expressões complexas fora das funções, foi removida.

Não há suporte para os seguintes exemplos de expressões complexas:

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

Há suporte para os seguintes exemplos de expressões não complexas:

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex é uma variável uint
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Essas expressões podem aparecer em expressões de bloco de estado (como FILTER) e expressões de passagem (como SetPixelShader).

Disponibilidade e localização de origem

Os efeitos 10 foram distribuídos em D3D10.dll. Os efeitos 11 são distribuídos como origem, com soluções correspondentes do Visual Studio para compilá-lo. Ao criar aplicativos do tipo efeitos, recomendamos que você inclua a fonte Effects 11 diretamente nesses aplicativos.

Você pode obter Efeitos 11 de Efeitos para a Atualização do Direct3D 11.

Efeitos (Direct3D 11)