You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Push Constant Block成员值出现异常偏移问题咨询

问题分析与解决方案

你的问题出在Push Constant布局规则的误解以及padding位置错误,以下是具体原因和修复方案:

核心原因

  1. 布局规则不匹配:在Vulkan中,Push Constant默认采用std430布局,而非你假设的std140。你的GLSL代码未显式指定布局,实际按std430解析,但你按std140添加了多余padding,导致内存对齐错位。
  2. std140数组padding理解错误:即使强制使用std140,标量数组的padding是每个元素之间补位(保证元素步长为16字节),而非在数组末尾补位。你的C结构体在数组后加padding的方式完全错误。

修复方案

方案一:使用std430布局(推荐,更高效)

这是Vulkan Push Constant的默认布局,无需额外padding,和C语言默认数组布局一致。

修改GLSL代码(可显式指定std430,也可省略,默认就是):

layout(push_constant, std430) uniform PC {
    vec4 value1;
    vec4 value2;
    uint values[2];
    uint value3;
    uint value4;
} pc;

对应的C结构体移除多余padding:

struct PC {
    float value1[4];
    float value2[4];
    uint32_t values[2];
    uint32_t value3;
    uint32_t value4;
};

方案二:强制使用std140布局

如果你必须用std140,需要修正padding的位置:

修改GLSL代码显式指定std140:

layout(push_constant, std140) uniform PC {
    vec4 value1;
    vec4 value2;
    uint values[2];
    uint value3;
    uint value4;
} pc;

对应的C结构体需要在数组元素之间补位(保证每个uint元素的起始地址间隔16字节):

struct PC {
    float value1[4];
    float value2[4];
    uint32_t values[2];
    uint32_t pad_between_values[3]; // 12字节padding,让values[1]对齐到16字节边界
    uint32_t value3;
    uint32_t value4;
    uint32_t pad_end[2]; // 可选,保证整个结构体对齐到vec4边界
};

或者更直观的拆分写法:

struct PC {
    float value1[4];    // 偏移0-15
    float value2[4];    // 偏移16-31
    uint32_t values0;   // 偏移32-35(对应GLSL的values[0])
    uint32_t pad0[3];   // 偏移36-47(12字节补位)
    uint32_t values1;   // 偏移48-51(对应GLSL的values[1])
    uint32_t pad1[3];   // 偏移52-63(12字节补位)
    uint32_t value3;    // 偏移64-67
    uint32_t value4;    // 偏移68-71
};

为什么会出现你的问题

当GLSL默认用std430时,values[2]是连续的两个uint,占8字节(偏移32-39),value3从偏移40开始。但你的C结构体在数组后加了8字节padding(偏移40-47),导致C结构体的value3从偏移48开始,对应到GLSL中偏移40的位置正好是C结构体的padding1__[0],所以读取到的是padding的值,而非预期的value3。

内容的提问来源于stack exchange,提问作者Jim Morrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:55:26