【问题标题】:GPU parallelism dilemmaGPU 并行性困境
【发布时间】:2014-07-15 02:48:28
【问题描述】:

我的问题是 OpenGL 是并行绘制图元,还是只有光栅化是这样完成的?简而言之,如果我想两次绘制相同的图元,如果我将顶点复制到缓冲区两次,并且只调用一次drawarrays,渲染速度是否会更快,或者会导致与只复制顶点相同的渲染速度一次,调用两次drawarrays(不计算CPU调用GPU的时间)

【问题讨论】:

    标签: opengl rendering gpu


    【解决方案1】:

    取决于 GPU 和驱动程序;典型的图形卡具有多个内核,可以在多个数据集上运行相同的代码路径。这就是经典的Single instruction, multiple data并行,也是openGL并行的核心。

    调用 drawArrays 两次对此无济于事,因为整个管道将被执行两次。

    如果您想在不同位置绘制同一网格的多个副本,您通常会使用instancing 来更改实例之间的制服。

    【讨论】:

    • 我要做的是基于相同的控制点绘制贝塞尔曲线和 b 样条曲线。我想在几何着色器中进行大部分计算,并以统一的方式传递点。这意味着贝塞尔曲线需要一个 geom.shader 调用,而 b 样条曲线需要一个。所以我试图决定调用 geom.shader 两次,并修改它们之间的 bool uniform,将 geom.shader 从 bezier 切换到 b 样条,或者调用一次,将 bool 放在 VAO 中,切换几何着色器。如果 geom.shader 的两个实例并行运行,那么第二个会更快。
    • 执行管道两次无关紧要,因为顶点着色器通过并且片段仅显示白色。但是 geom.shader 很重(计算贝塞尔曲线或 b 样条曲线需要大量计算),所以如果我可以告诉 GPU 为贝塞尔曲线运行 geom.shader 而为 a 运行 geom.shader 会很有帮助b 样条。
    • @CivDav 几何着色器实际上很难并行化,因为输出(发出的顶点/基元)的数量可能会因运行时执行而异。在其他阶段,工作流在执行开始之前得到更好的定义。假设几何着色器中的静态控制流,您可以假设当这样的事情有意义时,实现将尝试并行化 GS 调用。但是,这完全超出了任何桌面渲染 API 的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2023-01-10
    • 2018-12-19
    相关资源
    最近更新 更多