Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to calculate dFdx(dFdx()) of something within a fragment shader?

So I already know that the documentation for dFdx, dFdy, and fwidth states that "expressions that imply higher-order derivatives such as dFdx(dFdx(n)) have undefined results, as do mixed-order derivatives such as dFdx(dFdy(n))." If such expressions are undefined, is it possible to get higher-order derivatives of some expression within a fragment shader?

I hear that dFdx gets information from neighboring fragments and finds the difference between the neighbor's values and this fragment's values. Perhaps there is a way to manually take information from neighboring fragments?

I think there is a formula that can be used to find the second-order derivative:

(f(x+h,y+h) - f(x+h,y) - f(x,y+h) + f(x,y))/h^2

But my question is, how do we get terms f(x+h,y+h), f(x+h,y), f(x,y+h)? How do we also get h, which is the distance between fragments?

like image 257
Andy Qu Avatar asked Oct 18 '25 08:10

Andy Qu


1 Answers

Perhaps there is a way to manually take information from neighboring fragments?

Even if you could (and with some subgroup extensions, you can), it wouldn't help.

Fragment shaders execute invocations in 2x2 quads, with groups of 4 invocations that are directly adjacent to each other. The derivative functions merely take the difference between data in the horizontal/vertical fragments in the quad. If one or more of the fragments in a quad happens to be outside of the area of the primitive being rasterized, it still gets executed (in order to compute derivatives), but it has no visible effects. These are called "helper invocations".

Regardless, invocations in a quad can only talk to other invocations in the same quad. And if you wanted to get higher order derivatives, you would need to sample from more than just a single adjacent fragment.

like image 93
Nicol Bolas Avatar answered Oct 19 '25 22:10

Nicol Bolas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!