使用矩阵OpenGL绘制线

时间:2018-11-09 23:39:34

标签: opengl glsl shader

我正在处理我修改过的着色器 但是我只想画一条线而不是这种模糊/光晕效果 我知道这是用作修饰符的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 );
}

1 个答案:

答案 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);
}

预览

line


说明:

让我们假设该线由点OUnit vector D定义,给出线的方向。请注意,单位向量的长度为1。

此外,您有点P,并且您想在(XO)到D的线上找到最近的点P。 / p>

首先计算从VO的向量P

V = P - O;

d到交点O的距离X可以由Dot product计算。
注意,由于D是一个单位向量,VD的点积等于线(OD)和向量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); 


请注意,如果线由L1L2两点定义,则单位向量D可以如下计算:

D = normalize(L2-L1);