Verschillen tussen effecten 10 en effecten 11
In dit onderwerp worden de verschillen tussen effecten 10 en effecten 11 weergegeven.
Apparaatcontexten, threading en klonen
De interface ID3D10Device is opgesplitst in twee interfaces in Direct3D 11: ID3D11Device en ID3D11DeviceContext. U kunt meerdere ID3D11DeviceContexts maken om gelijktijdige uitvoering op meerdere threads te vergemakkelijken. Effecten 11 breidt dit concept uit naar het effectenframework.
De Effecten 11-runtime is één threaded. Daarom moet u niet één ID3DX11Effect-exemplaar met meerdere threads tegelijk gebruiken.
Als u de Effecten 11-runtime op meerdere exemplaren wilt gebruiken, moet u afzonderlijke ID3DX11Effect-exemplaren maken. Omdat de ID3D11DeviceContext ook één thread is, moet u verschillende ID3D11DeviceContext-exemplaren doorgeven aan elk effectexemplaren op Toepassen. U kunt deze afzonderlijke apparaatcontexten gebruiken om opdrachtlijsten te maken, zodat de renderingthread deze kan toepassen op de directe apparaatcontext.
De eenvoudigste manier om meerdere effecten te maken die dezelfde functionaliteit inkapselen, voor gebruik op meerdere threads, is door één effect te maken en vervolgens gekloonde kopieën te maken. Klonen heeft de volgende voordelen ten opzichte van het maken van meerdere kopieën:
- De kloonroutine is sneller dan de creatieroutine.
- Gekloonde effecten delen gemaakte shaders, statusblokken en klasse-exemplaren (zodat ze niet opnieuw hoeven te worden gemaakt).
- Gekloonde effecten kunnen constante buffers delen.
- Gekloonde effecten beginnen met de status die overeenkomt met het huidige effect (variabele waarden, ongeacht of het is geoptimaliseerd).
Zie Een effect klonen voor meer informatie.
Groepen en groepen effect
Verreweg het meest voorkomende gebruik van effectgroepen in Direct3D 10 was voor groeperingsmaterialen. Effectgroepen zijn verwijderd uit Effecten 11 en groepen zijn toegevoegd, wat een efficiëntere methode is om materialen te groeperen.
Een effectgroep is gewoon een set technieken. Zie Syntaxis van effectgroep (Direct3D 11) voor meer informatie.
Houd rekening met de volgende effecthiërarchie met vier onderliggende effecten en één effectgroep:
// 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 { ... }
U kunt dezelfde functionaliteit in Effecten 11 bereiken met behulp van groepen:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Nieuwe arceringsfasen
Er zijn drie nieuwe arceringsfasen in Direct3D 11: de schaduw van de romp, domein-shader en compute-shader. Effecten 11 verwerkt deze op een vergelijkbare manier als hoekpunt-shaders, geometrie-shaders en pixel-shaders.
Er zijn drie nieuwe variabeletypen toegevoegd aan Effecten 11:
- HullShader
- DomainShader
- ComputeShader
Als u deze shaders in een techniek gebruikt, moet u die techniek 'technique11' en niet 'technique10' labelen. De compute-shader kan niet worden ingesteld in dezelfde pas als een andere grafische status (andere shaders, statusblokken of renderdoelen).
Nieuwe patronentypen
Direct3D 11 ondersteunt de volgende patronentypen:
Niet-geordende Access-weergaven
Effecten 11 ondersteunt het verkrijgen en instellen van de nieuwe niet-geordende toegangsweergavetypen. Dit werkt op een vergelijkbare manier als patronen.
Bekijk dit HLSL-voorbeeld van effecten:
RWTexture1D<float> myUAV;
U kunt deze variabele als volgt instellen in C++:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 ondersteunt de volgende niet-geordende toegangsweergavetypen:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Interfaces en klasse-exemplaren
Zie Interfaces en klassenvoor interface- en klassesyntaxis.
Zie Interfaces en klassen in effectenvoor het gebruik van interfaces en klassen in effecten.
Adresseerbare stream uit
In Direct3D 10 konden geometrie-shaders één gegevensstroom naar de stroomuitvoereenheid en de rasterizer-eenheid uitvoeren. In Direct3D11 kunnen geometrie-shaders maximaal vier gegevensstromen uitvoeren naar de stroomuitvoereenheid en ten hoogste één van deze stromen naar de rasterizer-eenheid. De ConstructGSWithSO intrinsiek is bijgewerkt om deze nieuwe functionaliteit weer te geven.
Zie Stream Out Syntax voor meer informatie.
Apparaatstatus instellen en de apparaatstatus opheffen
In Effecten 10 kunt u constant buffers en bitmapbuffers maken die door de gebruiker worden beheerd met behulp van de functies ID3D10EffectConstantBuffer::SetConstantBuffer en SetTextureBuffer. Nadat u deze functies hebt aangeroepen, beheert de Effecten 10-runtime de constante buffer of bitmapbuffer niet meer en moet de gebruiker de gegevens vullen met behulp van de ID3D10Device-interface.
In Effecten 11 kunt u ook de statusblokken (blend state, rasterizer state, depth-stencil state en sampler state) door de gebruiker laten beheren met behulp van de volgende aanroepen:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Nadat u deze functies hebt aangeroepen, beheert de Effecten 11-runtime de variabelen van het statusblok niet meer en blijven er waarden ongewijzigd. Omdat statusblokken onveranderbaar zijn, moet de gebruiker een nieuw statusblok instellen om de waarden te wijzigen.
U kunt ook constante buffers, bitmapbuffers en statusblokken terugzetten naar de niet-door de gebruiker beheerde status. Als u deze variabelen opheffen, blijft de runtime Effecten 11 deze zo nodig bijwerken. U kunt de volgende aanroepen gebruiken om door de gebruiker beheerde variabelen op te heffen:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Effecten van virtuele machine
De virtuele machine met effecten, die complexe expressies buiten functies evalueert, is verwijderd.
De volgende voorbeelden van complexe expressies worden niet ondersteund:
- Set PixelShader( myPSArray( i * 3 + j ) );
- Set PixelShader( myPSArray( (float)i );
- FILTER = i + 2;
De volgende voorbeelden van niet-complexe expressies worden ondersteund:
- Set PixelShader( myPS );
- Set PixelShader( myPS[i] );
- Set PixelShader( myPS[ uIndex ] ); uIndex is een uint-variabele
- FILTER = i;
- FILTER = ANISOTROPIC;
Deze expressies kunnen worden weergegeven in expressies voor statusblokken (zoals FILTER) en pass-expressies (zoals Set PixelShader).
Beschikbaarheid en locatie van bron
Effecten 10 werd gedistribueerd in D3D10.dll. Effects 11 wordt gedistribueerd als bron, met bijbehorende Visual Studio-oplossingen om deze te compileren. Wanneer u effectentypetoepassingen maakt, wordt u aangeraden de effecten 11-bron rechtstreeks in deze toepassingen op te nemen.
U kunt Effecten 11 ophalen uit Effecten voor Direct3D 11 Update.
Verwante onderwerpen