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