以IQ寫(xiě)的函數(shù)為例:
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);
}
-
點(diǎn)p
:歸一化后的坐標(biāo)點(diǎn),橫縱坐標(biāo)范圍都是是[-1,1]
一般情況下:vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
-
點(diǎn)b
:寬渠脉,高的一半
但看vec2 d = abs(p)-b;
:假設(shè)bvec2(0.4,0.3)
則當(dāng)p在矩形內(nèi)時(shí)d的坐標(biāo)在第三象限宇整,當(dāng)p在矩形外時(shí)d的坐標(biāo)在非第三象限
我們?cè)诘珕慰?code>length(max(d,0.0)):假設(shè)d在第三象限,則函數(shù)表達(dá)式的結(jié)果為0.0;
假設(shè)d不在第三象限芋膘,則函數(shù)表達(dá)式的結(jié)果為sqrt(Nx*Nx+Ny*Ny)=N
; N為[0,1]中的所有實(shí)數(shù)
我們?cè)倏匆幌?code>min(max(d.x,d.y),0.0):假設(shè)d在第三象限鳞青,則函數(shù)表達(dá)結(jié)果為max(d.x,d.y)=-N,
假設(shè)在非第三象限,則函數(shù)表達(dá)式的結(jié)果為0.0
綜合來(lái)看length(max(d,0.0)) + min(max(d.x,d.y),0.0);
:當(dāng)函數(shù)在第三象限時(shí)为朋,函數(shù)表達(dá)式的結(jié)果為一個(gè)負(fù)數(shù)臂拓,當(dāng)函數(shù)在非第三象限時(shí),函數(shù)表達(dá)式的結(jié)果為一個(gè)非負(fù)數(shù)习寸。
綜合來(lái)看整個(gè)函數(shù):sdBox(vec2 p,vec2 b)
:當(dāng)坐標(biāo)點(diǎn)在矩形內(nèi)部時(shí)胶惰,函數(shù)的取值時(shí)一個(gè)負(fù)數(shù),坐標(biāo)點(diǎn)在矩形邊界時(shí)霞溪,函數(shù)的取值為0孵滞,坐標(biāo)點(diǎn)在矩形外部時(shí)中捆,函數(shù)的取值為正數(shù)。
矩形
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);
}