我正在处理我修改过的着色器 但是我只想画一条线而不是这种模糊/光晕效果 我知道这是用作修饰符的Float d,但如何获得此简单行代替
我的研究基于此shader
将感谢您的帮助
佐丹
#ifdef GL_ES
precision mediump float;
#endif
mat4 mat = mat4 (
vec4 ( Scale * SizeTpDwn , 0.0 , 0.0 , 0.0 ),
vec4 ( 0.0 , Scale * SizeLftRght , 0.0 , 0.0 ),
vec4 ( 0.0 , 0.0 , Scale , 0.0 ),
vec4 ( 0.0 , 0.0 , 0.0 , Scale ) );
vec2 pos;
vec4 linecol = vec4 (0.5 , 0.5 , 0.7 , 0.5);
vec4 col = vec4 ( 0.0, 0.0, 0.0, 1.0 );
void Line4 ( vec4 a, vec4 b );
void Line2 ( vec2 a, vec2 b );
void main( void ) {
pos = gl_FragCoord.xy / RENDERSIZE.xy;
pos -= .5;
//Line
Line4 ( vec4 ( LengthTX, MoveTX, .2 ,-.2), vec4 (LengthTX2, MoveTX2, .2, -.2 ) );
//Line4 ( vec4 ( MoveRX, LengthRY, .2 ,-.2 ),vec4 ( MoveRX2,LengthRY2, .2, -.2 ) );
//Line4 ( vec4 (MoveLX, LengthLY, .2 ,-.2 ),vec4 (MoveLX2,LengthLY2, .2, -.2 ) );
//Line4 ( vec4 ( LengthDX,MoveDX, .2 ,-.2), vec4 (LengthDX2,MoveDX2, .2, -.2 ) );
gl_FragColor = vec4( col.xyz, 1.0 );
}
void Line4 ( vec4 a, vec4 b )
{
a = mat * a;
//a.xyz /= 1.5 + a.w * 2.;
b = mat * b;
//b.xyz /= 1.5 + b.w * 2.;
Line2 ( a.xy , b.xy );
}
void Line2 ( vec2 a, vec2 b )
{
float dtc = (distance ( pos , a ) + distance ( pos , b ) - distance ( a , b )); //+ 1e-5);
//linecol = vec4 (0.5 , 0.5 , 0.7 , 0.5);
col += max ( 1. - pow ( dtc * 14. , 0.10 ) , -.10 );
}
答案 0 :(得分:2)
您要做的是找到当前片段到直线的最近距离。如果此距离小于一半的线粗,则该片段在线上。
要创建具有尖锐边缘的线,我建议使用step
函数,如果值小于参考值,则返回0.0,否则返回1.0。
画一条无尽的线,您必须检查无尽线上最接近当前位置的点是否在该线的起点和终点之间:
void Line2 (vec2 L1, vec2 L2)
{
vec2 P = pos;
vec2 O = L1;
vec2 D = normalize(L2-L1);
float d = dot(P-O, D);
vec2 X = L1 + D * d;
float dtc;
if (d < 0.0)
dtc = distance(L1, P); // d < 0.0 -> X is "before" L1
else if (d > distance(L1, L2))
dtc = distance(L2, P); // d > distance(L1, L2) -> X is "after" L2
else
dtc = distance(pos, X);
col += 1.0 - step(0.01, dtc);
}
预览
说明:
让我们假设该线由点O
和Unit vector D
定义,给出线的方向。请注意,单位向量的长度为1。
此外,您有点P
,并且您想在(X
,O
)到D
的线上找到最近的点P
。 / p>
首先计算从V
到O
的向量P
:
V = P - O;
从d
到交点O
的距离X
可以由Dot product计算。
注意,由于D
是一个单位向量,V
和D
的点积等于线(O
,D
)和向量V
之间的夹角余弦,乘以V
的数量(长度):
d = dot(V, D);
交点X
可以通过沿线O
将点D
移动距离d
来计算:
X = O + D * d;
所以交点的公式是:
O ... any point on the line
D ... unit vector which points in the direction of the line
P ... the "Point"
X = O + D * dot(P-O, D);
请注意,如果线由L1
和L2
两点定义,则单位向量D
可以如下计算:
D = normalize(L2-L1);