shader入门教程四(距离场构图)

这一节我们来探讨距离场构图法。

我们回顾一下前面绘制圆的思路,就是定义每个像素点的一个距离,例如每个点到圆心的距离,再根据距离值来计算颜色值。

其实我们可以将这种方式抽象化,变成一种普遍的方法,我们可以称为距离场构图,其核心在于给每个像素定义一个特定的距离值,所有距离值相等的点则意味这些像素点的颜色值也一致。

上述绘制圆的距离值如果我们用通俗的话来说就是:

scss 复制代码
每个像素点,请你计算下你们各自到(0.0,0.0)这个点的距离,如果大于0.5则使用绿色,否则使用黑色

基于上述原理,例如我们也可以定义例如像素点到v1(0.5,0.0),v2(-0.5,0.0)两个点的距离之和做为距离。

c 复制代码
void main(){
        // 将坐标归一化到[-1,1]
        vec2 st = 2.0*(gl_FragCoord.xy/vec2(1000.0,1000.0)) - vec2(1.0);
        float v = length(st-vec2(-0.5,0.0)) + length(st-vec2(0.5,0.0));
        float v2 = smoothstep(0.0,2.0,v);
        gl_FragColor = vec4(1.0,v2,0.0,1.0);
}

也可以定义到两点距离取最短的那个

c 复制代码
 void main(){
    // 将坐标归一化到[-1,1]
    vec2 st = 2.0*(gl_FragCoord.xy/vec2(1000.0,1000.0)) - vec2(1.0);
    float v = min(length(st-vec2(-0.5,0.0)) , length(st-vec2(0.5,0.0)));
    float v2 = smoothstep(0.0,1.0,v);
    gl_FragColor = vec4(1.0,v2,0.0,1.0);
 }

利用此方法,我们也可以绘制一些通用的线条。例如绘制一条直线。我们可以定义每个像素点到这个直线的距离。如果点在这个直线上,则距离为0,我们可以使用向量的方法来计算点到直线的距离

现在我们假如需要绘制y=x+0.1的直线,我们取两个直线上的点v1(0,0.1)和v2(-0.1,0)

c 复制代码
	// 封装绘制直线方法。
float sdf_line(vec2 st,vec2 v1,vec2 v2){
  vec2 ab = v2 - v1;
  vec2 ap = st - v1;
  return ((ap.x * ab.y) - (ab.x * ap.y))/length(ab);
}

void main(){
    // 将坐标归一化到[-1,1]
    vec2 st = 2.0*(gl_FragCoord.xy/vec2(1000.0,1000.0)) - vec2(1.0);
    float d = sdf_line(st,vec2(-0.1,0.0),vec2(0.0,0.1));
    gl_FragColor = vec4(step(abs(d),0.005));
}

还可以绘制抛物线和三角函数:

c 复制代码
vec4 stroke(float d,vec4 color,float w){
    float v = step(abs(d),w);
    return color*v;
}

void main(){
    // 将坐标归一化到[-1,1]
    vec2 st = 2.0*(gl_FragCoord.xy/vec2(1000.0,1000.0)) - vec2(1.0);
    float d = st.y - st.x*st.x;
    float d1 = st.y - 0.1*sin((2.0*3.1415/0.2)*st.x);
    float d2 = st.y - 0.1*sin((2.0*3.1415/0.2)*st.x)/st.x;
            gl_FragColor=stroke(d,vec4(1.0),0.005)+stroke(d1,vec4(0.0,1.0,0.0,1.0),0.005)+stroke(d2,vec4(1.0,1.0,0.0,1.0),0.005);
}
相关推荐
Chen7323 小时前
一套飞控内核,两个渲染后端:three.js 与 CesiumJS 同构实践
three.js
夏天要喝冰可乐1 天前
用 Codex 连接 Blender,我做了一块可以走进楼宇的大屏
前端·three.js
总要学点什么2 天前
第65篇:地图卷帘控件——点「关闭卷帘」,消失的却是右边那半张地图
信息可视化·gis·webgl·cesium·空间分析
总要学点什么2 天前
第63篇:3DTiles-大雁塔模型——190 块瓦片不是八叉树,抬高的却是球心那条法线
3d·数据挖掘·数据分析·gis·webgl
ab1237683 天前
three.js 完整笔记
笔记·three.js
答案answer6 天前
不用写一行Three.js代码,也能搭出复杂数字孪生场景
github·three.js
Jmyd01236 天前
3D数字协同设计实训空间技术架构解析:从三维采集到WebGL虚拟展示的全链路实现
3d·架构·webgl·虚拟实训
总要学点什么6 天前
第57篇:三维场景演示_基础版——同一秒,播过去和拖过去差出一千多米
3d·数据挖掘·数据分析·gis·webgl
总要学点什么7 天前
第55篇:空间分析-剖面分析——红线走大圆,剖面却按经纬直线采样
前端框架·gis·webgl·cesium·空间分析
:mnong7 天前
Web 三维可视化技术对比:ParaView Web vs 本项目 wasm + Three.js
前端·webgl·opengl·opencl·科学可视化