У меня есть UBO, которое выглядит так:
#version 450
#extension GL_ARB_separate_shader_objects : enable
const uint InstanceCount = 64;
layout(std140, align = 16, binding = 0) uniform UBO
{
vec4 array_indices[InstanceCount];
mat4 proj;
mat4 model;
mat4 models[InstanceCount];
uint selection[128];
} ubo;
и каждый экземпляр вершинного шейдера обращается к одному биту из uint selection[128]
следующим образом:
layout(location = 1) out uint is_selected;
void main() {
uint id = gl_InstanceIndex;
uint num_index = id / 32;
uint bit_index = id % uint(32);
uint n = ubo.selection[num_index];
is_selected = n & (1u << bit_index);
...
}
Проблема в том, что всякий раз, когда id
больше 31 (то есть когда num_index
равно 1 или больше) n
всегда равно нулю. Но RenderDo c показывает, что первые 2 uint
с ubo.selection[128]
являются F0000380 и 0000000F (что означает, что 2nd uint
не ноль), поэтому я предполагаю, что у шейдера есть проблемы с индексацией в массиве, поэтому есть идеи, почему n
равен нулю, если я не индексирую первый элемент массива?
Видеокарта AMD Polaris10.
Структура C ++, которая питает этот UBO:
static const u32 InstanceCount = 64;
struct UBO
{
vkm::vec4 array_indices[InstanceCount];
vkm::mat4 proj;
vkm::mat4 model;
vkm::mat4 models[InstanceCount];
u32 selection[128];
};
vkm::mat4
- класс с плавающей точкой с одним членом arr [16].