Opengl计算三角形导数

时间:2014-09-04 14:32:03

标签: opengl math derivative

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

如何为这些属性计算dFdx / dFdy?换句话说,如何将属性从屏幕像素更改为像素。

//fragment shader
varrying vec2 myAttr;

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

我想得到px,py。我需要知道x和y轴的下一个像素的myAttr的delta(增长)。 我需要公式/算法如何手动计算它们(例如,当硬件不支持衍生物时)。

P.S。属性值在3个顶点之间进行线性插值(根据OpenGL doc)。

1 个答案:

答案 0 :(得分:3)

假设您的顶点结构如下:

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正好为零,它也会导致除以零。这在实践中不是问题,因为在这种情况下,三角形的面积也为零,不需要渲染。