Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 e ID3D11DeviceContext. Puede crear varios ID3D11DeviceContexts para facilitar la ejecución simultánea en varios subprocesos. Efectos 11 extiende 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 De efectos 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 creados, bloques de estado e instancias de clase (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, independientemente de si se ha optimizado o no).
Consulte Clonación de un efecto para obtener más información.
Grupos de efectos y grupos
Con seguridad, el uso más frecuente de los 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. Consulte sintaxis del 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 controlan estos 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:
- AppendStructuredBuffer
- byteAddressBuffer de
- consumeStructuredBuffer
- structuredBuffer
Vistas de acceso desordenadas
Los efectos 11 admiten la obtención y configuración de los nuevos tipos de vista de acceso sin ordenar. 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 sin ordenar:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Interfaces e instancias de clase
Para obtener información sobre la interfaz y la sintaxis de clase, consulte interfaces y clases .
Para usar interfaces y clases en efectos, vea interfaces y clases de en Efectos.
Flujo direccionable
En Direct3D 10, los sombreadores de geometría podrían generar una secuencia 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 en la unidad de salida de flujo y, como máximo, uno de esos flujos a la unidad de rasterizador. El ConstructGSWithSO intrínseco se ha actualizado para reflejar esta nueva funcionalidad.
Consulte de sintaxis de stream out para obtener más información.
Configuración y desconfiguración del estado del dispositivo
En Efectos 10, podría crear búferes de constantes y búferes de textura administrados por el usuario mediante las funciones de ID3D10EffectConstantBuffer::SetConstantBuffer y SetTextureBuffer. Después de llamar a estas funciones, el tiempo de ejecución De efectos 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 runtime 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 búferes de constantes, búferes de textura y bloques de estado al estado no administrado por el usuario. Si desconfigura estas variables, el entorno de ejecución De efectos 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 de la 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 = ANISOTRÓPICO;
Estas expresiones podrían aparecer en expresiones de bloque de estado (como FILTER) y expresiones de paso (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 correspondientes de Visual Studio para compilarla. Al crear aplicaciones de tipo efectos, se recomienda incluir el origen Efectos 11 directamente en esas aplicaciones.
Puedes obtener Efectos 11 de Efectos para Direct3D 11 Update.
Temas relacionados
-
efectos de (Direct3D 11)