ten*_*our 12 shader geometry glsl euclidean-distance
我正在尝试在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);
}
Run Code Online (Sandbox Code Playgroud)
这会生成一个看起来像这样的矩形:

线条显示距矩形的距离.它工作正常,但只适用于矩形外的距离.在矩形内部,距离是静态的0..
如何使用统一的公式在矩形内获得精确的距离?
joz*_*yqk 15
这个怎么样...
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));
}
Run Code Online (Sandbox Code Playgroud)
这是结果,其中绿色标记正距离和红色负数(下面的代码):

分解:
获取x和y边界的签名距离.u - left并且right - u是两个x轴距离.取这些值的最大值可得到最近边界的符号距离.查看d.x并d.y在下面的图像中单独显示.
结合x和y:
如果两个值均为负值,则取最大值(即最接近边界).这是完成的min(0.0, max(d.x, d.y)).
如果只有一个值是正数,那就是我们想要的距离.
如果两个值都是正数,则最近的点是一个角,在这种情况下我们想要长度.这可以与上述情况相结合,无论如何都要考虑长度,并确保两个值均为正值:length(max(vec2(0.0), d)).
等式中的这两部分是互斥的,即只有一部分将产生非零值,并且可以求和.


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy / iResolution.xy;
uv -= 0.5;
uv *= vec2(iResolution.x/iResolution.y,1.0);
uv += 0.5;
float d = sdAxisAlignedRect(uv, vec2(0.3), vec2(0.7));
float m = 1.0 - abs(d)/0.1;
float s = sin(d*400.0) * 0.5 + 0.5;
fragColor = vec4(s*m*(-sign(d)*0.5+0.5),s*m*(sign(d)*0.5+0.5),0,1);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |