As per the specification在统一缓冲区内声明的变量必须正确对齐。
我的结构中具有以下GLM变量:
struct UniformBufferObject_PointLights {
glm::f32 constant[64]{};
glm::f32 linear[64]{};
glm::f32 quadratic[64]{};
glm::vec3 position[64]{};
glm::vec3 ambient[64]{};
glm::vec3 diffuse[64]{};
glm::int32 count{};
};
glm::f32
和glm::uint32
声明。glm::vec3
都可以通过简单地将它们声明在glm::f32
和glm::uint32
之上来访问,但是glm::uint32
和glm::f32
仍然不可访问。 至此,我认为这一定是对齐问题。
// After rearrangement.
struct UniformBufferObject_PointLights {
glm::vec3 position[64]{};
glm::vec3 ambient[64]{};
glm::vec3 diffuse[64]{};
glm::f32 constant[64]{};
glm::f32 linear[64]{};
glm::f32 quadratic[64]{};
glm::uint32 count{};
};
position
,ambient
和diffuse
在移动后都可以访问它们放在结构的顶部。我已经设置了#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
,但它似乎不适用于glm::f32
和glm::uint32
以及其他设备。 要使这些变量在统一缓冲区中工作需要做什么?我尝试将alignas(4)
,alignas(8)
,alignas(16)
和alignas(32)
放在它们的声明之前,但没有组合起作用。] >
根据规范,在统一缓冲区内声明的变量必须正确对齐。我的结构中包含以下GLM变量:struct UniformBufferObject_PointLights {glm :: ...
统一缓冲区中的阵列必须按照std140进行对齐,该标准基本上规定了vec4对齐。