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 部分中有更多相关信息。
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 部分中有更多相关信息。