【问题标题】:Using OpenGL draw_indirect with OpenCL将 OpenGL draw_indirect 与 OpenCL 一起使用
【发布时间】:2011-07-10 22:28:18
【问题描述】:

我并没有 100% 清楚地了解 Draw Instanced/Draw Indirect 系列函数一直到 glDrawElementsInstancedBaseVertexBaseInstance 是如何协同工作的。

使用支持 OpenGL 4.0+ 和 OpenCL 互操作的硬件和驱动程序,我们如何(如果可能)利用诸如间接绘制(现在也称为多绘制间接)之类的工具来跨多个帧绘制实例化几何,同时在 GPU 上更改几何?

例如,是否可以对形状进行细分,然后通过 opencl 对形状应用一些过滤器,同时引用 CPU 仅在需要时才需要剔除的几何图形?

*原帖经过大量编辑

【问题讨论】:

    标签: opengl opencl shader gpu opengl-4


    【解决方案1】:

    不清楚你在这里问什么。迄今为止,Khronos 定义的 CL/GL 互操作仅限于共享缓冲区/纹理和一些事件处理内容,这些似乎都与曲面细分无关。由于曲面细分是基于多边形模型光栅化的特定任务,因此它的相关性不太可能足以保证在 CL 规范中提及。如果您想知道 CL 实现是否会使用曲面细分硬件,那么这完全取决于特定的硬件功能和 CL 实现。

    更新:

    有两种镶嵌着色器。 镶嵌控制着色器接收一个补丁(三角形或四边形的集合)并计算一些每个顶点的属性,最重要的是,一个控制应该执行的细分量的数字。

    在曲面细分控制着色器运行后,生成的补丁被传递给一个固定功能的硬件单元,该单元执行实际的细分以生成具有更多多边形的新补丁。

    在细分之后,Tessellation Evaluation Shader 可以计算细分过程生成的补丁中每个顶点的属性。这是过程中的步骤,例如,在存储为纹理的置换贴图中查找信息。

    由于 CL/GL 互操作只允许基于缓冲区的数据交换,为了使用 CL 进行曲面细分,您必须将整个曲面细分过程实现为本质上是顶点数据的预处理器,并且您将无法从 CL 访问任何用于细分步骤的专用硬件。由于当前的硬件(据我所知)确实包含一个固定功能细分器而不是使用通用计算单元,因此在 CL 中实现的 tessellator 几乎肯定会在性能方面处于劣势。

    【讨论】:

    • 关于 OpenGL 4 规范,我读到与 OpenCL 的互操作性得到了改进。通常我能找到的唯一解释是有额外的可编程着色器以及draw_indirect。我已经完成了一些 OpenCL 工作,但我对互操作的概念充其量是模糊的。
    • draw_indirect 扩展(从 GL 4.0 开始是强制性的)与 CL 互操作一起使用很有用,因为它允许 DrawArraysInstancedDrawElementsInstancedBaseVertex 的参数来自 GPU 上的缓冲区,而不是来自CPU 和 CL 互操作允许 GL 缓冲区与 CL 内核共享(并因此被填充)。基本上,这意味着在 GPU 上运行的代码可以对顶点数组做更多的事情,而在 CPU 上执行的决策更少。总体目标似乎是将除同步和内存分配之外的所有内容都卸载到 GPU。
    • 那么,即使这不是“镶嵌着色器”阶段的一部分,我是否可以使用 OpenCL 在给定的缓冲区(足够大以扩展数据......)内镶嵌几何数据?
    • 您可以使用 OpenCL 中的缓冲区为所欲为。如果它与 GL 共享,您可以渲染它(VBO、纹理等)。所以是的,如果你真的想的话,你可以使用 CL 进行镶嵌。
    • 正如@mbien 所说,您可以使用 OpenCL 创建所需的任何数据并将其放入 VBO。我用这种方式镶嵌几何。有用。它很快。严格来说,它不是“着色器”。但它做同样的工作。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多