Привет, ребята,
сейчас я просто пытаюсь передать значение в шейдер hlsl. Теперь вот постоянный буфер в шейдере:
cbuffer ConstantBuffer
{
float4x4 final;
float4x4 rotation; // the rotation matrix
float4 lightvec; // the light's vector
float4 lightcol; // the light's color
float4 ambientcol; // the ambient light's color
float3 SPACE;
float alpha; // <-- Variable trying to recieve, the first 5 works!
}
И в с ++:
struct CBUFFER
{
public:
D3DXMATRIX Final;
D3DXMATRIX Rotation;
D3DXVECTOR4 LightVector;
D3DXCOLOR LightColor;
D3DXCOLOR AmbientColor;
D3DXVECTOR3 SPACE;
float Alpha;
};
Поэтому я попытался выровнять переменные, чтобы можно было отправлять их в пакетах по 16 бит. Но по какой-то причине это не работает, потому что переменная альфа в шейдере не установлена.
Так что я сделал не так? (PS. Я установил ширину буфера при инициализации шейдера: 192)
Благодарю вас
Проверьте de Dave awnser, возможно, что компилятор создал смещение в переменных struct, чтобы сделать все более быстрым для использования при загрузке процессора. Если прагма не работает, проверьте, используете ли вы альфа-значение непосредственно на этапе пиксельного шейдера, и установите правильно постоянный буфер (постоянный буфер, установленный в вершинном шейдере, не используется в пиксельном шейдере, если вы не используете эффекты).
Проблема здесь в том, что bufferwidth должно быть 208 вместо 192.
В этом случае сумма для расчета размера cbuffer равна:
64 (финал float4x4) + 64 (вращение float4x4) + 16 (float4 lightvec) + 16 (float4 lightcol) + 16 (float4 ambientcol) + 16 (float3 SPACE) + 16 (плавающая альфа) = 208 байт
Переменные cbuffer сгруппированы в пакеты по 16 байтов, это означает, что минимальный размер переменной составляет 16 байтов. Вот почему ‘float3 SPACE’ а также «плавать альфа» представляют 16 байтов каждый.
«ConstantBuffer» занимает 13 пакетов по 16 байт (13 * 16 = 208).
Переменные могут быть уплотненный. Ключевое слово «Packoffset» позволяет упаковывать 2, 3 или 4 переменные в один 16-байтовый пакет. В этом случае упаковка ‘float3 SPACE’ а также «плавать альфа» уменьшите размер буфера до 192:
cbuffer ConstantBuffer
{
float4x4 final : packoffset(c0);
float4x4 rotation : packoffset(c4);
float4 lightvec : packoffset(c8);
float4 lightcol : packoffset(c9);
float4 ambientcol : packoffset(c10);
float3 SPACE : packoffset(c11); // 'SPACE' is mapped to the first 12 bytes of the 12th pack.
float alpha : packoffset(c11.w); // 'alpha' is mapped to the last 4 bytes of the 12th pack.
}
Теперь сумма для вычисления размера cbuffer:
64 (финал float4x4) + 64 (вращение float4x4) + 16 (float4 lightvec) + 16 (float4 lightcol) + 16 (float4 ambientcol) + 12 (float3 SPACE) + 4 (плавающая альфа) = 192 байта
а также «ConstantBuffer» занимает 12 пакетов по 16 байт (12 * 16 = 192).
Наконец структура «CBUFFER» должны быть изменены:
struct CBUFFER
{
public:
D3DXMATRIX Final;
D3DXMATRIX Rotation;
D3DXVECTOR4 LightVector;
D3DXCOLOR LightColor;
D3DXCOLOR AmbientColor;
D3DXVECTOR4 SPACE_and_alpha; // SPACE_and_alpha.xyz = SPACE, SPACE_and_alpha.w = alpha
};
больше информации об упаковке: https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx