На самом деле это два вопроса:
- Что произойдет, если вы используете
packoffset
, в результате чего переменная выходит за пределы одного регистра? - Как вы используете
packoffset
с bool
значениями?
Ответ на первый вопрос: Компилятор HLSL выполнит некоторую проверку значений packoffset
.Поэтому следующее не будет скомпилировано, потому что Var2
не может вписаться в c0
, и компилятор не будет автоматически "оборачивать" его в c1
:
cbuffer SomeBuffer : register( b1 )
{
float3 Var1 : packoffset(c0);
float2 Var2 : packoffset(c0.w); // will not compile
}
Ответ на второй вопрос: bool
значения занимают то же пространство, что и float
, поэтому вы можете упаковать их следующим образом:
cbuffer SomeBuffer : register( b1 )
{
bool SomeBool1 : packoffset(c0);
bool SomeBool2 : packoffset(c0.y);
float SomeFloat1 : packoffset(c0.z);
bool SomeBool3 : packoffset(c0.w);
}