shadertoy学习 第3课


注意下面的segment函数,计算了uv点到直线的距离,小于width就是白色


//封装绘制网格函数

vec3 grid(vec2 uv)

{

vec2 cell = fract(uv);//取小数部分

vec3 col=vec3(0.);

//网格绘制

if(abs(cell.y)<fwidth(uv.y)) //横坐标绘制,小于一个像素,就是红色

    {

        col.r=1.0;

    }

if(abs(cell.x)<fwidth(uv.x)) //纵坐标绘制,小于一个像素,就是蓝色

    {

        col.b=1.0;

    }

//x y 坐标轴绘制

if(abs(uv.y)<fwidth(uv.y)) //横坐标绘制

    {

        col=vec3(1,1,1);

    }

if(abs(uv.x)<fwidth(uv.x)) //纵坐标绘制

    {

        col=vec3(1,1,1);

    }

return col;

}

//坐标归一化

vec2 fixUV(in vec2 uv, in float scale)

{

return scale*(2.0*uv-iResolution.xy)/min(iResolution.x,iResolution.y);

}

// 用向量计算点到直线距离,小于width就认为在这个直线上

float segment(in vec2 uv, in vec2 p0, in vec2 p1, float width)

{

vec2 a = uv - p0;

vec2 b = p1 - p0;

vec2 c = dot(a, b)/dot(b,b)*b;

vec2 e = c - a;

float d = length(e);

if(d<width)

return 1.;

else

return 0.;

}

void mainImage( out vec4 fragColor, in vec2 fragCoord )

{

// 3x3大小的坐标

vec2 uv = fixUV(fragCoord, 3.0);

// Output to screen

// fragColor = vec4(grid(uv), 1.0);

vec3 color = vec3( segment(uv, vec2(0., 0.), vec2(1., 1.), 0.01));

    fragColor = vec4(color, 1.0);

}


image




画线段,clamp怎么理解???


//封装绘制网格函数

vec3 grid(vec2 uv)

{

vec2 cell = fract(uv);//取小数部分

vec3 col=vec3(0.);

//网格绘制

if(abs(cell.y)<fwidth(uv.y)) //横坐标绘制,小于一个像素,就是红色

    {

        col.r=1.0;

    }

if(abs(cell.x)<fwidth(uv.x)) //纵坐标绘制,小于一个像素,就是蓝色

    {

        col.b=1.0;

    }

//x y 坐标轴绘制

if(abs(uv.y)<fwidth(uv.y)) //横坐标绘制

    {

        col=vec3(1,1,1);

    }

if(abs(uv.x)<fwidth(uv.x)) //纵坐标绘制

    {

        col=vec3(1,1,1);

    }

return col;

}

//坐标归一化

vec2 fixUV(in vec2 uv, in float scale)

{

return scale*(2.0*uv-iResolution.xy)/min(iResolution.x,iResolution.y);

}

// 用向量计算点到直线距离,小于width就认为在这个直线上

float segment(in vec2 uv, in vec2 p0, in vec2 p1, float width)

{

vec2 a = uv - p0;

vec2 b = p1 - p0;

vec2 c = clamp(dot(a, b)/dot(b,b), 0., 1.)*b;

vec2 e = c - a;

float d = length(e);

if(d<width)

return 1.;

else

return 0.;

}

void mainImage( out vec4 fragColor, in vec2 fragCoord )

{

// 3x3大小的坐标

vec2 uv = fixUV(fragCoord, 3.0);

// Output to screen

vec3 color = grid(uv);

    color += vec3( segment(uv, vec2(0., 0.), vec2(1., 2.), fwidth(uv.x)));

    fragColor = vec4(color, 1.0);

}

posted on 2023-03-08 17:35  katago  阅读(18)  评论(0编辑  收藏  举报