GLSL:std140 中的顺序 vec2 对齐?

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

我无法理解 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;

相当于:

  • N = sizeof(浮点数)
  • 比例偏移量为 0,大小为 2 * N
  • textureSize 的偏移量为 8,大小为 2 * N,alignement = 2 * N,并且由于 8 == 2 * sizeof(float),所以所有内容都整齐地排列在一起。

我期望我的CPU端结构

struct VideoMaterialUBO
{
  float scale[2];
  float textureSize[2];
};
static_assert(sizeof(VideoMaterialUBO) == 4 * sizeof(float));

清晰地映射到这两种情况。

唉,这不是我观察到的:我看到

VideoMaterialUBO
对应于我发布的第一个 UBO - 如果我使用第二个 UBO 定义,
textureSize == vec2(0,0)

c++ glsl std140
1个回答
0
投票

我的问题实际上与布局无关,而是与我的统一成员的

textureSize
名称有关,由于与 GLSL 函数的名称冲突,该名称实际上被着色器堆栈的下层在
_textureSize
中进行了文本替换

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