C ++ HLSL Буферная переменная

Привет, ребята,

сейчас я просто пытаюсь передать значение в шейдер 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)

Благодарю вас

0

Решение

Проверьте de Dave awnser, возможно, что компилятор создал смещение в переменных struct, чтобы сделать все более быстрым для использования при загрузке процессора. Если прагма не работает, проверьте, используете ли вы альфа-значение непосредственно на этапе пиксельного шейдера, и установите правильно постоянный буфер (постоянный буфер, установленный в вершинном шейдере, не используется в пиксельном шейдере, если вы не используете эффекты).

0

Другие решения

Проблема здесь в том, что 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

1

По вопросам рекламы [email protected]