【问题标题】:what is the fwidth glsl function actually used for?fwidth glsl 函数实际用于什么?
【发布时间】:2011-10-11 15:33:02
【问题描述】:

每次我喝醉浏览时,我都会看到一个未回答的fwidth 问题。 这让我想知道它的实际设计目的是什么。

阅读文档是: abs(dFdx(p)) + abs(dFdy(p))

所以 max(dx,dy) 不是经典的 mip 选择。 是否用于替代 mip 选择?但我找不到abs(dx) + abs(dy) 会更好的情况。 一定有一些我完全想念的签名纸或通用算法使用该功能。它一定很受欢迎,因为它进入了 GLSL。 我唯一能想到的是我缺少一些 2d 后置过滤器。
但是什么? 我相信这里有人知道,一旦你看到它就很明显了。 那么:abs(dx) + abs(dy)使用什么算法?

【问题讨论】:

  • 你提到的二维后过滤实际上是一个不错的例子。
  • 任你挑选。抗锯齿、边缘检测、各向异性过滤。实际上,经过一些 Google 搜索后,我发现了一个使用 here 的示例,它用于 cel 着色着色器的抗锯齿。
  • 现在在 cmets 中聊天 :) 我也发现了这些东西,但它似乎还不够重要,不足以使其成为语言。一定有别的东西!对于 2d,我唯一能想到的就是这可能是一个不错的预测。我仍然觉得它有一些明显的东西。
  • @starmole:仅仅因为它对你来说“看起来不重要”并不意味着它不重要。 Bart 为您提供了 4 个场景,其中该函数将是有价值的。无论如何,这应该是一个答案。
  • @starmole 我不知道你希望它有多神奇,才能算重要?在与我提到的场景类似的场景中,它是一种经常使用的函数类型。我不知道它归结为发送到 GPU 的实际“代码”的具体细节,但我可以想象这个单一函数相对于自己评估对 dFdx 和 dFdy 的调用的一些优势。但这纯粹是我的猜测。

标签: opengl graphics rendering glsl shader


【解决方案1】:

这是函数 DF = dF/dx*dx + dF/dy*dy 的总导数。看到相似性了吗? fWidth >= DF 或换句话说,fWidth 是片段变量 F 在任何当前片段相邻像素之间的最大可能变化。即 3x3 邻域中的 8 个周围像素。

【讨论】:

    【解决方案2】:

    实际上,您对 2D 过滤建议很有用。任何依赖于某种度量来衡量像素与其相邻像素之间变化率的过滤器都可以从这个功能中受益。

    例如抗锯齿、边缘检测、各向异性过滤。我敢肯定还有更多可以想到的例子。

    从您的问题和 cmets 看来,您希望有一个令人兴奋的理由将此功能包含在 GLSL 中。我只想说这是一个有用的功能。也许对这个函数的实际内部有更深入了解的人可以提供更多关于幕后发生的事情的细节(即,与 dFdx 和 dFdy 的手写等效项相比是否有任何性能改进)。

    【讨论】:

    • 感谢您的回答。这确实有道理。我正在寻找的是真正“令人兴奋”的东西。例如查看 GLSL 噪声函数,我知道它为什么存在,为什么它需要由输入驱动等。但这只是因为我以前知道 Perlin 噪声!所以我有点假设这个函数在一些我不知道的算法中同样重要。但是随着问题的年龄和没有人用 siggraph 链接回答你可能是对的:这是一个有用的快捷方式,易于实现和模拟。无论如何,谢谢你的耐心,如果我看起来有点不礼貌,我很抱歉:)
    • 这是一个很好的使用 fwidth 的着色器示例:terrain-contour-lines
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2019-06-07
    • 1970-01-01
    • 2010-12-31
    • 2019-10-25
    相关资源
    最近更新 更多