我无法理解 std140 布局中的 vec2 对齐和偏移规则:
我从规则的阅读中预计 “如果成员是一个二分量或四分量向量,其分量消耗 N 个基本机器单元,则基本对齐分别为 2N 或 4N。”
那个
layout(std140, binding = 2) uniform material_t {
vec2 scale;
float textureSizeX;
float textureSizeY;
} mat;
和
layout(std140, binding = 2) uniform material_t {
vec2 scale;
vec2 textureSize;
} mat;
相当于:
我期望我的CPU端结构
struct VideoMaterialUBO
{
float scale[2];
float textureSize[2];
};
static_assert(sizeof(VideoMaterialUBO) == 4 * sizeof(float));
清晰地映射到这两种情况。
唉,这不是我观察到的:我看到
VideoMaterialUBO
对应于我发布的第一个 UBO - 如果我使用第二个 UBO 定义,textureSize == vec2(0,0)
。
我的问题实际上与布局无关,而是与我的统一成员的
textureSize
名称有关,由于与 GLSL 函数的名称冲突,该名称实际上被着色器堆栈的下层在 _textureSize
中进行了文本替换