我不明白这个命令结构是如何工作的。除了 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/

10-13 05:25