フラグメントシェーダー パーリンノイズ

 投稿者:しばっち  投稿日:2022年 2月11日(金)14時33分34秒
  フラグメントシェーダー  パーリンノイズ

ノイズ関数を定義してパーリンノイズを生成しています。
雲(霧?)のようなものを描きます。


DIM P(2),COL(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(P,X,Y)
      MAT P=3*P
      LET N=FBM(P)
      CALL VEC3(COL,N,N,N)
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  SUB SETCOLOR(R,G,B)
SET COLOR COLORINDEX(CLAMP(R,0,1),CLAMP(G,0,1),CLAMP(B,0,1))
END SUB

EXTERNAL  FUNCTION RANDOM(S())
DIM V(2)
CALL VEC2(V,12.9898,78.233)
LET RANDOM=FRACT(SIN(DOT(S,V))*43758.5453123)
END FUNCTION

EXTERNAL  FUNCTION NOISE(ST())
DIM I(2),F(2),U(2),I1(2),I2(2),I3(2)
FOR J=1 TO 2
   LET I(J)=FLOOR(ST(J))
   LET F(J)=FRACT(ST(J))
NEXT J
CALL VEC2(I1,1,0)
CALL VEC2(I2,0,1)
CALL VEC2(I3,1,1)
MAT I1=I1+I
MAT I2=I2+I
MAT I3=I3+I
LET A=RANDOM(I)
LET B=RANDOM(I1)
LET C=RANDOM(I2)
LET D=RANDOM(I3)
FOR J=1 TO 2
   LET U(J)=F(J)*F(J)*(3-2*F(J))
NEXT J
LET NOISE=MIX(A,B,U(1))+(C-A)*U(2)*(1-U(1))+(D-B)*U(1)*U(2)
END FUNCTION

EXTERNAL  FUNCTION FBM(ST())
LET VALUE=0
LET AMPLITUDE=.5
LET FREQUENCY=0
FOR I=0 TO 5
   LET VALUE=VALUE+AMPLITUDE*NOISE(ST)
   MAT ST=2*ST
   LET AMPLITUDE=AMPLITUDE*.5
NEXT I
LET FBM=VALUE
END FUNCTION

EXTERNAL  FUNCTION FRACT(X)
LET FRACT=X-INT(X)
END FUNCTION

EXTERNAL  FUNCTION FLOOR(X)
LET FLOOR=INT(X)
END FUNCTION

EXTERNAL  FUNCTION STEP(A,X)
IF X<A THEN LET STEP=0 ELSE LET STEP=1
END FUNCTION

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
 

戻る