美文网首页
在shaderToy中画矩形的原理

在shaderToy中画矩形的原理

作者: 汇源可乐 | 来源:发表于2022-01-05 19:38 被阅读0次

以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);
}

相关文章

网友评论

      本文标题:在shaderToy中画矩形的原理

      本文链接:https://www.haomeiwen.com/subject/qtkkcrtx.html