Вопрос
Какое использование имеет спецификатор макета scalar
при доступе к буферу хранения в GL_EXT_scalar_block_layout? (см. ниже, например)
Какой будет вариант использования для scalar
?
Фон
Я недавно запрограммировал простой Raytracer, используя расширение Vulkan и NVidias VkRayTracing и следил за этот урок . В разделе о ближайшем хит-шейдере требуется доступ к некоторым данным, которые хранятся в буферах хранения (с флагами использования vk::BufferUsageFlagBits::eStorageBuffer
).
В шейдере используется расширение GL_EXT_scalar_block_layout
и эти буферы Доступ к ним осуществляется следующим образом:
layout(binding = 4, set = 1, scalar) buffer Vertices { Vertex v[]; } vertices[];
Когда я впервые использовал этот код, слои проверки сказали мне, что структуры, подобные Vertex
, имели недопустимую разметку, поэтому я изменил их, чтобы выровнять каждый элемент по 16-байтовым блокам:
struct Vertex {
vec4 position;
vec4 normal;
vec4 texCoord;
};
с соответствующей структурой в C ++:
#pragma pack(push, 1)
struct Vertex {
glm::vec4 position_1unused;
glm::vec4 normal_1unused;
glm::vec4 texCoord_2unused;
};
#pragma pack(pop)
Ошибки исчезли, и я получил работающий Raytracer. Но я до сих пор не понимаю, почему здесь используется ключевое слово scalar
. Я нашел этот документ , говорящий о GL_EXT_scalar_block_layout-extension, но я действительно не понимаю этого. Возможно я просто не привык к терминологии glsl? Я не вижу причин, по которым мне пришлось бы использовать это.
Также я просто попытался удалить scalar
, и он все еще работал без каких-либо различий, предупреждений или ошибок вообще. Был бы признателен за любые разъяснения или дополнительные ресурсы по этой теме c.