フラグメントシェーダー 折り畳み abs関数

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時27分36秒
  フラグメントシェーダー 折り畳み abs関数

abs関数を使うと万華鏡のような効果をうみます。
(-1,-1)~(1,1)の範囲においてx=abs(x)とするとy軸対称になり
更にy=abs(y)とするとx軸対称になり万華鏡のようになります。

https://docs.google.com/presentation/d/12RrqyAkFanKmfL96ZHvhDCozE-_rKFPlU1YVwej4_bc/htmlpresent
※現在時刻(TIME)を使用しています。

DIM C(3),P(2),T(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)
LET TI=INT(TIME)
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)
      FOR K=0 TO 4
         FOR I=1 TO 2
            LET P(I)=ABS(1.5*P(I))-1
         NEXT I
         CALL ROTATE(P,TI*K)
      NEXT K
      FOR I=1 TO 2
         LET T(I)=1-SMOOTHSTEP(.01,.02,ABS(P(I)))
         LET C(I)=MIX(P(I),1,T(1)+T(2))
      NEXT I
      CALL SETCOLOR(C(1),C(2),.5)
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB ROTATE(A(),T)
DIM M(2,2)
LET S=SIN(T)
LET C=COS(T)
LET M(1,1)=C
LET M(1,2)=S
LET M(2,1)=-S
LET M(2,2)=C
MAT A=A*M
END SUB

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 MIX(X,Y,A)
LET MIX=X*(1-A)+Y*A
END FUNCTION

EXTERNAL  FUNCTION SMOOTHSTEP(A,B,X)
LET T=CLAMP((X-A)/(B-A),0,1)
LET SMOOTHSTEP=T*T*(3-2*T)
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
 

戻る