【问题标题】:Alternative to glMultiDrawArrays when using uniform stride?使用统一步幅时替代 glMultiDrawArrays?
【发布时间】:2013-03-19 21:29:55
【问题描述】:

背景:我正在开发一个应用程序,该应用程序主要绘制一个巨大的节点和边的 3D 图。节点绘制为实例立方体,而边缘使用GL_LINE 绘制,并使用几何着色器扩展为由三角形条带构成的 3D 体积“线”。目前,每次重绘边缘时,我都会执行此扩展。但是,由于我的图形是完全静态的(节点不能移动,因此边缘也不能移动),我认为我只需要将 GL_LINE 定义扩展为三角形条带一次,将扩展的顶点捕获到缓冲区中(使用 Tranform Feedback ),然后从那一点开始,使用glMutliDrawArrays 使用原始类型GL_TRIANGLE_STRIP 绘制边缘。

问题:我绘制的所有这些体积线都包含 10 个顶点。但是,glMultiDrawArrays 需要一组起始索引和计数大小,它们基本上描述了每个基元的起始点和计数(以元素为单位)。由于我的原语的大小都没有变化,我会制作一个看似不必要的起始索引和计数列表。是否有 OpenGL 提供的任何功能可以让我简单地指定一个步幅(以元素为单位),在该步幅处会发生原始重启?

【问题讨论】:

  • +1 用于解释您为什么需要它。

标签: c++ opengl glsl opengl-3


【解决方案1】:

没有这样的功能,但根据您的需要,您不需要。变换反馈不能输出三角带。它只输出基本基元:单个点、线或三角形。这就是为什么glBeginTransformFeedback 只接受GL_POINTSGL_LINESGL_TRIANGLES 的原因。

您所要做的就是一次渲染所有边缘,通过反馈将结果收集到一个缓冲区中,然后通过一次调用 glDrawArrays 来渲染整个事物。

【讨论】:

  • 如果我执行以下操作会怎样:使用glDrawTransformFeedbackGL_POINTS 模式渲染线端点,将我的几何着色器中的out 布局限定符设置为点,并捕获体积线使用绑定到目标GL_TRANSFORM_FEEDBACK_BUFFER 的缓冲区的顶点。然后,将该缓冲区重新绑定到目标 GL_ARRAY_BUFFER 并使用 GL_TRIANGLE_STRIP 模式调用 glMultiDrawArrays 以渲染捕获的几何图形。这行得通吗?
  • @SirDigbyChickenCaesar:我不知道那会怎样。您的着色器必须有效地使用点写入来输出一条三角形。不知何故。我不知道你为什么一开始就坚持这样做;只需渲染三角形列表。真的就是这么简单。为什么你需要条这么严重?
  • 我必须从几何着色器输出点才能使用正确的输出流?所以为了完成我想要的,我需要将顶点的所有相关数据输出到不同的流(一个用于法线,一个用于位置等),无论我将在下一个绘图例程中使用什么原语。至于我为什么使用三角带,只是为了节省开销。虽然,我不确定节省的内存是否可以忽略不计,所以我可能会从渲染三角形开始。
  • @SirDigbyChickenCaesar:你知道你可以向同一个流输出多个值,对吧?多流输出用于输出不同频率的值。因为你输出这些东西只是为了稍后渲染它,所以没有意义。一个位置有一个法线,一个纹理坐标等。所以应该都去同一个流。
  • 是的,我只是通过 OpenGL wiki 才发现这一点。感谢您的提醒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多