gpt4 book ai didi

c++ - 传递由 glDrawElementsIndirect 使用的间接绘图命令时,如何确保 C++ 和 OpenGL 之间的正确结构字段对齐?

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

glDrawElementsIndirect、glDrawArraysIndirect、glMultiDrawElementsIndirect 等的文档对必须提供给它们的命令的结构这样说:

The parameters addressed by indirect are packed into a structure that takes the form (in C):

typedef  struct {
uint count;
uint instanceCount;
uint firstIndex;
uint baseVertex;
uint baseInstance;
} DrawElementsIndirectCommand;

当表示顶点的结构被上传到 OpenGL 时,它不仅作为数据 block 发送到那里——还有像 glVertexAttribFormat() 这样的调用告诉 OpenGL 在结构中的何处查找属性数据。但据我通过阅读文档等可以看出,这些间接绘图命令不会发生类似情况。相反,我想,你只需像上面那样用 C++ 编写你的绘图命令结构,然后通过 glBufferData 等发送它。

我正在使用的 OpenGL header 声明类型,例如 GLuint,因此我想我可以确信我的命令结构中的整数将具有正确的大小和正确的格式。但是字段的对齐方式和结构的大小呢?看来我只需要相信 OpenGL 就可以准确地期待我发送的内容——从我读到的内容来看,理论上这可能会因我使用的编译器而异。这是否意味着,从技术上讲,我只需要期待我会走运,让我的 C++ 编译器只选择 OpenGL 和/或我的图形驱动程序和/或我的图形硬件期望的结构格式?还是这里有一些我没有掌握的成功保证?

(请注意,我并不是真的担心这个。我使用的是一个非常普通的编译器,并计划以普通硬件为目标,所以我希望它在实践中可能“正常工作”。我我主要只是好奇什么在这里会被认为是严格正确的。)

最佳答案

它是一个缓冲区对象(准确地说是DRAW_INDIRECT_BUFFER);它应该包含该结构的连续数组。如您所述,正确的类型是 GLuint。这始终是 32 位无符号整数类型。您可能会在 OpenGL 规范或扩展中看到它被称为 uint,但请理解,在 C 语言绑定(bind)中,您应该将 GL 添加到任何此类类型名称。

您通常不会在桌面平台上在此数据结构上遇到对齐问题,因为每个字段都是 32 位标量。 GPU 可以获取任何 4 字节边界上的那些,这是编译器将此结构中的每个字段对齐的内容。如果你在某处扔了一个 ubyte,那么你需要担心,但你当然会使用错误的数据结构。

因此,在 GL 方面只有一个要求,即该结构的开头必须在字对齐边界上开始。这意味着在调用 glDrawElementsIndirect (...) 时,只有 4 的倍数的地址(偏移量)才有效。任何其他地址都将产生 GL_INVALID_OPERATION

关于c++ - 传递由 glDrawElementsIndirect 使用的间接绘图命令时,如何确保 C++ 和 OpenGL 之间的正确结构字段对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250910/

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