【问题标题】:checking gpu for VBO existence检查 gpu 是否存在 VBO
【发布时间】:2012-11-22 09:05:30
【问题描述】:

我有一个(预制的)Opengl 顶点缓冲区对象(VBO)
但我不知道在 opencl 中提交它是 GLuint 值..

是否在任何 opengl 库(如 glew)中进行检查,以向我提供当前在 gpu 上的现有 VBO 及其相应的 GLuint(或任何类似的东西……因为我只知道数据输入中的元素数量)数组和数组大小)

编辑: 为什么我不知道 GLuint ...

它是cinema4d opengl api中的一个函数(必须使用这个函数来访问cinema4d VBO)..这个函数(或者我应该说很多类函数)会自动做这样的事情

allocSubBuffer ...与 *pBuffer(面向对象的 C++) mapBuffer ..返回 void *pData 然后将此 *pData 转换为向量 *pvData 然后将数组值传递给该 *pvData 然后取消映射缓冲区... 在这之后有一个叫做 pFactory 的东西...它会自动分配一个新的 VBO ...

【问题讨论】:

  • 不确定,但可能没有。只是也许与 glGet
  • "任何 opengl 库(如 glew)" OpenGL 是一个 API 规范,而不是一个特定的库。 GLEW 只是一个使 OpenGL API 的扩展功能更易于访问的包装器。

标签: c++ opengl gpgpu


【解决方案1】:

但我不知道它的 GLuint 值

那么你如何使用来自 OpenGL 的 VBO?你也必须在 OpenGL 中 glBindBuffer 它。 OpenGL 对象 ID 很宝贵,请妥善保管它们。

创建一个 OpenGL 对象而不记住它的名字就像用newmalloc 分配一些内存然后扔掉指针:浪费内存。

【讨论】:

  • @MohamedSakrAboYoucuf:那么在这种情况下,您甚至无法确定是否存在 VBO。从外观上看,您所做的只是将一些数据传递给 Cinema4D,它将保留在其内部结构中,也许它将用于 VBO,但它也可能不会,或合并它与其他数据到单个大 VBO。但是你为什么要关心呢?只需创建您自己的 VBO 或使用 OpenCL API 将数据传递给 OpenCL。
  • 好吧,我想做一个实时流体模拟,这种模拟的主要瓶颈是内存传输速度……我可以在 opencl 中做到……传输到 cpu,但是帧速率会下降戏剧性地...想使用 opengl VBO 来更快地访问数据
  • @MohamedSakrAboYoucuf:Cinema4D 很可能不仅在 GPU 端使用这些数据进行渲染,还在 CPU 端用于其他事情。所以数据会以一种或另一种方式通过 CPU←→GPU 瓶颈。您在 CPU 端为 Cinema4D 提供缓冲区这一事实就足以说明问题。这是我的建议:在 GPU 上使用 OpenCL 进行流体模拟,读回结果,将其交给 Cinema4D 并让其完成它的工作。你不知道 API 背后的黑匣子里发生了什么,不要试图智取它。
  • @MohamedSakrAboYoucuf:渲染数据的额外 GPU→CPU→GPU 往返是你必须咬住的子弹,直到 Cinema4D 的开发人员真正为 GPU API 互操作提供了一个健全的接口。跨度>
【解决方案2】:

也许 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &buf) 会为您解决问题。 IE。您以某种方式强制cinema4d 绑定缓冲区,然后查询当前绑定的缓冲区ID。

【讨论】:

  • 问题是,您根本不知道 Cinema4D 是否使用了 VBO。如果是这样,如果缓冲区只包含该数据,或者它是否已被多路复用或放在其他数据之间。 Cinema4D 在这方面是一个黑匣子,应该这样对待。
  • 我想这个问题根本没有好的(通用)解决方案。所以我们陷入了两难境地:根本没有解决方案或肮脏的黑客行为。所以这是肮脏的黑客,但谁在乎它是否能完成任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2020-08-12
  • 2019-01-12
  • 2018-06-17
相关资源
最近更新 更多