Jump to content

  • Log In with Google      Sign In   
  • Create Account

float2 dx = ddx(uv.xy * size.x); // does this make sense?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 skytiger   Members   -  Reputation: 258

Like
0Likes
Like

Posted 06 December 2012 - 08:22 AM

(given that uv is float2)

shouldn't it be:

[source lang="cpp"]float dx = ddx(uv.x * size.x);float dy = ddy(uv.y * size.y);[/source]

and why is there an ddx() and a ddy() ? why not just a dd() ?

Sponsor:

#2 MJP   Moderators   -  Reputation: 11347

Like
2Likes
Like

Posted 06 December 2012 - 03:59 PM

ddx is the partial derivative of the value with respect to screen-space X, ddy is the partial derivative of the value with respect to screen-space Y. In other words ddx tells you how much the value changes if you were to move to right a pixel, while ddy tells you how much the value changes if you were to move down a pixel. That is why there are two different functions.

I can't tell you whether your code makes sense without knowing what you're actually trying to accomplish, and also knowing what "size" is.

#3 Matias Goldberg   Crossbones+   -  Reputation: 3397

Like
2Likes
Like

Posted 06 December 2012 - 04:43 PM

Yeah, what mjp said.

If you intend to use the derivatives for manual tex2d lookup because you're having issues with branch code, you'll probably want to do:
float2 dx = ddx(uv.xy * size.xy);
float2 dy = ddy(uv.xy * size.xy);


#4 skytiger   Members   -  Reputation: 258

Like
0Likes
Like

Posted 06 December 2012 - 04:55 PM

I see now!

float2 dx = ddx(uv.xy);

ddx() is returning a vector in texture space

The original code was calculating a lod level manually to allow for sampling neighbouring pixels (in DX9)
[source lang="cpp"]float MipMapLevel(in float2 uv, in float2 textureSize) { float2 dx = ddx(uv * textureSize.x); float2 dy = ddy(uv * textureSize.y); float d = max(dot(dx, dx), dot(dy, dy)); return log2(sqrt(d)); }//function// then I can use tex2Dlod() with correct pixel offsets for manual interpolation[/source]
also, from my testing on an ATI3870, fractional LOD levels seem to cause blending between mip levels
so I need to round or truncate my lod level before calculating the pixel offsets

thanks MJP (edit: and Matias, good point)

Edited by skytiger, 06 December 2012 - 04:57 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS