1、片元着色器之有向距离场(SDF)

1、什么是有向距离场?

有向距离场(Signed Distance Field, SDF)是一种在计算机图形学中常用的概念,用于描述空间中某一点到某个形状表面距离的有符号距离。SDF 被广泛应用在实时渲染、碰撞检测、形状表示等场景中。最典型的例子:判断一个点是否在圆内:点到圆心的距离和半径的差是否为负值,负值说明在圆内,反之则在圆上或圆外。

2、绘制圆和正方形

cpp 复制代码
float sdCircle(vec2 uv,float r){
    return length(uv)-r;
}
float sdRect(vec2 uv,float r){
    return max(abs(uv.x),abs(uv.y))-r;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float w = 1.0/iResolution.y;
	// 计算纹理坐标
    vec2 uv = fragCoord/iResolution.xy;
    // 将纹理坐标系原点移动到屏幕中央
    uv-=0.5;
	// 调整 x 轴比例,使得坐标系纵横比一致
    uv.x*=iResolution.x/iResolution.y;
    vec3 col = vec3(0.0);
	// `sdRect(uv - vec2(0.2, 0.2), 0.2)`计算当前 uv 坐标到中心在 (0.2, 0.2)、半径为 0.2 的矩形的距离
    float r= sdRect(uv-vec2(0.2,0.2),0.2);
    // 大于0代表像素点不在矩形范围内
    r = r > 0.0 ? 0.0:1.0;
    // mix(x,y,a)=x×(1−a)+y×a
    col = mix(col,vec3(0.0,0.0,1.0),r);
   
    float c = sdCircle(uv-vec2(-0.2,-0.2),0.2);
    c = c > 0.0 ? 0.0:1.0;
    col = mix(col,vec3(1.0,0.0,1.0),c);
    
    fragColor = vec4(col,1.0);
}

3、结果

相关推荐
无敌最俊朗@14 小时前
顶点着色器和片段着色器
着色器
Fantasywt15 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
gis分享者9 天前
学习threejs,使用ShaderMaterial自定义着色器材质
材质·threejs·着色器·shadermaterial
贵州晓智信息科技11 天前
使用 Three.js 转换 GLSL 粒子效果着色器
开发语言·javascript·着色器
千年奇葩15 天前
Unity shader glsl着色器特效之 模拟海面海浪效果
unity·游戏引擎·着色器
Neo Evolution16 天前
Flutter与移动开发的未来:谷歌的技术愿景与实现路径
android·人工智能·学习·ios·前端框架·webview·着色器
2201_7596465618 天前
three.js 通用 shaderToy着色器使用,切换
开发语言·前端·javascript·ecmascript·webgl·着色器
Yang-Never24 天前
OpenGL ES -> 投影变换矩阵完美解决绘制GLSurfaceView绘制图形拉伸问题
android·java·kotlin·android studio·着色器
贵州晓智信息科技1 个月前
实现动态卡通笑脸的着色器实现
前端·着色器
HahaGiver6661 个月前
Unity Shader Graph 2D - 跳动的火焰
unity·游戏引擎·材质·着色器