【发布时间】:2019-11-28 11:46:26
【问题描述】:
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{};
};
- 尝试从着色器行为中访问任何变量
好像它们的值都是 0。问题集中在
glm::f32和glm::uint32声明。
只需在glm::f32 和glm::uint32 上方声明即可访问glm::vec3,但是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) 放在它们的声明之前,但没有组合有效。
【问题讨论】:
标签: c++ vulkan memory-alignment glm-math