Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie przedstawiono różnice między efektami 10 i Efekt 11.
Konteksty urządzeń, wątkowanie i klonowanie
Interfejs ID3D10Device został podzielony na dwa interfejsy w trybie Direct3D 11: ID3D11Device i ID3D11DeviceContext. Można utworzyć wiele elementów ID3D11DeviceContexts, aby ułatwić współbieżne wykonywanie w wielu wątkach. Efekty 11 rozszerza tę koncepcję na platformę Effects.
Środowisko uruchomieniowe Effects 11 jest jednowątkowe. Z tego powodu nie należy używać pojedynczego wystąpienia ID3DX11Effect z wieloma wątkami jednocześnie.
Aby użyć środowiska uruchomieniowego Effects 11 w wielu wystąpieniach, należy utworzyć oddzielne wystąpienia ID3DX11Effect. Ze względu na to, że element ID3D11DeviceContext jest również jednowątkowy, należy przekazać różne wystąpienia ID3D11DeviceContext do każdego wystąpienia mającego wpływ na zastosowanie. Można użyć tych oddzielnych kontekstów urządzenia do tworzenia list poleceń, aby wątek renderowania mógł stosować je w bezpośrednim kontekście urządzenia.
Najprostszym sposobem tworzenia wielu efektów, które hermetyzują tę samą funkcjonalność, do użycia w wielu wątkach, jest utworzenie jednego efektu, a następnie utworzenie sklonowanych kopii. Klonowanie ma następujące zalety co do tworzenia wielu kopii od podstaw:
- Rutyna klonowania jest szybsza niż rutyna tworzenia.
- Sklonowany udział efektów utworzył cieniowanie, bloki stanu i wystąpienia klas (więc nie trzeba ich ponownie tworzyć).
- Sklonowane efekty mogą współużytkować stałe.
- Sklonowane efekty zaczynają się od stanu zgodnego z bieżącym efektem (wartości zmiennych, niezależnie od tego, czy został zoptymalizowany).
Aby uzyskać więcej informacji, zobacz Klonowanie efektu.
Pule efektu i grupy
Zdecydowanie najbardziej rozpowszechnionym zastosowaniem pul efektów w direct3D 10 było grupowanie materiałów. Pule efektów zostały usunięte z efektów 11, a grupy zostały dodane, co jest bardziej wydajną metodą grupowania materiałów.
Grupa efektów to po prostu zestaw technik. Aby uzyskać więcej informacji, zobacz Składnia grupy efektu (Direct3D 11).
Rozważ następującą hierarchię efektów z czterema efektami podrzędnymi i jedną pulą efektów:
// 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 { ... }
Te same funkcje można osiągnąć w programie Efekty 11 przy użyciu grup:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Nowe etapy cieniowania
Istnieją trzy nowe etapy cieniowania w trybie Direct3D 11: cieniator kadłuba, cieniator domeny i cieniator obliczeniowy. Efekty 11 obsługują je w podobny sposób do cieniowania wierzchołków, cieniowania geometrii i cieniowania pikseli.
Dodano trzy nowe typy zmiennych do programu Effects 11:
- HullShader
- DomainShader
- ComputeShader
Jeśli używasz tych cieniowania w technice, musisz oznaczyć tę technikę "techniką11", a nie "techniką10". Cieniowania obliczeniowego nie można ustawić w tym samym przekazaniu co jakikolwiek inny stan grafiki (inne cieniowania, bloki stanu lub obiekty docelowe renderowania).
Nowe typy tekstur
Funkcja Direct3D 11 obsługuje następujące typy tekstur:
- AppendStructuredBuffer
- ByteAddressBuffer
- ConsumeStructuredBuffer
- StructuredBuffer
Widoki dostępu nieurządzanego
Efekty 11 obsługują pobieranie i ustawianie nowych nieuporządkowanych typów widoków dostępu. Działa to w podobny sposób jak tekstury.
Rozważmy ten przykład HLSL efektów:
RWTexture1D<float> myUAV;
Tę zmienną można ustawić w języku C++ w następujący sposób:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Funkcja Direct3D 11 obsługuje następujące nieuporządkowane typy widoków dostępu:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Interfejsy i wystąpienia klas
Aby uzyskać informacje o składni interfejsu i klasy, zobacz Interfejsy i klasy.
Aby użyć interfejsów i klas w efektach, zobacz Interfaces and Classes in Effects.
Adresowalny strumień wychodzący
W trybie Direct3D 10 cieniowania geometrii mogą wyprowadzać jeden strumień danych do jednostki wyjściowej strumienia i jednostki rasteryzatora. W trybie Direct3D11 cieniatory geometrii mogą wyprowadzać maksymalnie cztery strumienie danych do jednostki wyjściowej strumienia, a co najwyżej jeden z tych strumieni do jednostki rasterizatora. Funkcja wewnętrzna ConstructGSWithSO została zaktualizowana w celu odzwierciedlenia tej nowej funkcji.
Aby uzyskać więcej informacji, zobacz Stream Out Syntax (Składnia strumienia wychodzącego).
Ustawianie i anulowanie resetowania stanu urządzenia
W programie Effects 10 można tworzyć stałe i tekstur zarządzane przez użytkownika przy użyciu funkcji ID3D10EffectConstantBuffer::SetConstantBuffer i funkcji SetTextureBuffer. Po wywołaniu tych funkcji środowisko uruchomieniowe Effects 10 nie zarządza już buforem stałym ani buforem tekstury, a użytkownik musi wypełnić dane przy użyciu interfejsu ID3D10Device.
W programie Efekty 11 można również ustawić bloki stanu (stan mieszany, stan rasteryzatora, stan wzornika głębokości i stan próbkowania) zarządzane przez użytkownika przy użyciu następujących wywołań:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Po wywołaniu tych funkcji środowisko uruchomieniowe Efekty 11 nie zarządza już zmiennymi bloku stanu, a wartości pozostaną niezmienione. Należy pamiętać, że ponieważ bloki stanu są niezmienne, użytkownik musi ustawić nowy blok stanu, aby zmienić wartości.
Można również przywrócić stałe, tekstury i bloki stanu do stanu zarządzanego przez użytkownika. Jeśli te zmienne nie zostaną zdenerwowany, środowisko uruchomieniowe efektów 11 będzie nadal je aktualizować w razie potrzeby. Następujące wywołania umożliwiają anulowanie ustawienia zmiennych zarządzanych przez użytkownika:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Efekty maszyny wirtualnej
Usunięto efekty maszyny wirtualnej, która oceniała złożone wyrażenia poza funkcjami.
Następujące przykłady złożonych wyrażeń nie są obsługiwane:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Obsługiwane są następujące przykłady niezwiązanych wyrażeń:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex jest zmienną uint
- FILTER = i;
- FILTER = ANISOTROPIC;
Te wyrażenia mogą pojawiać się w wyrażeniach bloków stanu (takich jak FILTER) i wyrażeniach pass (takich jak SetPixelShader).
Dostępność i lokalizacja źródła
Efekty 10 zostały rozłożone w D3D10.dll. Efekty 11 są dystrybuowane jako źródło wraz z odpowiednimi rozwiązaniami programu Visual Studio, aby je skompilować. Podczas tworzenia aplikacji typu efektów zalecamy dołączenie źródła Efektów 11 bezpośrednio do tych aplikacji.
Efekty 11 można uzyskać z efekty dlaAktualizacji Direct3D 11 .
Tematy pokrewne
-
efekty (Direct3D 11)