我不明白这个命令结构是如何工作的。除了 firstIndex 之外,所有这些似乎都有意义(在文档中;我还没有真正调用过该函数)。实际上,在我看来,文档中好像有错别字。
这是我在寻找相关文档的每个地方似乎都能看到的文字:
但是这些页面没有说明“类型大小”是什么意思,或者为什么将它添加到 firstIndex,而不是说,乘以它。看起来 glDrawElementsInstancedBaseVertexBaseInstance 在那里需要一个字节偏移量,所以我认为 firstIndex 是顶点索引的 GL_ELEMENT_ARRAY_BUFFER 数组的索引 - 因此,索引的索引 - 并且类型的大小为顶点索引的字节大小(比如说 4),您需要在那里将“索引到索引数组”转换为该数组的字节偏移量。
但是......这种转换将被表示为乘法,他们说+而不是*。 :(
我对吗? firstIndex 是顶点索引数组中条目的索引,size-of-type 是顶点索引的字节大小,+ 是错字吗?如果没有,我错过了什么?
最佳答案
这只是 man page 中的一个错字。虽然手册页在官方网站上,但它们不是官方文档。它们经常包含错误或遗漏。
官方文档是规范文档。它确实有乘法而不是加法。来自 OpenGL 4.5 规范的第 353/354 页:
void DrawElementsIndirect( enum mode, enum type, const void *indirect );
typedef struct {
uint count;
uint instanceCount;
uint firstIndex;
int baseVertex;
uint baseInstance;
} DrawElementsIndirectCommand;
if (no element array buffer is bound) {
generate appropriate error
} else {
DrawElementsIndirectCommand *cmd =
(DrawElementsIndirectCommand *)indirect;
DrawElementsInstancedBaseVertexBaseInstance(mode,
cmd->count, type,
cmd->firstIndex * size-of-type,
cmd->instanceCount, cmd->baseVertex,
cmd->baseInstance);
}
所以
firstIndex
几乎是你已经猜到的。它是索引缓冲区(又名元素数组缓冲区)的偏移量,非常类似于 glDrawElements()
的最后一个元素。唯一的小问题是,在这种情况下,偏移量以索引为单位进行测量,而对于 glDrawElements()
则以字节为单位进行测量。这就是 size-of-type
乘法的用武之地。例如,假设您有一个包含
GL_UNSIGNED_SHORT
类型索引的元素数组缓冲区。您希望绘制命令从第 50 个索引开始使用此缓冲区中的索引。对于 glDrawElements()
,您将为最后一个参数传入 100,因为偏移量以字节为单位,并且每个索引为两个字节。对于 firstIndex
中的 glDrawElementsIndirect()
值,您将使用 50,因为它是用索引来衡量的。规范中与 size-of-type
的乘法(在本例中为 2)解释了这种差异,即如果将 firstIndex
设置为 50,则字节偏移量将为 100,因此与用于 glDrawElements()
的偏移量相匹配。关于opengl - 在赋予 glMultiDrawElementsIndirect 的命令结构中,firstIndex 参数是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29248249/