|
フラグメントシェーダー 円
ここでは距離関数に円を定義しています。
これは円の方程式 x^2+y^2=r^2 から SQR(x^2+y^2)-r=0となります。
距離関数が正か負で塗分けています。
では距離関数をどう定義したらいいのかについては
具体的な距離関数がネット上に公開されています。
https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm
https://www.shadertoy.com/playlist/MXdSRf
3次元の距離関数も公開されています。
https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
DIM ST(2),C(3)
ASK BITMAP SIZE XSIZE,YSIZE
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
SET WINDOW -XSIZE/MIN(XSIZE,YSIZE),XSIZE/MIN(XSIZE,YSIZE),-YSIZE/MIN(XSIZE,YSIZE),YSIZE/MIN(XSIZE,YSIZE)
FOR YY=0 TO YSIZE-1
FOR XX=0 TO XSIZE-1
LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE)
LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE)
CALL VEC2(ST,X,Y)
IF DISTANCE(ST)>0 THEN
CALL VEC3(C,0,0,0)
ELSE
CALL VEC3(C,1,0,0)
END IF
CALL SETCOLOR(C(1),C(2),C(3))
PLOT POINTS:X,Y
NEXT XX
NEXT YY
END
EXTERNAL FUNCTION CIRCLE(P(),R) !距離関数 円
LET CIRCLE=LENGTH(P)-R
!!LET CIRCLE=NLENGTH(P,4)-R
END FUNCTION
EXTERNAL FUNCTION ELLIPSE(P(),A,B,N) !距離関数 楕円
LET ELLIPSE=ABS(P(1)/A)^N+ABS(P(2)/B)^N-1
END FUNCTION
EXTERNAL FUNCTION DISTANCE(P())
LET DISTANCE=CIRCLE(P,.5)
!LET DISTANCE=ELLIPSE(P,.7,.4,2)
END FUNCTION
EXTERNAL SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB
EXTERNAL SUB VEC2(A(),X,Y)
LET A(1)=X
LET A(2)=Y
END SUB
EXTERNAL SUB VEC3(A(),X,Y,Z)
LET A(1)=X
LET A(2)=Y
LET A(3)=Z
END SUB
EXTERNAL FUNCTION CLAMP(X,A,B)
LET CLAMP=MIN(B,MAX(X,A))
END FUNCTION
EXTERNAL FUNCTION LENGTH(A())
LET LENGTH=SQR(A(1)^2+A(2)^2)
END FUNCTION
EXTERNAL FUNCTION NLENGTH(P(),N)
LET NLENGTH=(ABS(P(1))^N+ABS(P(2))^N)^(1/N)
END FUNCTION
|
|