Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die aktuelle GPU-Hardware unterstützt keine unterschiedlichen Steckplatzinformationen zur Shaderlaufzeit. Schnittstellenverweise können daher nicht innerhalb eines bedingten Ausdrucks geändert werden, z. B. eine If- oder Switch-Anweisung.
Der folgende Shadercode veranschaulicht, wann diese Einschränkung eintritt und ein möglicher alternativer Ansatz.
In Anbetracht der folgenden Schnittstellendeklarationen:
interface A
{
float GetRatio();
bool IsGood();
};
interface B
{
float GetValue();
};
A arrayA[6];
B arrayB[6];
In Anbetracht der folgenden Klassendeklarationen:
class C1 : A
{
float var;
float GetRatio() { return 1.0f; }
bool IsGood() { return true; }
};
class C2 : C1, B
{
float GetRatio() { return C1::GetRatio() * 0.33f; }
float GetValue() { return 5.0f; }
bool IsGood() { return false; }
};
class C3 : B
{
float var;
float GetValue() { return -1.0f; }
};
class C4 : A, B
{
float var;
float GetRatio() { return var; }
float GetValue() { return var * 2.0f; }
bool IsGood() { return var > 0.0f; }
};
Ein Schnittstellenverweis kann nicht innerhalb des bedingten Ausdrucks geändert werden (eine if-Anweisung):
float main() : wicked
{
float rev;
{
A a = arrayA[0];
for( uint i = 0; i < 6; ++i )
{
if( arrayA[i].IsGood() )
{
// This forces the loop to be unrolled,
// since the slot information is changing.
a = arrayA[i];
rev -= arrayA[i-2].GetRatio();
}
else
{
// This causes an error since the compiler is
// unable to determine the interface slot
rev += arrayB[i].GetValue() + a.GetRatio();
}
}
}
return rev;
}
Angesichts der gleichen Schnittstellen- und Klassendeklarationen können Sie einen Index verwenden, um dieselbe Funktionalität bereitzustellen und die erzwungene Schleife nicht zurollen.
float main() : wicked
{
float rev;
{
uint index = 0;
for( uint i = 0; i < 6; ++i )
{
if( arrayA[i].IsGood() )
{
index = i;
rev -= arrayA[i-2].GetRatio();
}
else
{
rev += arrayB[i].GetValue() + arrayA[index].GetRatio();
}
}
}
return rev;
}
Verwandte Themen