Kik*_*ohs 3 shader glsl fragment-shader
我正在努力理解以下代码,其想法是在片段着色器中绘制一个简单的段。我尝试分解它,但我仍然不明白???线。如果有一个很好的解释那就太好了。我在 SO 或 Google 上找不到任何东西。
float lineSegment(vec2 p, vec2 a, vec2 b) {
float thickness = 1.0/100.0;
vec2 pa = p - a;
vec2 ba = b - a;
float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
// ????????
float idk = length(pa - ba*h);
return smoothstep(0.0, thickness, idk);
}
Run Code Online (Sandbox Code Playgroud)
原始代码来自TheBookOfShaders。
小智 6
假设直线由点a
、 、定义b
,并且p
是要计算的点,则是从点到点的pa
向量以及从到 的向量。a
p
ba
a
b
现在,dot(ba, ba)
等于length(ba) ^ 2
且dot(pa,ba) / length(ba)
是向量 pa 在直线上的投影。然后,dot(pa,ba)/dot(ba,ba)
投影是否在线条长度上标准化。该值被限制在 0 和 1 之间,因此您的投影将始终位于定义直线的点之间。
然后length(pa - ba * h)
,ba * h
等于dot(pa,ba) / length(ba)
点在直线上的投影,现在夹在点 a 和 b 之间。减法pa - ba * h
产生的向量表示线和点之间的最小距离p
。使用该向量的长度并将其与厚度进行比较,您可以确定该点是否落在您要绘制的线内。
归档时间: |
|
查看次数: |
4567 次 |
最近记录: |