不正确的Vulkan UniformBuffer内存对齐方式[重复]

问题描述 投票:0回答:1

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::f32glm::uint32声明。

glm::vec3都可以通过简单地将它们声明在glm::f32glm::uint32之上来访问,但是glm::uint32glm::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{};
};
  • positionambientdiffuse在移动后都可以访问它们放在结构的顶部。

我已经设置了#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES,但它似乎不适用于glm::f32glm::uint32以及其他设备。 要使这些变量在统一缓冲区中工作需要做什么?我尝试将alignas(4)alignas(8)alignas(16)alignas(32)放在它们的声明之前,但没有组合起作用。] >

根据规范,在统一缓冲区内声明的变量必须正确对齐。我的结构中包含以下GLM变量:struct UniformBufferObject_PointLights {glm :: ...

c++ vulkan memory-alignment glm-math
1个回答
0
投票

统一缓冲区中的阵列必须按照std140进行对齐,该标准基本上规定了vec4对齐。

© www.soinside.com 2019 - 2024. All rights reserved.