Требования к выравниванию буфера в Direct3D11

Что (или где задокументировано, я обнаружил только некоторые расплывчатые фрагменты в MSDN, такие как «включая любую упаковку, если необходимо» и «… значение ByteWidth D3D11_BUFFER_DESC, кратное 16») — это ожидаемое выравнивание / заполнение Direct3D11 различных применений ID3D11Buffer (например, вершинные и постоянные буферы)?

Например, когда вы используете D3D11_APPEND_ALIGNED_ELEMENT для входного макета для использования с вершинным шейдером, каковы ожидания для выравнивания? Первоначально я думал, что любые типы векторов захотят быть выровненными по 16 байтов, но, похоже, это не так. На самом деле, кажется, что на самом деле даже нет ожидания выравнивания для всего этого, по крайней мере, за 4 байта для типа с плавающей запятой (не пытались заставить компилятор неправильно выравнивать единственный примитив).

например

D3D11_INPUT_ELEMENT_DESC inputDesc[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
//Seems to expect something like
struct Vertex
{
float float float
float float float float
float float
};
//Rather than
__declspec(slign(16)) struct Vertex
{
float float float padding
float float float float
float float padding padding
};
//HLSL
struct Input
{
float4 pos : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
};

В случае констант есть даже D3D11_INPUT_ELEMENT_DESC, но все еще остается вопрос обеспечения соответствия структурного объявления HLSL и C ++ …

1

Решение

Вы подходите к этому не с того конца. Вы никогда не должны пытаться жестко кодировать макеты ввода в своем коде C ++ — это просто кошмар обслуживания, потому что вам придется менять его каждый раз, когда вы меняете шейдер, а когда у вас достаточно шейдеров, становится просто нереально жестко кодировать каждый один.

Вместо этого загляните в D3DReflect API:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd607334%28v=vs.85%29.aspx

По сути, вы можете проверить скомпилированный шейдер и прочитать макет ввода непосредственно с него, а не указывать его вручную. Вы также можете прочитать входные имена, и с этим вы можете динамически создавать буфер вершин только с теми значениями, которые нужны шейдеру.

1

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector