(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() ?
float2 dx = ddx(uv.xy * size.x); // does this make sense?
Started by skytiger, Dec 06 2012 08:22 AM
3 replies to this topic
Ad:
#2 Moderators - Reputation: 5418
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.
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.
#4 Members - Reputation: 199
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)
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.






