フラグメントシェーダー 箱

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時21分48秒
  フラグメントシェーダー 箱

距離関数BOXに四角形(箱)を定義しています。
どうしてこれで四角形(箱)が描けるのかを考えてみるのもいいかもしれません。

また距離関数ROUNDBOXは角に丸みがある四角形(箱)です。
距離関数BOXとの違いはRを引いているかだけです。

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 BOX(P(),B()) !距離関数 箱
DIM D(2),DD(2)
FOR I=1 TO 2
   LET D(I)=ABS(P(I))-B(I)
NEXT I
FOR I=1 TO 2
   LET DD(I)=MAX(D(I),0)
NEXT I
LET BOX=LENGTH(DD)+MIN(MAX(D(1),D(2)),0)
END FUNCTION

EXTERNAL  FUNCTION ROUNDBOX(P(),B(),R) !距離関数
LET ROUNDBOX=BOX(P,B)-R
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM B(2)
CALL VEC2(B,.3,.3)
LET DISTANCE=BOX(P,B)
!!LET DISTANCE=ROUNDBOX(P,B,.1)
!!LET DISTANCE=ABS((P(1)-B(1))+(P(2)-B(2)))+ABS((P(1)-B(1))-(P(2)-B(2)))-1
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
 

戻る