Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma ukazuje rozdíly mezi efekty 10 a efekty 11.
Kontexty zařízení, vlákna a klonování
Rozhraní ID3D10Device bylo rozděleno do dvou rozhraní v Direct3D 11: ID3D11Device a ID3D11DeviceContext. Můžete vytvořit více ID3D11DeviceContexts pro usnadnění souběžného spouštění na více vláknech. Efekty 11 tento koncept rozšiřují na architekturu Effects.
Modul runtime Effects 11 je jednovláknový. Z tohoto důvodu byste neměli současně používat jednu instanci ID3DX11Effect s více vlákny.
Pokud chcete použít modul runtime Effects 11 na více instancích, musíte vytvořit samostatné instance ID3DX11Effect. Vzhledem k tomu, že ID3D11DeviceContext je také jednovláknové, měli byste předat různé instance ID3D11DeviceContext každé instanci efektu při použití. Pomocí těchto samostatných kontextů zařízení můžete vytvářet seznamy příkazů, aby je vlákno vykreslování bylo možné použít v kontextu okamžitého zařízení.
Nejjednodušší způsob, jak vytvořit více efektů, které zapouzdřují stejné funkce, pro použití ve více vláknech, je vytvořit jeden efekt a pak naklonovat kopie. Klonování má oproti vytváření více kopií od začátku následující výhody:
- Rutina klonování je rychlejší než rutina vytváření.
- Klonované efekty sdílejí vytvořené shadery, bloky stavu a instance tříd (takže je nemusíte znovu vytvářet).
- Klonované efekty můžou sdílet konstantní vyrovnávací paměti.
- Klonované efekty začínají stavem, který odpovídá aktuálnímu efektu (hodnoty proměnných, ať už jsou optimalizované).
Další informace najdete v tématu Klonování efektu.
Fondy a skupiny efektů
Zdaleka nejrozšířenější použití fondů efektů v Direct3D 10 bylo pro seskupování materiálů. Z efektů 11 byly odebrány fondy efektů a byly přidány skupiny, což je efektivnější metoda seskupení materiálů.
Skupina efektů je jednoduše sada technik. Další informace najdete v syntaxe skupiny efektů (Direct3D 11).
Zvažte následující hierarchii efektů se čtyřmi podřízenými efekty a jedním fondem efektů:
// 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 { ... }
Stejné funkce v efektech 11 můžete dosáhnout pomocí skupin:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Nové fáze shaderu
Direct3D 11 má tři nové fáze shaderu: shader trupu, shader domény a výpočetní shader. Efekty 11 je zpracovává podobným způsobem jako shadery vrcholů, geometrické shadery a shadery pixelů.
Do efektů 11 byly přidány tři nové typy proměnných:
- TrupuShader
- DomainShader
- ComputeShader
Pokud tyto shadery použijete v technice, musíte tuto techniku označovat "technique11" a nikoli "technique10". Výpočetní shader nelze nastavit ve stejném průchodu jako jakýkoli jiný grafický stav (jiné shadery, bloky stavu nebo cíle vykreslení).
Nové typy textur
Direct3D 11 podporuje následující typy textur:
Neuspořádané zobrazení aplikace Access
Efekty 11 podporují získání a nastavení nových neuspořádaných typů zobrazení přístupu. Funguje to podobným způsobem jako textury.
Představte si tento příklad HLSL efektů:
RWTexture1D<float> myUAV;
Tuto proměnnou můžete v jazyce C++ nastavit následujícím způsobem:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 podporuje následující neuspořádané typy zobrazení přístupu:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Rozhraní a instance tříd
Informace o syntaxi rozhraní a tříd naleznete v tématu Rozhraní a třídy.
Informace o použití rozhraní a tříd v efektech naleznete v tématu Rozhraní a třídy v efektech.
Adresovatelný stream out
V Režimu Direct3D 10 můžou shadery geometrie vyvést jeden datový proud do výstupní jednotky datového proudu a rastrovou jednotku. V Direct3D11 můžou shadery geometrie výstupovat až čtyři datové proudy do výstupní jednotky datového proudu a maximálně jeden z těchto datových proudů do rasterizační jednotky. Funkce ConstructGSWithSO byla aktualizována tak, aby odrážela tuto novou funkci.
Další informace najdete v tématu Syntaxe stream out.
Nastavení a zrušení resetování stavu zařízení
V efektech 10 můžete vytvořit konstantní vyrovnávací paměti a vyrovnávací paměti textury spravované uživatelem pomocí funkcí ID3D10EffectConstantBuffer::SetConstantBuffer a SetTextureBuffer funkcí. Po volání těchto funkcí modul runtime Effects 10 už nespravuje konstantní vyrovnávací paměť nebo vyrovnávací paměť textury a uživatel musí vyplnit data pomocí rozhraní ID3D10Device.
V efektech 11 můžete také vytvořit bloky stavu (stav blendu, stav rasterizátoru, stav podrobného vzorníku a stav vzorkovníku) spravované pomocí následujících volání:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Po volání těchto funkcí modul runtime Effects 11 už nespravuje proměnné bloku stavu a hodnoty zůstanou beze změny. Všimněte si, že vzhledem k tomu, že bloky stavu jsou neměnné, musí uživatel nastavit nový blok stavu, aby změnil hodnoty.
Můžete také vrátit konstantní vyrovnávací paměti, vyrovnávací paměti textury a bloky stavu do stavu neuživatelského spravovaného stavu. Pokud tyto proměnné nenasadíte, modul runtime Effects 11 je bude v případě potřeby dál aktualizovat. K zrušení nastavení proměnných spravovaných uživatelem můžete použít následující volání:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Efekty virtuálního počítače
Odebrali jsme efekty virtuálního počítače, který vyhodnotil složité výrazy mimo funkce.
Následující příklady složitých výrazů se nepodporují:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Podporují se následující příklady nesložitých výrazů:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex je proměnná uint.
- FILTER = i;
- FILTER = ANISOTROPNÍ;
Tyto výrazy se můžou objevit ve výrazech bloku stavu (například FILTER) a předávacích výrazech (například SetPixelShader).
Dostupnost zdroje a umístění
Účinky 10 byly distribuovány v D3D10.dll. Efekty 11 se distribuují jako zdroj s odpovídajícími řešeními sady Visual Studio, která je zkompilují. Při vytváření aplikací typu efekty doporučujeme zahrnout přímo do těchto aplikací zdroj Effects 11.
Efekty 11 můžete získat z Effects for Direct3D 11 Update.
Související témata