我正在研究OpenGL API,我想问你是否可以在将浮点数组传递给OpenGL后删除它。
示例代码:
GLuint VBO;
float *vertices = new float[2];
vertices[0] = 0.0f;
vertices[1] = 1.0f;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
delete[] vertices;
你能告诉我这样做的后果吗?
是的,一点没错。之后glBufferData()
调用返回后,您可以对数据执行任何操作。覆盖它、删除它等等。
结果是 OpenGL 实现要么必须在调用期间立即更新缓冲区(这在某种程度上违背了 OpenGL 喜欢的异步操作方式),要么创建数据的临时副本(出于性能原因,这是不希望的)。
这是调用类似的主要原因glMapBufferRange()
被介绍了。它们避免了在幕后经常发生的额外数据复制glBufferData()
and glBufferSubData()
被使用。如果不小心使用,它们有自己的同步警告。
纹理数据有一个非常相似的情况,其中调用如下glTexImage2D()
通常会导致 OpenGL 实现中数据的额外副本。在这种情况下,性能影响可能会更糟,因为纹理数据通常要大得多。 Apple 为此目的提供了一个扩展(APPLE_客户端_存储),您可以通过承诺在 OpenGL 消耗数据之前保持数据不变来避免额外的副本。
几乎所有以数据指针作为参数的 OpenGL 调用都会消耗数据作为调用的一部分。我能想到的唯一值得注意的例外是glVertexAttribPointer()
在没有 VBO 的情况下使用时。这种用法通常称为“客户端顶点数组”,并且数据在绘制调用期间消耗,这可能在绘制调用之后很长时间glVertexAttribPointer()
称呼。此用法已被弃用,并且在 OpenGL 核心配置文件中不可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)