gpt4 book ai didi

c++ - 将结构与 std140 对齐,CPU 端

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:49 25 4
gpt4 key购买 nike

我想这是纯 C++ 问题和 OpenGL 问题之间的一种交叉。我有一个统一的缓冲区,并在其中分配 sizeof(ShaderData) 字节的空间。我在着色器的 GPU 端使用 std140 布局。

根据 std140 规则,我需要在我的结构中的不同位置添加填充,以确保 vector 之类的东西正确对齐。下面的结构是一个例子(对我来说):

struct ShaderData {

float Light_Intensity;
float _pad1[3]; // align following vec3 on 4N boundary
Math::Vec3f Light_Position;
float _pad2; // align following vec4 on 4N boundary
Math::Colour4f Light_Ambient;
Math::Colour4f Light_Diffuse;
Math::Colour4f Light_Specular;
float Light_AttenuationMin;
float Light_AttenuationMax;

} MyShaderData;

这是人们通常在 C++ 中做事的方式,还是有特殊的关键字或编译指示用于对齐结构 CPU 端的单个元素,这些元素更整洁一些?

最佳答案

不,这样只会浪费空间。你必须根据 std140 规则找到优化的布局。

  • float 需要 4 个字节并且它是 4 个字节对齐的
  • vec3 需要 12 个字节,并且它是 16 个字节对齐的
  • vec4 需要 16 个字节并且它是 16 个字节对齐的

这意味着您可以为您的结构找到更好的布局:

float Light_Intensity;          X
float _pad1[3]; XXX
Math::Vec3f Light_Position; XXX
float _pad2; X

如您所见,您浪费了 4 个字节,更糟糕的是您可以执行如下操作:

Math::Vec3f Light_Position      XXX
float Light_Intensity; X

让它对齐并且不需要浪费一个字节。这是可行的,因为 vec3 将与 16 字节边界对齐,而 float 仍将与 4 字节边界对齐。

关于c++ - 将结构与 std140 对齐,CPU 端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com