В настоящее время я пытаюсь разобраться с правилами постоянной буферизации в HLSL 5.0 и D3D11.Поэтому я немного поиграл с fxc.exe:
// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.18773
//
//
// Buffer Definitions:
//
// cbuffer testbuffer
// {
//
// float foo; // Offset: 0 Size: 4
// float3x1 bar; // Offset: 4 Size: 12 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name Type Format Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// testbuffer cbuffer NA NA 0 1
Пока что все ведет себя так, как я этого ожидаю.float3x1
имеет размер 12 байтов и поэтому может быть помещен в первый 16-байтовый слот, поскольку переменная before имеет размер 4 байта.После изменения float3x1
на float1x3
вывод компилятора теперь выглядит следующим образом:
// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.18773
//
//
// Buffer Definitions:
//
// cbuffer testbuffer
// {
//
// float foo; // Offset: 0 Size: 4
// float1x3 bar; // Offset: 16 Size: 36 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name Type Format Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// testbuffer cbuffer NA NA 0 1
Таким образом, кажется, что компилятор HLSL внезапно дает каждому float в float1x3
свой собственный 16-байтовый слот, которыйдовольно расточительно.Я много гуглил, чтобы понять это поведение, но ничего не смог найти.Я надеюсь, что некоторые из вас, ребята, могут объяснить это мне, так как это поведение действительно смущает меня.