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:
- A rotina de clonagem é mais rápida do que a rotina de criação.
- Os efeitos clonados compartilham sombreadores criados, blocos de estado e instâncias de classe (para que não precisem ser recriados).
- Os efeitos clonados podem compartilhar buffers constantes.
- 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:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
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:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
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:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Há suporte para os seguintes exemplos de expressões não complexas:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex é uma variável uint
- FILTER = i;
- 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.
Tópicos relacionados