我正在尝试在GLSL中编写一个函数,该函数返回到矩形的符号距离。矩形是轴对齐的。我觉得有点卡住;我无法绕过我需要做的事情来使它发挥作用。
我想出的最好的是:
float sdAxisAlignedRect(vec2 uv, vec2 tl, vec2 br)
{
// signed distances for x and y. these work fine.
float dx = max(tl.x - uv.x, uv.x - br.x);
float dy = max(tl.y - uv.y, uv.y - br.y);
dx = max(0.,dx);
dy = max(0.,dy);
return sqrt(dx*dx+dy*dy);
}
生成一个看起来像的矩形:
线条显示距矩形的距离。它工作正常,但只适用于矩形外的距离。在矩形内部,距离是静态的0.
。
如何使用统一的公式在矩形内获得准确的距离?
答案 0 :(得分:15)
这个怎么样......
const
这里是result,其中绿色标记为正距离,红色标记为红色(代码如下):
故障:
获取x和y边框的签名距离。 const
和float sdAxisAlignedRect(vec2 uv, vec2 tl, vec2 br)
{
vec2 d = max(tl-uv, uv-br);
return length(max(vec2(0.0), d)) + min(0.0, max(d.x, d.y));
}
是两个x轴距离。取这些值的最大值可得到最近边界的符号距离。查看u - left
和right - u
会在下面的图片中单独显示。
合并x和y:
如果两个值均为负数,则取最大值(即最接近边界)。这是通过d.x
完成的。
如果只有一个值是正数,那就是我们想要的距离。
如果两个值都是正数,则最近的点是一个角,在这种情况下我们需要长度。这可以与上述情况相结合,无论如何都要考虑长度并确保两个值均为正值:d.y
。
等式中的这两部分是互斥的,即只有一部分会产生非零值,并且可以求和。
min(0.0, max(d.x, d.y))