GLES3.0中文API-glDrawElementsIndirect

名称

glDrawElementsIndirect — 从数组数据中渲染索引基元,并从内存中获取参数

C 规范

void glDrawElementsIndirect( GLenum mode,
GLenum type,
const void *indirect);

参数

mode
指定要渲染的原语类型。接受符号常量GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_LINE_STRIP_ADJACENCY, GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY, GL_TRIANGLES_ADJACENCY, and GL_PATCHES

type
指定绑定到GL_ELEMENT_ARRAY_BUFFER绑定的缓冲区中的数据类型。

indirect
指定包含绘图参数的结构的地址。

描述

glDrawElementsIndirect通过很少的子例程调用来指定多个索引的几何图元。 glDrawElementsIndirect的行为与glDrawElementsInstanced相似,不同之处在于glDrawElementsInstanced的参数存储在内存中的间接指定地址处,并且由相应绘制调用传输的第ith个元素将从每个启用数组的元素索引[i] + baseVertex中获取。如果结果值大于按类型表示的最大值,则好像计算已上转换为32位无符号整数(在溢出条件下自动换行)。如果总和为负,则该操作是不确定的,它还支持为每个索引添加值baseVertex。

间接寻址的参数打包成一个结构(采用C语言):

typedef  struct {
    uint  count;
    uint  instanceCount;
    uint  firstIndex;
    int   baseVertex;
    uint  reservedMustBeZero;
} DrawElementsIndirectCommand;

glDrawElementsIndirect等效于:

void glDrawElementsIndirect(GLenum mode, GLenum type, const void * indirect)
{
    const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    glDrawElementsInstancedBaseVertex(mode,
                                      cmd->count,
                                      type,
                                      cmd->firstIndex * size-of-type,
                                      cmd->instanceCount,
                                      cmd->baseVertex);
}

如果在调用glDrawElementsIndirect时将缓冲区绑定到GL_DRAW_INDIRECT_BUFFER绑定,则将indirect解释为以基本机器单位为该缓冲区的偏移量,并且从缓冲区而不是从客户端内存读取参数数据。

请注意,不支持存储在客户端内存中的索引。如果没有缓冲区绑定到GL_ELEMENT_ARRAY_BUFFER绑定,将生成错误。

如果参数结构的reservedMustBeZero成员为非零,则操作的结果不确定。但是,在这种情况下不会产生错误。

glDrawElementsIndirect返回后,由glDrawElementsIndirect修改的顶点属性具有未指定的值。未修改的属性保持良好定义。

笔记

glDrawElementsInstancedBaseVertex实际上不存在于OpenGL ES中,但用于描述此功能。

GL_LINE_STRIP_ADJACENCY,GL_LINES_ADJACENCY,GL_TRIANGLE_STRIP_ADJACENCY,GL_TRIANGLES_ADJACENCY和GL_PATCHES仅在GL ES版本为3.2或更高版本时可用。

错误

如果mode不被接受,则生成GL_INVALID_ENUM。

如果将GL_VERTEX_ARRAY_BINDING,GL_DRAW_INDIRECT_BUFFER或GL_ELEMENT_ARRAY_BUFFER绑定或任何启用的顶点数组绑定为零,则生成GL_INVALID_OPERATION。

如果命令将源数据超出任何绑定缓冲区对象的末尾,则将生成GL_INVALID_OPERATION。

如果indirect不是基本单位GLuint的大小的倍数,则会生成GL_INVALID_VALUE。

如果几何着色器处于活动状态,并且模式与当前安装的程序对象中的几何着色器的输入基本类型不兼容,则生成GL_INVALID_OPERATION。

API 支持版本

函数名 2.0 3.0 3.1 3.2
glDrawElementsIndirect - -

另见

glDrawArrays, glDrawArraysInstanced, glDrawArraysIndirect, glDrawElements, glDrawRangeElements,

版权

https://www.khronos.org/registry/OpenGL-Refpages/es3/html/glDrawElementsIndirect.xhtml
Copyright © 2010-2019 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. http://opencontent.org/openpub/.

发布了213 篇原创文章 · 获赞 0 · 访问量 758

猜你喜欢

转载自blog.csdn.net/MSK1111/article/details/103093376
今日推荐