Skillnader mellan effekter 10 och effekter 11

Det här avsnittet visar skillnaderna mellan Effekter 10 och Effekter 11.

Enhetskontexter, trådning och kloning

Gränssnittet ID3D10Device har delats upp i två gränssnitt i Direct3D 11: ID3D11Enhet och ID3D11EnhetKontext. Du kan skapa flera ID3D11DeviceContexts för att underlätta samtidig körning på flera trådar. Effekt 11 utökar det här konceptet till ramverket Effekter.

Effekt 11-körningen är enkeltrådad. Därför bör du inte använda en enda ID3DX11Effect-instans med flera trådar samtidigt.

Om du vill använda Effects 11-körningen på flera instanser måste du skapa separata ID3DX11Effect-instanser. Eftersom ID3D11DeviceContext också är enkeltrådad bör du skicka olika ID3D11DeviceContext-instanser till varje effektinstans på Apply. Du kan använda dessa separata enhetskontexter för att skapa kommandolistor så att återgivningstråden kan tillämpa dem i den omedelbara enhetskontexten.

Det enklaste sättet att skapa flera effekter som kapslar in samma funktioner, för användning på flera trådar, är att skapa en effekt och sedan göra klonade kopior. Kloning har följande fördelar jämfört med att skapa flera kopior från grunden:

  1. Kloningsrutinen är snabbare än skapanderutinen.
  2. Klonade effekter delar skapade skuggningar, tillståndsblock och klassinstanser (så att de inte behöver återskapas).
  3. Klonade effekter kan dela konstanta buffertar.
  4. Klonade effekter börjar med tillstånd som matchar den aktuella effekten (variabelvärden, oavsett om den har optimerats eller inte).

Mer information finns i Kloning av en effekt.

Effektpooler och grupper

Den överlägset vanligaste användningen av effektpooler i Direct3D 10 var för gruppering av material. Effektpooler har tagits bort från Effekter 11 och grupper har lagts till, vilket är en effektivare metod för att gruppera material.

En effektgrupp är helt enkelt en uppsättning tekniker. Mer information finns i Effect Group Syntax (Direct3D 11).

Överväg följande effekthierarki med fyra underordnade effekter och en effektpool:

// 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 { ... }

Du kan uppnå samma funktioner i Effekter 11 med hjälp av grupper:

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

Nya skuggningssteg

Det finns tre nya skuggningssteg i Direct3D 11: hull shader, domain shader och compute shader. Effekter 11 hanterar dessa på ett liknande sätt som hörnskuggor, geometriskuggare och pixelskuggor.

Tre nya variabeltyper har lagts till i Effekter 11:

  • HullShader
  • DomainShader
  • ComputeShader

Om du använder dessa skuggningar i en teknik måste du märka den tekniken "teknik11" och inte "teknik10". Beräkningsskuggningen kan inte anges i samma pass som andra grafiktillstånd (andra skuggningar, tillståndsblock eller återgivningsmål).

Nya strukturtyper

Direct3D 11 stöder följande strukturtyper:

Osorterade åtkomstvyer

Effekt 11 har stöd för att hämta och ange de nya osorterade åtkomstvytyperna. Detta fungerar på ett liknande sätt som texturer.

Tänk på det här HLSL-exemplet för effekter:

  
RWTexture1D<float> myUAV;

Du kan ange den här variabeln i C++ på följande sätt:

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11 stöder följande osorterade åtkomstvytyper:

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Gränssnitt och klassinstanser

För gränssnitts- och klasssyntax, se Gränssnitt och klasser.

Mer information om hur du använder gränssnitt och klasser i effekter finns i -gränssnitt och klasser i Effekter.

Adresserbar ström ut

I Direct3D 10 kan geometriskuggare mata ut en dataström till strömutdataenheten och rastreringsenheten. I Direct3D11 kan geometriskuggare mata ut upp till fyra dataströmmar till strömutdataenheten och högst en av dessa strömmar till rastreringsenheten. ConstructGSWithSO- inbyggd har uppdaterats för att återspegla den här nya funktionen.

Mer information finns i Stream Out Syntax.

Ange och avaktivera enhetstillstånd

I Effekter 10 kan du göra konstanta buffertar och strukturbuffertar användarhanterade med hjälp av ID3D10EffectConstantBuffer::SetConstantBuffer och SetTextureBuffer funktioner. När du har anropat dessa funktioner hanterar Inte längre Effects 10-körningen den konstanta bufferten eller strukturbufferten och användaren måste fylla data med hjälp av gränssnittet ID3D10Enhet.

I Effekter 11 kan du också göra tillståndsblocken (blandningstillstånd, rastreringstillstånd, djupstenciltillstånd och exempeltillstånd) användarhanterade med hjälp av följande anrop:

När du har anropat dessa funktioner hanterar Inte längre effects 11-körningen tillståndsblockvariablerna, och det finns värden som förblir oförändrade. Observera att eftersom tillståndsblock är oföränderliga måste användaren ange ett nytt tillståndsblock för att ändra värdena.

Du kan också återställa konstanta buffertar, strukturbuffertar och tillståndsblock till det icke-användarhanterade tillståndet. Om du tar bort de här variablerna fortsätter körningen för Effekt 11 att uppdatera dem vid behov. Du kan använda följande anrop för att ta bort användarhanterade variabler:

Effekter virtuell dator

Effekterna för den virtuella datorn, som utvärderade komplexa uttryck utanför funktioner, har tagits bort.

Följande exempel på komplexa uttryck stöds inte:

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i );
  3. FILTER = i + 2;

Följande exempel på icke-komplexa uttryck stöds:

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex är en uint-variabel
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Dessa uttryck kan visas i tillståndsblockuttryck (till exempel FILTER) och passuttryck (till exempel SetPixelShader).

Källtillgänglighet och plats

Effekter 10 distribuerades i D3D10.dll. Effekter 11 distribueras som källa, med motsvarande Visual Studio-lösningar för att kompilera den. När du skapar program av effekttyp rekommenderar vi att du inkluderar källan Effects 11 direkt i dessa program.

Du kan hämta effekter 11 från effekter för Direct3D 11 Update.

effekter (Direct3D 11)