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.
Istnieje wiele sposobów używania klas i interfejsów w efekty 11. Aby uzyskać informacje o składni interfejsu i klasy, zobacz Interfejsy i klasy.
W poniższych sekcjach opisano sposób określania wystąpień klas do cieniowania, który używa interfejsów. W przykładach użyjemy następującego interfejsu i klas:
interface IColor
{
float4 GetColor();
};
class CRed : IColor
{
float4 GetColor() { return float4(1,0,0,1); }
};
class CGreen : IColor
{
float4 GetColor() { return float4(0,1,0,1); }
};
CRed pRed;
CGreen pGreen;
IColor pIColor;
IColor pIColor2 = pRed;
Należy pamiętać, że wystąpienia interfejsu mogą być inicjowane do wystąpień klas. Tablice wystąpień klasy i interfejsu są również obsługiwane i można je zainicjować, jak w poniższym przykładzie:
CRed pRedArray[2];
IColor pIColor3 = pRedArray[1];
IColor pIColorArray[2] = {pRed, pGreen};
IColor pIColorArray2[2] = pRedArray;
Jednolite parametry interfejsu
Podobnie jak w przypadku innych jednolitych typów danych, w wywołaniu CompileShader należy określić jednolite parametry interfejsu. Parametry interfejsu można przypisać do wystąpień interfejsu globalnego lub wystąpień klas globalnych. Po przypisaniu do wystąpienia interfejsu globalnego cieniowanie będzie mieć zależność od wystąpienia interfejsu, co oznacza, że musi być ustawione na wystąpienie klasy. Po przypisaniu do wystąpień klas globalnych kompilator specjalizuje się w cieniowaniu (podobnie jak w przypadku innych jednolitych typów danych) do używania tej klasy. Jest to ważne w przypadku dwóch scenariuszy:
- Cieniowanie z obiektem docelowym 4_x może używać parametrów interfejsu, jeśli te parametry są jednolite i przypisane do wystąpień klasy globalnej (więc nie jest używane połączenie dynamiczne).
- Użytkownicy mogą zdecydować się na posiadanie wielu skompilowanych, wyspecjalizowanych cieniowania bez linków dynamicznych lub kilku skompilowanych cieniowania z połączeniem dynamicznym.
float4 PSUniform( uniform IColor color ) : SV_Target
{
return color;
}
technique11
{
pass
{
SetPixelShader( CompileShader( ps_4_0, PSUniform(pRed) ) );
}
pass
{
SetPixelShader( CompileShader( ps_5_0, PSUniform(pIColor2) ) );
}
}
Jeśli pIColor2 pozostaje niezmieniony za pośrednictwem interfejsu API, poprzednie dwa przebiegi są funkcjonalnie równoważne, ale pierwszy używa ps_4_0 cieniowania statycznego, podczas gdy drugi używa cieniowania ps_5_0 z połączeniem dynamicznym. Jeśli pIColor2 zostanie zmieniony za pomocą interfejsu API efektów (zobacz Ustawianie wystąpień klas poniżej), zachowanie cieniowania pikseli w drugim przebiegu może ulec zmianie.
Parametry interfejsu nieumundurowego
Niestandardowe parametry interfejsu tworzą zależności interfejsu dla cieniowania. Podczas stosowania cieniowania z parametrami interfejsu te parametry muszą być przypisane za pomocą wywołania BindInterfaces. Wystąpienia interfejsu globalnego i wystąpienia klasy globalnej można określić w wywołaniu BindInterfaces.
float4 PSAbstract( IColor color ) : SV_Target
{
return color;
}
PixelShader pPSAbstract = CompileShader( ps_5_0, PSAbstract(pRed) );
technique11
{
pass
{
SetPixelShader( BindInterfaces( pPSAbstract, pRed ) );
}
pass
{
SetPixelShader( BindInterfaces( pPSAbstract, pIColor2 ) );
}
}
Jeśli pIColor2 pozostaje niezmieniony za pośrednictwem interfejsu API, poprzednie dwa przebiegi są funkcjonalnie równoważne, a oba używają połączenia dynamicznego. Jeśli pIColor2 zostanie zmieniony za pomocą interfejsu API efektów (zobacz Ustawianie wystąpień klas poniżej), zachowanie cieniowania pikseli w drugim przebiegu może ulec zmianie.
Ustawianie wystąpień klas
Podczas ustawiania cieniowania z dynamicznym połączeniem cieniowania z urządzeniem Direct3D 11 należy również określić wystąpienia klas. Jest to błąd ustawiania takiego cieniowania z wystąpieniem klasy NULL. W związku z tym wszystkie wystąpienia interfejsu, do których odwołuje się cieniowanie, muszą mieć skojarzone wystąpienie klasy.
W poniższym przykładzie pokazano, jak uzyskać zmienną wystąpienia klasy z efektu i ustawić ją na zmienną interfejsu:
ID3DX11EffectPass* pPass = pEffect->GetTechniqueByIndex(0)->GetPassByIndex(1);
ID3DX11EffectInterfaceVariable* pIface = pEffect->GetVariableByName( "pIColor2" )->AsInterface();
ID3DX11EffectClassInstanceVariable* pCI = pEffect->GetVariableByName( "pGreen" )->AsClassInstance();
pIface->SetClassInstance( pCI );
pPass->Apply( 0, pDeviceContext );
// Apply the same pass with a different class instance
pCI = pEffect->GetVariableByName( "pRedArray" )->GetElement(1)->AsClassInstance();
pIface->SetClassInstance( pCI );
pPass->Apply( 0, pDeviceContext );
Tematy pokrewne
-
efekty (Direct3D 11)