フラグメントシェーダー 三角形

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時22分28秒
  フラグメントシェーダー 三角形

三角形を定義しています。

DIM P(2),COL(3),PP(2)
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(P,X,Y)
      IF DISTANCE(P)<0 THEN
         CALL VEC3(COL,1,0,0)
      ELSE
         CALL VEC3(COL,0,0,0)
      END IF
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION TRIANGLE(P(),P0(),P1(),P2()) !距離関数 三角形
DIM E0(2),E1(2),E2(2),V0(2),V1(2),V2(2),PQ0(2),PQ1(2),PQ2(2),D(2)
MAT E0=P1-P0
MAT E1=P2-P1
MAT E2=P0-P2
MAT V0=P-P0
MAT V1=P-P1
MAT V2=P-P2
FOR I=1 TO 2
   LET PQ0(I)=V0(I)-E0(I)*CLAMP(DOT(V0,E0)/DOT(E0,E0),0,1)
   LET PQ1(I)=V1(I)-E1(I)*CLAMP(DOT(V1,E1)/DOT(E1,E1),0,1)
   LET PQ2(I)=V2(I)-E2(I)*CLAMP(DOT(V2,E2)/DOT(E2,E2),0,1)
NEXT I
LET S=SIGN(E0(1)*E2(2)-E0(2)*E2(1))
CALL VEC2(V0,DOT(PQ0,PQ0),S*(V0(1)*E0(2)-V0(2)*E0(1)))
CALL VEC2(V1,DOT(PQ1,PQ1),S*(V1(1)*E1(2)-V1(2)*E1(1)))
CALL VEC2(V2,DOT(PQ2,PQ2),S*(V2(1)*E2(2)-V2(2)*E2(1)))
FOR I=1 TO 2
   LET D(I)=MIN(MIN(V0(I),V1(I)),V2(I))
NEXT I
LET TRIANGLE=-SQR(D(1))*SIGN(D(2))
END FUNCTION

EXTERNAL  FUNCTION DISTANCE(P())
DIM P0(2),P1(2),P2(2)
CALL VEC2(P0,-.9,.1)
CALL VEC2(P1,.3,.5)
CALL VEC2(P2,-.5,-.8)
LET DISTANCE=TRIANGLE(P,P0,P1,P2)
!!LET DISTANCE=TRIANGLE(P,P0,P1,P2)-.1 ! 角を丸くする
!!LET DISTANCE=ABS(4*P(1)+(2*SQR(3))*ABS(P(2))-1)+2*SQR(3)*ABS(P(2))-3
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 SIGN(X)
IF X<0 THEN
   LET SIGN=-1
ELSEIF X>0 THEN
   LET SIGN=1
ELSE
   LET SIGN=0
END IF
END FUNCTION
 

戻る