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

std140布局下vec2顺序对齐疑问及UBO-CPU结构体映射问题

std140布局中vec2对齐规则的误区与实际问题分析

你对std140布局的核心规则推导是正确的——这两个GLSL UBO定义在std140布局下的内存布局完全等价,对应的CPU结构体也确实是你所定义的VideoMaterialUBO。你观察到的第二个UBO中textureSize为vec2(0,0)的现象,并非由std140布局规则导致,而是其他代码环节的问题。

明确std140布局规则的验证

假设sizeof(float)=4(N=4),按OpenGL规范逐一推导两个UBO的布局:

  1. 第一个UBO布局:

    • vec2 scale:偏移0,大小8字节,基对齐8字节(符合2N规则)
    • float textureSizeX:前一成员结束位置为8,8是标量基对齐4的倍数,偏移8,大小4字节
    • float textureSizeY:前一成员结束位置为12,12是4的倍数,偏移12,大小4字节
    • 总大小16字节(对齐到最大基对齐8的倍数)
  2. 第二个UBO布局:

    • vec2 scale:偏移0,大小8字节,基对齐8字节
    • vec2 textureSize:前一成员结束位置为8,8是vec2基对齐8的倍数,偏移8,大小8字节
    • 总大小16字节(对齐到最大基对齐8的倍数)

可见两个UBO的内存布局完全一致:scale占据0-7字节,两个float(或vec2的两个分量)占据8-15字节。你的CPU结构体VideoMaterialUBO的内存布局与这两个UBO完全匹配。

排查textureSize为vec2(0,0)的可能原因

既然布局规则上没有问题,你可以从以下方向排查:

  • UBO数据上传错误:确认使用第二个UBO时,是否正确将VideoMaterialUBO的数据上传到绑定点2的UBO中,比如是否调用了glBufferSubData或glMapBuffer并正确写入数据。
  • GLSL代码逻辑错误:检查GLSL中是否正确引用了mat.textureSize,比如是否存在变量名拼写错误、或其他代码逻辑误将其赋值为0。
  • 驱动或编译器异常:极少数情况下旧版GPU驱动可能存在std140布局的实现bug,可尝试更新显卡驱动,或切换到其他GPU测试。
  • 绑定点冲突:确认没有其他UBO或资源占用绑定点2,导致数据被覆盖。

内容的提问来源于stack exchange,提问作者Jean-Michaël Celerier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:45:38