【问题标题】:How to pass per-instance data (such as positioning) to shader in OpenGL 3.2 with instanced rendering?如何通过实例渲染将每个实例数据(例如定位)传递给 OpenGL 3.2 中的着色器?
【发布时间】:2014-11-15 17:01:18
【问题描述】:

我正在尝试使用实例化渲染来渲染多维数据集。我得到了这个工作,我用 glDrawArraysInstanced 渲染。

但是,我现在想将每个实例的数据(在本例中为定位和颜色)传递给着色器,并且我知道我打算使用函数 glVertexAttribDivisor 来实现这一点。问题是该功能仅在 OpenGL 3.3 及更高版本中可用,而我使用的是 3.2

如何在 OpenGL 3.2 中以正确的方式实现这一点?

【问题讨论】:

  • 我不知道“正确的方式”,但在 GL 3.3 之前,顶点着色器中有 gl_InstanceID,您可以将其用作统一支持的数组的索引缓冲区对象。
  • @AndonM.Coleman 是的,这是一种可能的方法,但是 afaik 统一数组只是静态大小,所以如果我有很多不同数量的对象,那么它就行不通了。还是我错过了什么?
  • 它确实限制了您可以绘制的实例数量,是的。无论您使用什么解决方案,您都会遇到存储限制。或者,您可以使用缓冲区纹理 - 它们允许您存储比 UBO 更多的数据,并且不必提前声明大小。
  • @AndonM.Coleman 嗯,没错,但我想有一个硬编码的限制对我来说似乎很奇怪。使用 GL 3.3 顶点属性方法,似乎没有任何这样的硬编码限制,您只需发送您需要的确切数量。
  • 你有哪个 OpenGL 实现提供 3.2 而不是 3.3?

标签: c++ opengl


【解决方案1】:

可选解决方案:

使用几何着色器渲染点并发射立方体。然后您可以将所有内容打包到一个 VBO 中并避免实例化渲染。

如果需要,使用变换反馈修改多维数据集属性。

【讨论】:

    【解决方案2】:

    我在 3.2 中没有找到一个很好的方法来做我想做的事,所以我更新到 OpenGL 3.3,而不是能够使用 glVertexAttribDivisor 在属性中发送实例数据。

    【讨论】:

    • 这样就好了。如果您有很多实例,几乎总有办法通过一些创意来减小大小。
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2016-11-06
    • 2017-04-17
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多