【问题标题】:Opengl calculate triangle derivativesOpengl计算三角形导数
【发布时间】:2014-10-29 08:41:00
【问题描述】:

我在二维空间中有一个三角形。 我有每个顶点的屏幕空间坐标,并且我有每个顶点的属性值。

如何计算这些属性的 dFdx / dFdy?换句话说,屏幕像素之间的属性将如何变化。

//fragment shader
varrying vec2 myAttr;

void main(void)
{
  vec2 px = dFdx(myAttr);
  vec2 py = dFdy(myAttr);
}

我想得到 px,py。我需要从 x 和 y 轴的下一个像素知道myAttr 的增量(增长)。 我需要公式/算法如何手动计算它们(例如硬件不支持导数的情况)。

附: 3个顶点之间线性插值的属性值(根据OpenGL doc)。

【问题讨论】:

  • 我不明白你在问什么。您的代码中已经有了 GLSL 内置函数 dFdx、dFdy。你还想要什么?如何手动计算的解释?
  • 这是在 GLSL 中 :) 我需要公式来手动/在 CPU 上计算它们。
  • opengl 论坛上的这个帖子提出了一个非常相似的问题:opengl.org/discussion_boards/showthread.php/…
  • 导数表示每单位的变化率。你在这里的单位是像素之间的距离。变化是相邻点处函数值的差异。因此,这必须只是一个简单的近似除法,其中一个高阶公式(如“5 点模具”)而是在三个点上。
  • @huseyin tugrul buyukisik - 是的。而且我了解如何在两点之间进行线性插值。但我不知道如何在 3 之间进行插值。

标签: opengl math derivative


【解决方案1】:

假设您的顶点结构如下:

struct vertex
{
  double x; // screenspace x coordinate
  double y; // screenspace y coordinate
  double a; // your attribute
};

您要查找的推导是这样计算的:

      d    = (v0.x - v2.x) * (v1.y - v2.y) -
             (v1.x - v2.x) * (v0.y - v2.y);

      dfdx = ((v0.a - v2.a) * (v1.y - v2.y) -
              (v1.a - v2.a) * (v0.y - v2.y)) / d;

      dfdy = ((v0.a - v2.a) * (v1.x - v2.x) -
              (v1.a - v2.a) * (v0.x - v2.x)) / d;

请注意,当d 接近零时,此等式会变得不稳定。如果d 正好为零,它也会导致除以零。这在实践中不是问题,因为在这种情况下,三角形的面积也为零,不需要渲染任何内容。

【讨论】:

  • 哇。正是我需要的。您自己找到了这些方程式,或者这是获得它们的已知方法?我的意思是,如果这是一些已知的事情,我可以在某个地方读到这个吗?
  • 而且,似乎属性可以是方程中的向量。我对吗?还是更好地按组件计算?
  • @tower120 d 只是我从等式中提取出来以使其更简单的一个常见因素。如果我没记错的话,它是三角形面积的两倍。是的,您可以将标量 a 替换为属性向量。这也将起作用。我不知道我从哪里得到这些方程式,但我不是自己想出来的。据我所知,它们是通过从重心坐标开始,然后求解单个插值并简化方程得出的。
  • 我或多或少地直接从我在 90 世纪写的旧三角形光栅化代码中剪切并粘贴了方程式。 :-)
  • dfdx 中使用y 组件进行操作。这是正确的吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多