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.
Klonowanie efektu tworzy drugą, prawie identyczną kopię efektu. Zapoznaj się z następującym pojedynczym kwalifikatorem, aby uzyskać wyjaśnienie, dlaczego nie jest to dokładne. Druga kopia efektu jest przydatna, gdy chcesz użyć struktury efektów na wielu wątkach, ponieważ środowisko uruchomieniowe efektu nie jest bezpieczne wątkowo, aby utrzymać wysoką wydajność.
Ponieważ konteksty urządzeń również nie są bezpieczne wątkowo, różne wątki powinny przekazywać różne konteksty urządzeń do metody ID3DX11EffectPass::Apply.
Efekt można sklonować przy użyciu następującej składni:
ID3DX11Effect* pClonedEffect = NULL;
UINT Flags = D3DX11_EFFECT_CLONE_FORCE_NONSINGLE;
HRESULT hr = pEffect->CloneEffect( Flags, &pClonedEffect );
W powyższym przykładzie sklonowana kopia będzie hermetyzować ten sam stan co efekt oryginalny, niezależnie od stanu, w jakim znajduje się oryginalny efekt. W szczególności:
- Jeśli narzędzie pEffect jest zoptymalizowane, efekt pCloned jest zoptymalizowany
- Jeśli funkcja pEffect ma pewne zmienne zarządzane przez użytkownika, efekt pCloned będzie miał te same zmienne zarządzane przez użytkownika (zobacz pojedynczy opis poniżej)
- Wszystkie oczekujące zmiany zmiennych (do momentu, aż wywołanie Apply zaktualizuje stan urządzenia) dla pEffect będą oczekujące dla pClonedEffect.
Następujące obiekty urządzeń Direct3D 11 są niezmienne lub nigdy nie są aktualizowane przez strukturę efektów, więc sklonowany efekt będzie wskazywać na te same obiekty co oryginalny efekt:
- Obiekty blokowe stanu (ID3D11BlendState, ID3D11RasterizerState, ID3D11DepthStencilState, ID3D111SamplerState)
- Shadery
- Instancje klas
- Tekstury (z wyłączeniem buforów tekstur)
- Widoki dostępu nieuporządkowanego
Następujące obiekty urządzeń Direct3D 11 są zarówno niezmienne, jak i modyfikowane przez środowisko uruchomieniowe efektu, chyba że są zarządzane przez użytkownika lub występują pojedynczo w sklonowanym efekcie; nowe kopie tych obiektów są tworzone, gdy nie są używane pojedynczo.
- Bufory stałe
- Bufory tekstur
Pojedyncze bufory stałe i bufory tekstur
Należy pamiętać, że ta dyskusja dotyczy zarówno buforów stałych, jak i tekstur, ale dla uproszczenia odczytu zakłada się bufory stałe.
Mogą wystąpić przypadki, w których bufor stały jest aktualizowany tylko przez jeden wątek, ale stan urządzenia ustawiony przez sklonowane efekty będzie używać tych danych. Na przykład główny efekt może zaktualizować macierze świata i widoku, które są odwoływane z shaderów w sklonowanych efektach, które nie modyfikują macierzy świata i widoku. W takich przypadkach sklonowane efekty muszą odwoływać się do bieżącego buforu stałego zamiast tworzenia nowego.
Istnieją dwa sposoby osiągnięcia tego żądanego wyniku:
- Użyj ID3DX11EffectConstantBuffer::SetConstantBuffer na sklonowanym efekcie, aby uczynić go zarządzanym przez użytkownika
- Oznacz stały bufor jako "pojedynczy" w kodzie HLSL, wymuszając środowisko uruchomieniowe efektu, aby traktowało go jako zarządzany przez użytkownika po sklonowaniu.
Istnieją dwie różnice między dwiema powyższymi metodami. Najpierw, w metodzie 1, zostanie utworzony nowy ID3D11Buffer i używany, zanim zostanie wywołane polecenie SetConstantBuffer. Ponadto po wywołaniu metody UndoSetConstantBuffer w sklonowanym efekcie zmienna w metodzie 1 spowoduje wskazanie nowo utworzonego buforu (co spowoduje aktualizację w metodzie Apply), podczas gdy zmienna w metodzie 2 będzie nadal wskazywać oryginalny bufor (nie aktualizując go w metodzie Apply).
Zobacz następujący przykład w programie HLSL:
cbuffer ObjectData
{
float4 Position;
};
single cbuffer ViewData
{
float4x4 ViewMatrix;
};
Podczas klonowania sklonowany efekt spowoduje utworzenie nowego identyfikatora ID3D11Buffer dla obiektu ObjectData i wypełnienie jego zawartości w obszarze Zastosuj, ale odwołuje się do oryginalnego identyfikatora ID3D11Buffer dla parametru ViewData. Kwalifikator pojedynczy można zignorować w procesie klonowania, ustawiając flagę D3DX11_EFFECT_CLONE_FORCE_NONSINGLE.
Tematy pokrewne
-
Efekty (Direct3D 11)