在shaderToy中画矩形的原理

以IQ写的函数为例:

float sdBox( in vec2 p, in vec2 b ){
    vec2 d = abs(p)-b;
    return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}
  • 点p:归一化后的坐标点,横纵坐标范围都是是[-1,1]
    一般情况下:vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
  • 点b:宽,高的一半
    但看vec2 d = abs(p)-b;:假设b vec2(0.4,0.3)
    则当p在矩形内时d的坐标在第三象限,当p在矩形外时d的坐标在非第三象限

    我们在但单看length(max(d,0.0)):假设d在第三象限,则函数表达式的结果为0.0;
    假设d不在第三象限,则函数表达式的结果为sqrt(Nx*Nx+Ny*Ny)=N; N为[0,1]中的所有实数
    我们再看一下min(max(d.x,d.y),0.0):假设d在第三象限,则函数表达结果为max(d.x,d.y)=-N,
    假设在非第三象限,则函数表达式的结果为0.0
    综合来看length(max(d,0.0)) + min(max(d.x,d.y),0.0);:当函数在第三象限时,函数表达式的结果为一个负数,当函数在非第三象限时,函数表达式的结果为一个非负数。
    综合来看整个函数:sdBox(vec2 p,vec2 b):当坐标点在矩形内部时,函数的取值时一个负数,坐标点在矩形边界时,函数的取值为0,坐标点在矩形外部时,函数的取值为正数。
    矩形
shaderToy矩形源码示例
float sdBox( in vec2 p, in vec2 b ){
    vec2 d = abs(p)-b;
    return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
    // Time varying pixel color
    vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    col = mix(col,vec3(0.0),step(0.0,sdBox(p,vec2(0.4,0.3))));
    // Output to screen
    fragColor = vec4(col,1.0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值