Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico mostra as diferenças entre os Efeitos 10 e os 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. O Effects 11 estende esse conceito à estrutura Effects.
O tempo de execução 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 tempo de execução do Effects 11 em várias instâncias, você deve criar instâncias ID3DX11Effect separadas. Como o 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 a partir 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, quer tenha sido otimizado ou não).
Consulte Cloning an Effect para obter mais informações.
Grupos e Grupos de Efeitos
De longe, o uso mais prevalente de pools de efeitos no Direct3D 10 foi para agrupar materiais. Os Pools de Efeitos foram removidos dos Efeitos 11 e grupos foram adicionados, o que é um método mais eficiente de agrupar 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 no Effects 11 usando grupos:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Novos Estágios de Shader
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. O Effects 11 lida com eles de maneira semelhante aos sombreadores de vértice, sombreadores de geometria e sombreadores de pixel.
Três novos tipos de variáveis foram adicionados ao Effects 11:
- HullShader
- DomainShader
- ComputeShader
Se você usar esses sombreadores em uma técnica, você deve 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 suporta os seguintes tipos de textura:
Visualizações de acesso não ordenadas
O Effects 11 suporta a obtenção e configuraçã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 suporta os seguintes tipos de vista 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 no Effects.
Saída de fluxo endereçável
No Direct3D 10, os sombreadores de geometria podem produzir um fluxo de dados para a unidade de saída de fluxo e a unidade rasterizadora. No Direct3D11, os sombreadores de geometria podem exportar até quatro fluxos de dados para a unidade de saída de fluxo e, no máximo, um desses fluxos para a unidade rasterizadora. O ConstructGSWithSO intrínseco foi atualizado para refletir essa nova funcionalidade.
Consulte Stream out Syntax para obter mais informações.
Definindo e desdefinindo o estado do dispositivo
No Effects 10, você pode fazer buffers constantes e buffers de textura gerenciados pelo usuário usando o ID3D10EffectConstantBuffer::SetConstantBuffer e funções de SetTextureBuffer. Depois de chamar essas funções, o tempo de execução 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.
No Effects 11, você também pode fazer com que os blocos de estado (estado de mistura, estado do rasterizador, estado de estêncil de profundidade e estado do amostrador) sejam gerenciados pelo usuário usando as seguintes chamadas:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Depois de chamar essas funções, o tempo de execução do Effects 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 por não-usuário. Se você desdefinir essas variáveis, o tempo de execução do Effects 11 continuará a atualizá-las quando necessário. Você pode usar as seguintes chamadas para desdefinir 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 avaliava 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( (flutuante)i );
- FILTRO = i + 2;
Os seguintes exemplos de expressões não complexas são suportados:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex é uma variável uint
- FILTRO = i;
- FILTRO = ANISOTRÓPICO;
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 da fonte
O Efeito 10 foi distribuído em D3D10.dll. O Effects 11 é distribuído como fonte, com soluções correspondentes do Visual Studio para compilá-lo. Ao criar aplicativos do tipo efeitos, recomendamos que você inclua a fonte do Effects 11 diretamente nesses aplicativos.
Você pode obter o Effects 11 no Effects for Direct3D 11 Update.
Tópicos relacionados