【问题标题】:Can GLSL handle buffers with arbitrary length?GLSL 可以处理任意长度的缓冲区吗?
【发布时间】:2017-12-24 07:55:05
【问题描述】:

我有一个我正在涉足的艺术应用程序,它使用 OpenGL 来加速图形渲染。我希望能够添加绘制任意分段曲线的能力 - 几乎与 SVG 'path' 元素可以定义的形状相同。

与其在 CPU 上将我的路径细分为多边形,我认为最好将缓冲区中的一组值传递给我的着色器,定义我的曲线片段,然后使用输入/输出测试来检查哪些像素实际上在里面。换句话说,我将遍历描述路径中每个段的潜在大型数据数组。

根据我多年前学习着色器编程时的记忆,GPU 通过评估两个分支然后丢弃未使用的分支来处理 if 语句。这实际上意味着即使我只使用了它的一小部分,它最终也会默默地运行在我的整个缓冲区中(即,我的缓冲区有能力处理 1024 个曲线段,但我正在绘制的简单矩形只使用前四个)。

如何编写代码来处理这些可变数据?现代 GPU 能很好地处理这样的条件代码吗?

【问题讨论】:

  • 现代 GPU 通常可以正确处理 if。但是,移动 GPU 通常不会同时运行这两个分支。

标签: opengl svg glsl


【解决方案1】:

GPU 可以处理任意长度的缓冲区和条件(或令人信服地伪造)。问题是顶点和几何着色器无法从简短的描述中生成任意数量的三角形。

OpenGL 4.0 添加了两种新类型的着色器:曲面细分控制着色器和曲面细分评估着色器。这些着色器使您能够在 GPU 上细分曲线和曲面。

我发现this tutorial 在展示如何在 GPU 上细分贝塞尔曲线方面非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多