gpt4 book ai didi

opengl - uint64_t 类型数组的 UBO 填充

转载 作者:行者123 更新时间:2023-12-02 08:05:31 35 4
gpt4 key购买 nike

我有以下情况。在一个数组中包含 4 个 uint64_t 的 UBO 结构。

  struct MaterialData{
uint64_t comps[4];
};
layout (std140, binding = 0) uniform MaterialBlock {
MaterialData data[50];
}material;

问题是,只有 index = 0 给我正确的数据。但是如果我更改为 uint64_t 的 GLSL 内置类型向量,一切正常:

  struct MaterialData{
u64vec4 textures;
};

它肯定与 std140 的填充规则有关。这就是 OpenGL 4.5 specs。说:

If the member is an array of scalars or vectors, the base alignment and array stride are set to match the base alignment of a single array element, according to rules (1), (2), and (3), and rounded up to the base alignment of a vec4. The array may have padding at the end; the base offset of the member following the array is rounded up to the next multiple of the base alignment.

所以我从这部分明白了

the base alignment and array stride are set to match the base alignment of a single array element

每个数组的成员对齐是成员的大小,即8个字节。虽然这不是很清楚。实际上它不起作用。我可以与u64vec4相处,但我想知道如何填充uint64_t 数组?

最佳答案

你错过了关键短语:

and rounded up to the base alignment of a vec4

这意味着 64 位整数数组的步长与 vec4 的对齐方式相同:16。因此,数组中的 64 位整数有 8 个字节的有用数据,然后是 8 个字节的填充,后跟下一个元素。

因此,在 C++ 中,等效数组必须类似于:

struct 64_bit_array_element
{
std::uint64_t value;
std::uint8_t padding[8];
};

struct UBO
{
64_bit_array_element comps[4];
};

当然,这非常浪费。处理此问题的更好方法是使用 u64vec2s 数组。

或者您可以只使用 SSBO 和 std430 布局,规范中的违规行不适用。

关于opengl - uint64_t 类型数组的 UBO 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51917802/

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