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

GLSL std140布局困惑:C++与GLSL结构体对齐不符合规则疑问

关于std140布局下C++与GLSL结构体对齐的疑问

我在通过uniform buffer将C++结构体传递给GLSL着色器时,遇到了对齐规则的困惑:代码能正常工作,但看起来不符合我理解的std140布局要求,想搞清楚原因。

我的C++结构体定义如下:

struct PerFrameData
{
    glm::mat4 CameraViewProjection{};
    glm::vec3 CameraWorldPosition{};
    float TotalTime;
} frameData{};

测试后发现各成员的偏移量分别是:

  • CameraViewProjection:0字节
  • CameraWorldPosition:64字节
  • TotalTime:76字节
    结构体总大小为80字节,对齐方式为4字节。

我所了解的std140布局规则包括:

  • 标量类型按4字节对齐
  • vec2按8字节对齐
  • vec3和vec4按16字节对齐
  • mat3和mat4的每一行/列按16字节对齐
  • 数组元素按元素大小向上取整到16字节的偏移对齐

按照这个规则,我原本认为vec3 CameraWorldPosition后面应该补上4字节的填充,让float TotalTime对齐到16字节的偏移位置(也就是80字节处),但实际情况是不添加填充代码才能正常工作,添加填充后反而出问题,这让我搞不懂哪里理解错了。

对应的GLSL着色器代码如下:

layout(std140, binding = 1) uniform PerFrameBuffer
{
    mat4 CameraViewProjection;
    vec3 CameraWorldPosition;
    float TotalTime;
};

请问我是不是对std140规则的某个细节理解有误?

内容的提问来源于stack exchange,提问作者Bruno Perković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:01:23