UBO 及其在 Vulcan 中的阵营

UBOs and their alignments in Vulkan

struct Light {

   glm::vec4 position;
   glm::vec4 color;
   glm::vec4 attenuation;

};

struct UBO {

   // View and projection matrix
   glm::mat4 view;
   glm::mat4 proj;

   // Fog
   glm::vec4 skyColor;
   float density;
   float gradient;

   // Clipping plane
   glm::vec4 clippingPlane;

   // Lights
   Light lights[4];

};

Vulkan API:

UBO 结构在每一帧更新,然后通过统一缓冲区传递给顶点着色器。 渲染图像颜色错误,因为光阵列未正确传递。

顶点着色器绑定:

layout (binding = 1) uniform UBO {

    // View and projection matrix
    mat4 view;
    mat4 proj;

    // Fog
    vec4 skyColor;
    float density;
    float gradient;

    // Clipping plane
    vec4 clippingPlane;

    // Lights
    Light lights[4];

} ubo;

我需要以某种方式对齐数据吗?

来自规范:

标准统一缓冲区布局

OpTypeStruct成员类型的'base alignment'递归定义如下:

  • 大小为 N 的标量具有 N 的基本对齐。

  • 一个双分量向量,分量大小为 N,基本对齐为 2 N。

  • 一个三分量或四分量向量,分量大小为 N,基本对齐为 4 N。

  • 数组的基本对齐方式等于其元素类型的基本对齐方式,四舍五入为 16 的倍数。

  • 一个结构的碱基比对等于其任何成员的最大碱基比对,四舍五入为 16 的倍数。

  • C 列的行主矩阵的基本对齐方式等于 C 矩阵分量向量的基本对齐方式。

  • 列优先矩阵的基本对齐方式等于矩阵列类型的基本对齐方式。

GLSL 中的 std140 布局满足这些规则。

在规范的 14.5.4. Offset and Stride Assignment 部分中有更多相关信息。