如何通过实例渲染将每个实例数据(例如定位)传递给 OpenGL 3.2 中的着色器?

Posted

技术标签:

【中文标题】如何通过实例渲染将每个实例数据(例如定位)传递给 OpenGL 3.2 中的着色器?【英文标题】:How to pass per-instance data (such as positioning) to shader in OpenGL 3.2 with instanced rendering? 【发布时间】: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? 【参考方案1】:

可选解决方案:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

这样就好了。如果您有很多实例,几乎总有办法通过一些创意来减小大小。

以上是关于如何通过实例渲染将每个实例数据(例如定位)传递给 OpenGL 3.2 中的着色器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Vue 实例传递给嵌套组件

AngularJs 将 HTML 中每个 ng-repeat 的实例传递给指令

如何通过 Python/C API 将 Python 实例传递给 C++

如何将数据(json)传递给vue实例

如何将AWS实例的详细信息传递给jenkins作业,以便该作业在实例中ssh和执行

将刀片文件中的数据直接传递给 Vue 实例