2、片元着色器之有向距离场(SDF)运算:并集、差集、交集

1、并集

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.1, 0.1), 0.2)`计算当前 uv 坐标到中心在 (0.2, 0.2)、半径为 0.2 的矩形的距离
    float r= sdRect(uv-vec2(0.1,0.1),0.2);
    // 大于0代表像素点不在矩形范围内
    r = r > 0.0 ? 0.0:1.0;
   
    float c = sdCircle(uv-vec2(-0.1,-0.1),0.2);
    c = c > 0.0 ? 0.0:1.0;
	
	// 并集就是像素属于圆或者矩形都可以着色,即r=1 or c=1
    float result = max(r,c);//r和c只能为0或1,取最大值即有一个为1结果就是1

    col = mix(col,vec3(1.0,0.0,1.0),result);
    
    fragColor = vec4(col,1.0);
}

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.1, 0.1), 0.2)`计算当前 uv 坐标到中心在 (0.2, 0.2)、半径为 0.2 的矩形的距离
    float r= sdRect(uv-vec2(0.1,0.1),0.2);
    // 大于0代表像素点不在矩形范围内
    r = r > 0.0 ? 0.0:1.0;
   
    float c = sdCircle(uv-vec2(-0.1,-0.1),0.2);
    c = c > 0.0 ? 0.0:1.0;
	
	// 差集就是像素只属于圆或者只属于矩形才能着色,即(r=1 and c=0)&&(r=0 and c=1)
    float result = abs(r-c);

    col = mix(col,vec3(1.0,0.0,1.0),result);
    
    fragColor = vec4(col,1.0);
}

3、交集

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.1, 0.1), 0.2)`计算当前 uv 坐标到中心在 (0.2, 0.2)、半径为 0.2 的矩形的距离
    float r= sdRect(uv-vec2(0.1,0.1),0.2);
    // 大于0代表像素点不在矩形范围内
    r = r > 0.0 ? 0.0:1.0;
   
    float c = sdCircle(uv-vec2(-0.1,-0.1),0.2);
    c = c > 0.0 ? 0.0:1.0;
	
	// 交集就是像素既属于圆又属于矩形才能着色,即(r=1 and c=1)&&(r=1 and c=1)
    float result = r*c;

    col = mix(col,vec3(1.0,0.0,1.0),result);
    
    fragColor = vec4(col,1.0);
}
相关推荐
指掀涛澜天下惊1 天前
DirectX12(D3D12)基础教程六 计算着色器通用计算
着色器·计算着色器·gpu计算
Forest_10108 天前
GLSL(OpenGL 着色器语言)基础语法
着色器
滴水成川16 天前
Metal 着色器与渲染管线
着色器·metal
stevenzqzq16 天前
openGl片段着色器的含义
opengl·着色器
Allen747416 天前
往期项目shader着色器实践效果应用合集
着色器·ta
不收藏找不到我24 天前
10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)
3d·数据可视化·着色器
不收藏找不到我1 个月前
7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)
着色器
MessiGo1 个月前
OpenGL(4)着色器
apache·着色器
太妃糖耶1 个月前
Shader中着色器的编译目标级别
unity·shader·着色器
HELLOMILI1 个月前
[Unity3D] 动态立方体贴图系统
游戏·unity·游戏引擎·图形渲染·着色器