计算着色器中的数组值无效?
Invalid array values in compute shader?
我使用一个缓冲区来传递我的 C++ 结构
struct Node {
Node(int size, glm::ivec3 position);
bool isEmpty();
int getSubIndex(const glm::ivec3& vec);
void divide(std::vector<Node> &nodes);
void setColor(glm::vec4 color);
int getSubNodeIndex(const glm::ivec3& vec);
int getSubNodeIndex(int subIndex);
glm::ivec4 position;
glm::vec4 color;
int halfSize;
int sub;
int leaf;
};
在着色器中看起来像这样
struct Node {
vec4 position;
vec4 color;
int data[3];
};
layout(std430, binding=4) readonly buffer Octree_data {
Node nodes[];
};
在计算的过程中,我发现数组的所有元素(除了第一个元素)都有不正确的数据(很可能被置换了),我会犯什么错误?
您的 Node
结构所需的 std430
对齐是 16 字节。这是因为它包含 16-byte-aligned 类型(vec4
和 ivec4
)。因此,Node
数组中的每个数组元素都必须从 16 字节边界开始。所以 nodes
的数组步幅必须是 48.
您的 Node
结构的 C++ 对齐方式可能是 4 个字节。这是因为 在 C++ 的布局 中,您的 Node
结构不需要更高的对齐。 GLM 的 4 元素向量类型是 4 字节对齐的(或者更确切地说,它们是 float
对齐的,几乎总是 4 字节)。这意味着 sizeof(Node)
将是 44 个字节,数组跨度也是如此。
如果您希望您的 C++ 结构匹配 GLSL 所需的布局,您需要正确对齐它:
struct Node {
Node(int size, glm::ivec3 position);
bool isEmpty();
int getSubIndex(const glm::ivec3& vec);
void divide(std::vector<Node> &nodes);
void setColor(glm::vec4 color);
int getSubNodeIndex(const glm::ivec3& vec);
int getSubNodeIndex(int subIndex);
alignas(16) glm::ivec4 position;
alignas(16) glm::vec4 color;
int halfSize;
int sub;
int leaf;
};
我使用一个缓冲区来传递我的 C++ 结构
struct Node {
Node(int size, glm::ivec3 position);
bool isEmpty();
int getSubIndex(const glm::ivec3& vec);
void divide(std::vector<Node> &nodes);
void setColor(glm::vec4 color);
int getSubNodeIndex(const glm::ivec3& vec);
int getSubNodeIndex(int subIndex);
glm::ivec4 position;
glm::vec4 color;
int halfSize;
int sub;
int leaf;
};
在着色器中看起来像这样
struct Node {
vec4 position;
vec4 color;
int data[3];
};
layout(std430, binding=4) readonly buffer Octree_data {
Node nodes[];
};
在计算的过程中,我发现数组的所有元素(除了第一个元素)都有不正确的数据(很可能被置换了),我会犯什么错误?
您的 Node
结构所需的 std430
对齐是 16 字节。这是因为它包含 16-byte-aligned 类型(vec4
和 ivec4
)。因此,Node
数组中的每个数组元素都必须从 16 字节边界开始。所以 nodes
的数组步幅必须是 48.
您的 Node
结构的 C++ 对齐方式可能是 4 个字节。这是因为 在 C++ 的布局 中,您的 Node
结构不需要更高的对齐。 GLM 的 4 元素向量类型是 4 字节对齐的(或者更确切地说,它们是 float
对齐的,几乎总是 4 字节)。这意味着 sizeof(Node)
将是 44 个字节,数组跨度也是如此。
如果您希望您的 C++ 结构匹配 GLSL 所需的布局,您需要正确对齐它:
struct Node {
Node(int size, glm::ivec3 position);
bool isEmpty();
int getSubIndex(const glm::ivec3& vec);
void divide(std::vector<Node> &nodes);
void setColor(glm::vec4 color);
int getSubNodeIndex(const glm::ivec3& vec);
int getSubNodeIndex(int subIndex);
alignas(16) glm::ivec4 position;
alignas(16) glm::vec4 color;
int halfSize;
int sub;
int leaf;
};