当前位置: 首页 > 知识库问答 >
问题:

OpenGL(ES 2.0但不特定于ES):GL\u STATIC\u DRAW是否用于glBufferData?

劳英华
2023-03-14

我现在关注的应用程序是3d模型查看器。用户偶尔会加载一个大的新网格进行渲染,旧网格可以(必须)扔掉。

因此,GL\u STATIC\u DRAW显然是VBO的正确提示。

在这一点上,我有点不确定是要glDeleteBuffers()我的VBO和IBO,也是glDeleteVertexArray[OES]()我的VAO,还是什么都不做,只是glBufferData()VBO和IBO与我新加载的网格,而无需删除和重新生成任何内容或重新定义glVertexAttribPointerVAO状态。(子问题:如果我只删除我的VBO,然后重新生成它,但我保持我的VAO完好无损,我还能跳过glVertexAttribPointer()吗?)

如果我调用glBufferData()时,OpenGL确实会丢弃VBO中以前的数据,那么这就完美了。据我所知,glBufferData()应该重新分配VBO。

但实际上,我想要的是一个具体的解释,说明我重新加载到这个洋葱的不同层之间会有什么不同,以及如果我只想更改应用程序中的顶点和索引缓冲区内容(原始几何体),或者如果存在可能需要重新生成或删除VBO的情况,我需要走多远。我确实看到同一个VBO可能在不同的VAO集之间有用地共享,我可以想象这样一种情况:你有一些VAO,你永远不会再使用,所以你会取消分配它们,但如果存在API供你重新分配其中包含的数据,VBO似乎可以继续回收。

我发现所有的教程和解释都只是帮助你设置东西,但现在我已经了解了这个阶段,还不太清楚如何正确处理其余的细节。

共有1个答案

方飞鸣
2023-03-14

我不知道为什么你认为删除顶点数组对象会对缓冲区对象的内容产生任何影响。删除FBO不会影响附加到它的纹理或渲染缓冲区的存储,删除VAO也不会影响附加到它的任何缓冲区对象的存储。

就标准而言,你可以做你喜欢的事情。提示就是提示;你不需要遵循它们。

就AMD而言,你仍然可以做任何你喜欢的事。原因是,由于人们不理解提示是如何工作的,人们已经做了任何他们喜欢的事情,以至于AMD几乎完全忽略了提示。它将观察缓冲区对象的使用模式,并将其四处移动,直到您确定实际打算如何使用它。

NVIDIA实际上关心这些提示,并让您坚持使用它们。在某种程度上,这些提示定义得足够好,足以让你坚持下去。如果使用错误的提示,性能将永远下降。而AMD最终会明白你真正的意思。

在任何情况下,如果您想真正遵守提示,GL\u STATIC\u DRAW的意思是“您将只上载一次到此缓冲区对象”。现在,如何协调缓冲区对象的重新分配取决于您。

然而,如果您想猜测ARB的观点,请考虑最近的ARB_buffer_storage4.4特性。在那里,他们明确禁止完全重新分配缓冲区对象的存储(不管暗示如何)。您可以将其视为“暗示”,即重新分配存储(除了使用glBufferData使现有缓冲区无效之外)是个坏主意,不管您使用什么使用暗示。

此外,从buffer\u存储中,GL\u STATIC\u DRAW的“等价物”禁止您从客户端存储上传到它。一旦它存在,您可以从其他缓冲区复制到它,或者将其用作总账流程的其他目的地。但你不能改变它的内容。您只能删除它。

我认为这是一个暗示,GL\u STATIC\u DRAW的意思是“删除,不要重新分配或重新上传到”

现在,这对OpenGL ES意味着什么,我无法理解。这取决于不同的实现如何实现其缓冲区的存储(这就是为什么询问桌面GL和GL ES实现的行为是错误的)。然而,考虑到移动GPU通常没有两个独立的内存池,我想他们真的不在乎。当然,一个实现可以将内存分配为未缓存的或其他方式,以便更快地访问它。但除此之外,这可能无关紧要。

 类似资料:
  • 问题内容: 我一直在做一个Android教程,遇到了一个包含以下内容的类: 是一种按类型继承的形式吗?还是我应该了解的其他Java语法? 该类是: 问题答案: 这称为 泛型 。内的类和是一个 类型参数 。 用一个例子最容易解释: 一个可以存储项目。如果您这样指定类型参数:那么此数组列表将仅存储类型的项(换句话说,将仅存储s)! 同样,也通过类型“参数化”。将可能包含一个值,该值将与指定类型的和,而

  • 问题内容: 我有HTC魔术(已扎根并闪烁到android 2.3.4-ginger yoshi1.5)。正如在android文档中所述,android 2.2支持opengl es 2.0,我想使用opengl es 2.0制作一个应用程序。但是ConfigurationInfo.reqGlEsVersion返回0x10001,即。OpenGL 1.1。所以我想知道对设备的opengl es 2.

  • 在我的呈现器类上: 函数在呈现器类中更改坐标: 当我移动手指时,没有线,只有一条移动的小线...我怎样才能画出整条线,并在我不断移动手指的同时保持线描?当我再次触屏时,也开始新的一行。

  • OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_Q

  • 本文向大家介绍java基于OpenGL ES实现渲染实例,包括了java基于OpenGL ES实现渲染实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java基于OpenGL ES实现渲染的方法。分享给大家供大家参考。具体如下: 1. Run.java文件: 2. GlRenderer.java文件: 希望本文所述对大家的java程序设计有所帮助。

  • 我有一个带有/api文件夹的MVC项目,其中包含我的Web api控制器。我想要以下东西: < li >我的MVC站点在发生错误时提供自定义错误页面 < li >我的Web API提供默认错误响应(包含异常和堆栈跟踪的JSON/XML) 在我的MVC站点的web.config中,我有一个http错误节点,并将errorMode设置为“自定义”,以便在浏览MVC站点期间发生404s/500s/等时可