Diferencias entre los efectos 10 y los efectos 11
En este tema se muestran las diferencias entre Efectos 10 y Efectos 11.
Contextos de dispositivo, subprocesos y clonación
La interfaz ID3D10Device se ha dividido en dos interfaces en Direct3D 11: ID3D11Device y ID3D11DeviceContext. Puede crear varios ID3D11DeviceContexts para facilitar la ejecución simultánea en varios subprocesos. Los efectos 11 amplían este concepto al marco Efectos.
El entorno de ejecución Effects 11 es de un solo subproceso. Por este motivo, no debe usar una sola instancia ID3DX11Effect con varios subprocesos simultáneamente.
Para usar el entorno de ejecución effects 11 en varias instancias, debe crear instancias ID3DX11Effect independientes. Dado que ID3D11DeviceContext también está subproceso único, debe pasar diferentes instancias id3D11DeviceContext a cada instancia de efecto en Apply. Puede usar estos contextos de dispositivo independientes para crear listas de comandos para que el subproceso de representación pueda aplicarlos en el contexto inmediato del dispositivo.
La manera más fácil de crear varios efectos que encapsulan la misma funcionalidad, para su uso en varios subprocesos, es crear un efecto y, a continuación, realizar copias clonadas. La clonación tiene las siguientes ventajas sobre la creación de varias copias desde cero:
- La rutina de clonación es más rápida que la rutina de creación.
- Los efectos clonados comparten sombreadores, bloques de estado e instancias de clase creados (por lo que no tienen que volver a crearse).
- Los efectos clonados pueden compartir búferes de constantes.
- Los efectos clonados comienzan con el estado que coincide con el efecto actual (valores de variable, si se ha optimizado o no).
Consulte Clonación de un efecto para obtener más información.
Grupos de efectos y grupos
Hasta ahora, el uso más frecuente de grupos de efectos en Direct3D 10 era para agrupar materiales. Los grupos de efectos se han quitado de Los efectos 11 y se han agregado grupos, que es un método más eficaz de agrupar materiales.
Un grupo de efectos es simplemente un conjunto de técnicas. Consulta Sintaxis de grupo de efectos (Direct3D 11) para obtener más información.
Considere la siguiente jerarquía de efectos con cuatro efectos secundarios y un grupo de efectos:
// 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 { ... }
Puede lograr la misma funcionalidad en Efectos 11 mediante grupos:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Nuevas fases del sombreador
Hay tres nuevas fases de sombreador en Direct3D 11: sombreador de casco, sombreador de dominio y sombreador de proceso. Los efectos 11 los controlan de forma similar a los sombreadores de vértices, sombreadores de geometría y sombreadores de píxeles.
Se han agregado tres nuevos tipos de variables a Efectos 11:
- HullShader
- DomainShader
- ComputeShader
Si usa estos sombreadores en una técnica, debe etiquetar esa técnica "technique11" y no "technique10". El sombreador de proceso no se puede establecer en el mismo paso que cualquier otro estado gráfico (otros sombreadores, bloques de estado o destinos de representación).
Nuevos tipos de textura
Direct3D 11 admite los siguientes tipos de textura:
Vistas de acceso desordenadas
Los efectos 11 admiten la obtención y configuración de los nuevos tipos de vista de acceso no ordenados. Esto funciona de forma similar a las texturas.
Tenga en cuenta este ejemplo de Efectos HLSL:
RWTexture1D<float> myUAV;
Puede establecer esta variable en C++ de la siguiente manera:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 admite los siguientes tipos de vistas de acceso no ordenados:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Interfaces e instancias de clase
Para obtener información sobre la sintaxis de interfaz y clase, consulte Interfaces y clases.
Para usar interfaces y clases en efectos, vea Interfaces y clases en efectos.
Salida de flujo direccionable
En Direct3D 10, los sombreadores de geometría podrían generar un flujo de datos en la unidad de salida de flujo y en la unidad de rasterizador. En Direct3D11, los sombreadores de geometría pueden generar hasta cuatro flujos de datos a la unidad de salida de flujo y, como máximo, una de esas secuencias a la unidad de rasterizador. El intrínseco ConstructGSWithSO se ha actualizado para reflejar esta nueva funcionalidad.
Para obtener más información, consulte Sintaxis de salida de flujo .
Establecer y restablecer el estado del dispositivo
En Efectos 10, podrías hacer que los búferes de constantes y los búferes de textura administrados por el usuario mediante las funciones ID3D10EffectConstantBuffer::SetConstantBuffer y SetTextureBuffer . Después de llamar a estas funciones, el tiempo de ejecución de Effects 10 ya no administra el búfer de constantes o el búfer de texturas y el usuario debe rellenar los datos mediante la interfaz ID3D10Device.
En Efectos 11, también puede hacer que los bloques de estado (estado de mezcla, estado de rasterizador, estado de galería de símbolos de profundidad y estado de muestra) se administren mediante las siguientes llamadas:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Después de llamar a estas funciones, el tiempo de ejecución De efectos 11 ya no administra las variables de bloque de estado y los valores permanecerán sin cambios. Tenga en cuenta que, dado que los bloques de estado son inmutables, el usuario debe establecer un nuevo bloque de estado para cambiar los valores.
También puede revertir los búferes de constantes, los búferes de textura y los bloques de estado al estado no administrado por el usuario. Si desactiva estas variables, el tiempo de ejecución de Effects 11 seguirá actualízándolos cuando sea necesario. Puede usar las siguientes llamadas a variables administradas por el usuario sin establecer:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Efectos Máquina virtual
Se han quitado los efectos de la máquina virtual, que evaluó expresiones complejas fuera de las funciones.
No se admiten los ejemplos siguientes de expresiones complejas:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Se admiten los ejemplos siguientes de expresiones no complejas:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex es una variable uint
- FILTER = i;
- FILTER = ANISOTROPIC;
Estas expresiones pueden aparecer en expresiones de bloque de estado (como FILTER) y pasar expresiones (como SetPixelShader).
Disponibilidad y ubicación de origen
Los efectos 10 se distribuyeron en D3D10.dll. Los efectos 11 se distribuyen como origen, con las soluciones de Visual Studio correspondientes para compilarla. Al crear aplicaciones de tipo efectos, se recomienda incluir el origen Effects 11 directamente en esas aplicaciones.
Puedes obtener Efectos 11 de Efectos para la actualización de Direct3D 11.
Temas relacionados