关于OpenGL如何处理这些绘制操作,我有几个问题。


因此,可以说我将OpenGL指针传递给了我的顶点数组。然后,我可以使用索引数组调用glDrawElements。它将使用顶点数组中的那些索引正确绘制所请求的形状吗?
调用glDrawElements之后,我可以再使用另一组索引执行另一个glDawElements调用吗?然后,它将使用原始顶点数组绘制新的索引数组吗?
重做所有这些调用时,OpenGL是否在下一帧保留顶点数据?因此,下一个顶点指针调用会快很多吗?
假设最后三个问题的答案是肯定的,如果我想在每帧多个顶点阵列上执行此操作怎么办?我假设对超过1个顶点数组执行此操作将导致OpenGL从图形内存中删除最后使用的数组,并开始使用新的数组。但是在我的情况下,顶点数组永远不会改变。所以我想知道的是,opengl是否在下次发送顶点数据时将顶点数组保持在万一情况下?如果没有,我可以优化它以允许这样的事情吗?基本上,我想使用索引在顶点之间进行程序绘制而不更新顶点数据,以减少开销并加快复杂的渲染,而渲染需要不断进行程序更改,这些形状将始终使用原始顶点数组中的顶点。这可能还是我只是幻想?
如果我只是幻想着我的第四个问题,那么每帧绘制很多多边形的快速方法有哪些?我是否必须始终传递一组全新的顶点数据才能进行很小的更改?当顶点数据不变时,它是否已经执行了此操作,因为我注意到我无法真正绕过顶点指针调用每一帧。
随意完全抨击我在断言中犯的任何逻辑错误。我正在尝试学习有关opengl如何工作的一切知识,而我目前对它如何工作的假设完全有可能是错误的。

最佳答案

1.所以可以说我将OpenGL指针传递给了我的顶点数组。然后,我可以使用索引数组调用glDrawElements。它将画出
  请求使用顶点数组中的那些索引的形状正确吗?


是。


  2.在调用glDrawElements之后我可以再做一次glDawElements
  用另一组索引调用?然后会绘制新索引吗
  数组使用原始顶点数组?


是。


  3,当我重做时,OpenGL是否在下一帧保留我的顶点数据
  所有这些电话?因此,下一个顶点指针调用将会很多
  快一点


回答这个问题比您可能要棘手得多。您提出这些问题的方式使我假设您使用客户端顶点数组,即您的系统内存中有一些数组,并且让顶点指针直接指向这些顶点数组。在这种情况下,答案是no。 GL无法以任何有用的方式“缓存”该数据。绘制调用完成后,必须假定您可能会更改数据,并且必须比较每一位以确保您没有更改任何内容。

但是,客户端VA并不是在GL中添加VA的唯一方法-实际上,它们已经完全过时,自GL3.0起已弃用,并已从现代OpenGL版本中删除。进行精简的现代方法是使用顶点缓冲区对象,该对象基本上是由GL管理但由用户操纵的缓冲区。缓冲区对象只是一块内存,但是您将需要特殊的GL调用来创建它们,读取或写入或更改数据等等。缓冲区对象很可能不会存储在系统内存中,而是直接存储在VRAM中,这对于反复使用的静态数据非常有用。看看the GL_ARB_vertex_buffer_object extension spec,它在2003年最初引入了该功能,并成为GL 1.5的核心。


  4,假设最后三个问题的答案是肯定的,如果我想
  每帧在多个顶点数组上执行此操作?我假设
  任何超过1个顶点阵列上的像素都会导致OpenGL删除
  图形存储器中最后使用的阵列,并开始使用新的阵列。但
  就我而言,顶点数组永远不会改变。所以我想要
  知道opengl下次是否可以保留我的顶点数组
  我发送它的顶点数据会是相同的数据吗?如果没有办法
  我可以优化它以允许这样的事情吗?基本上我想
  使用索引在顶点之间按程序绘制而不进行更新
  顶点数据,以减少开销并加快复杂度
  需要不断改变程序形状的渲染
  将始终使用原始顶点数组中的顶点。这是
  可能还是我只是幻想?


VBO正是您在这里寻找的东西。


  5,如果我只是幻想着我的第四个问题,那有什么好处
  每帧绘制大量多边形的快速方法,其中只有一个
  少数会改变吗?我是否总是需要传递一套全新的
  顶点数据是否有很小的变化?反正它已经做到了吗
  当顶点数据不变时,因为我注意到我无法真正得到
  围绕顶点指针调用每个帧。


您也可以仅更新VBO的一部分。但是,如果您有许多随机分布在缓冲区中的小部分,可能会变得效率低下,更新连续(子)区域会更有效。但这只是一个话题。

关于c++ - OpenGL-带glDrawElements的索引绘制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23187695/

10-15 17:22