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

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

#4548
#4549
#4550
#4551
#4552



OpenGLのシェーダー言語GLSLをもとにしています。
フラグメントシェーダーでは各ドットに対して色を決めて描画していくもので
使用する描画コマンドはPLOT POINTSのみです。PLOT LINESやDRAW文は使いません。

各R,G,Bを0~1までの数値で表したフルカラーを使います。
WINDOWは(-1,-1)-(1,1)として原点(0,0)を中心とした正方形領域を想定しています。


フラグメントシェーダーにはMOD関数による繰り返しやABS関数による折り畳み
ブーリアン演算などがあります。


フラグメントシェーダーでは基本的に距離関数というものを定義して描画していきます。
その距離関数の正体は陰関数(f(x,y)=0)です。y=f(x)もy-f(x)=0とすれば陰関数になります。
陰関数なのでf(x,y)<0ならその内側になり、f(x,y)>0なら外側になります。

ここではy=3*sin(2*x)^3+sin(x)^2-2*sin(3*x)のグラフを描画しています。


なお、シェーダー言語GLSL(WebGL)ではGPUをごりごりに使用したアニメーション表示です。(GPUで暖がとれる!?)
見ているだけでも楽しいのでぜひアクセスしてみてください。

https://glslsandbox.com/
https://glslsandbox.com/e#78473.0
https://glslsandbox.com/e#78672.0
https://glslsandbox.com/e#78754.0
https://glslsandbox.com/e#78747.0
https://glslsandbox.com/e#78666.0
https://glslsandbox.com/e#78263.0
https://glslsandbox.com/e#78701.0
https://glslsandbox.com/e#78390.0


DIM P(2),COL(3),CC(3),B(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) !! SET WINDOW -1,1,-1,1
CALL VEC3(CC,1,.4,.1)
FOR YY=0 TO YSIZE-1
   FOR XX=0 TO XSIZE-1
      LET X=(XX*2-XSIZE)/MIN(XSIZE,YSIZE) ! -1~1
      LET Y=(YY*2-YSIZE)/MIN(XSIZE,YSIZE) ! -1~1
      CALL VEC2(P,X,Y)
      MAT P=5*P
      IF ABS(MOD(P(1),1))<.02 OR ABS(MOD(P(2),1))<.02 THEN CALL VEC3(B,.2,.2,.2) ELSE CALL VEC3(B,0,0,0)
      IF ABS(P(1))<.03 OR ABS(P(2))<.03 THEN CALL VEC3(B,.5,.5,.5)
      LET L=ABS(DISTANCE(P)-.6)
      IF L<>0 THEN
         LET F=.1/L
      ELSE
         LET F=1
      END IF
      MAT COL=F*CC
      MAT COL=COL+B
      CALL SETCOLOR(COL(1),COL(2),COL(3))
      PLOT POINTS:X,Y
   NEXT XX
NEXT YY
END

EXTERNAL  FUNCTION DISTANCE(P()) !距離関数 y=3*sin(2*x)^3+sin(x)^2-2*sin(3*x)
LET DISTANCE=3*SIN(2*P(1))^3+SIN(P(1))^2-2*SIN(3*P(1))-P(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
 

戻る