2011-01-17 9 views
3

Кто-нибудь знает, как использовать «пакетный набор» с типом bool в DirectX10/11? Я не знаю, как это должно быть выровненыDirectX11 и packetoffset

cbuffer SomeBuffer : register(b1) 
{ 
    float3 SomeFloat3: packoffset(c0); 
    float SomeFloat: packoffset(c0.w); 

    float3 SomeFloat32: packoffset(c1); 
    float2 SomeFloat2; ?? 

    bool SomeBool1; ?? 
    bool SomeBool2; ?? 
    bool SomeBool3; ?? 
} 
+0

просто не упаковывайте его. это не обязательно. –

+0

Я знаю, что это не обязательно, но я хочу знать, как это делается. – jack

ответ

2

Это на самом деле два вопроса:

  1. Что произойдет, если вы используете packoffset, что приводит к переменной, простирающейся за пределы единого реестра?
  2. Как вы используете 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); 
}