VL-BASICでCylinder 第1回
VL-BASICのリアルタイムレイトレーシング
(フォトンマッピング)で透明シリンダーを
描画しました。
計算はCPUのみで行っています。
陰をぼかすため球光源にしました。
GPU MATERIAL(PHOTON.ON, PHOTONS) '--- 光子を使用する(球光源)
GPU MATERIAL(PHOTON.ON, PHOTON ) '--- 光子を使用する(点光源)
VL-BASIC(N88-BASIC互換?)ホームページへのリンク
ホームページに書いてあるパスワードを入力して、
Readme.txtを読んで、遊んで見て下さい。
vl20604(cyl001.bas)もダウンロードできます。
下記リストをマウスで選択しCtrl+cでコピーし、
NL-BASICの画面でAlt+v(Ctrl+vではないので注意)
でプログラムを読込めます。
cyl001.bas
1000 '-----------------------------------------------------------------------
1010 ' Cylinder No.1 by ULproject for VL-BASIC
1020 '-----------------------------------------------------------------------
1025 DEF FNMOD(X, Y) = X - INT(X / Y) * Y
1030 CMD GPU ON '--- GPU命令を有効にする
1040 GPU SYNC(ON) '--- すべての表示をGPU描画に同期させる
1050 CLS 3
1060 COLOR 4
1070 '--- init
1080 T0 = 0 '--- FPS用
1090 TC = 0 '--- FPS用
1100 TA = 0.5
1110 D = 0
1120 '--- Photon
1130 GPU TRACE(PHOTON.RAYS , 100000 ) '--- Photon総数
1140 GPU MATERIAL(PHOTON.ON, PHOTONS) '--- 光子を使用する(球光源)
1150 GPU MATERIAL(PHOTON.N , 50*4 ) '--- 光子検索最大数をnにする
1160 GPU MATERIAL(PHOTON.R , 30*4 ) '--- 光子検索半径をrにする
1170 GOSUB *SUN
1180 GOSUB *WALL
1190 GOSUB *CYLINDER
1200 '--- main
1210 *START
1220 GPU MATRIX(IDENTITY) '--- 単位行列(位置のリセット)にする
1230 GPU TRANSLATE(0, 0, -3000) '--- 移動
1240 WHILE 1
1250 T1 = TIME(1000) '--- fps
1260 GOSUB *FPS '--- fps表示
1270 GPU LIST(CALL, 0) '--- 光源
1280 GPU LIST(CALL, 1) '--- 壁
1290 GPU MATRIX(PUSH) '--- 行列(位置)退避
1300 GPU TRANSLATE(0, 100, 0)
1310 GPU ROTATE(D, 1, 0, 0) '--- x軸周りの回転
1320 D = FNMOD(D + TA, 360)
1330 GPU LIST(CALL, 2) '--- cylinder
1340 GPU MATRIX(POP) '--- 行列(位置)戻す
1350 GOSUB *TRACE
1360 WEND
1370 END '--- 不必要(気休め)
1380 '---
1390 *FPS
1400 TC = TC+1
1410 IF T1-T0 < 1000 THEN RETURN
1420 TC = CINT((TC*1000)/(T1-T0))
1430 CLS
1440 PRINT TC;"fps ";
1450 TC = 0
1460 T0 = T1
1470 RETURN
1480 '---
1490 *SUN
1500 GPU MATRIX(IDENTITY)
1510 GPU MATERIAL(PUSH) '--- 物体情報退避
1520 GPU LIST(NEW, 0)
1530 GPU TRANSLATE(800, 100, 300) '--- x軸, y軸, z軸
1540 S = 1.0E+6
1550 GPU MATERIAL(LIGHT , S,S*0.8,S*0.6) '--- 光源の光の色と強さ
1560 S = 1.44
1570 GPU MATERIAL(SPECULAR , S,S*0.8,S*0.6) '--- 反射した光の色と強さ
1580 GPU MATERIAL(SHININESS, 20) '--- 大:鋭く,小:鈍く輝く
1590 GPU MATERIAL(DIFFUSE , 0,0,0) '--- 無色(黒)
1600 GPU MATERIAL(CLARITY , 1,1,1) '--- 完全に透明
1610 GPU MATERIAL(REFRACT , 1) '--- 屈折率1.0
1620 GPU SPHERE(50) '--- 球を置く
1630 GPU LIST(END)
1640 GPU MATERIAL(POP) '--- 物体情報戻す
1650 RETURN
1660 '---
1670 *WALL
1680 GPU MATRIX(IDENTITY)
1690 GPU MATERIAL(PUSH)
1700 GPU LIST(NEW, 1)
1710 GPU TRANSLATE(1000, 750, 500)
1720 GPU MATERIAL(DIFFUSE, 1.0, 1.0, 1.0) '--- 拡散反射係数
1730 GPU PRIM(OP , NOT) '--- 内側を表にする
1740 GPU PRIM(BOX, 1800, 1500, 3000) '--- Boxの内側を置く
1750 GPU LIST(END)
1760 GPU MATERIAL(POP)
1770 RETURN
1780 '---
1790 *CYLINDER
1800 GPU MATRIX(IDENTITY)
1810 GPU MATERIAL(PUSH)
1820 GPU LIST(NEW, 2)
1830 GPU ROTATE(-90, 1, 0, 0)
1840 GPU BOUND(BEGIN, 200)
1850 GPU MATERIAL(DIFFUSE, 0.2, 0.4, 1.0) '--- 色
1860 GPU MATERIAL(CLARITY, 0.2, 0.4, 1.0) '--- 完全に透明
1870 GPU MATERIAL(REFRACT, 1.2) '--- 屈折率
1880 GPU PRIM(DISK, 0, 140, 150) '--- water
1890 GPU BOUND(END)
1900 GPU LIST(END)
1910 GPU MATERIAL(POP)
1920 RETURN
1930 '--- レイトレース開始
1940 *TRACE
1950 GPU CLEAR '--- 描画バッファをクリア
1960 GPU TRACE(BEGIN) '--- レイトレーシングの準備
1970 GPU TRACE '--- レイトレーシング
1980 GPU TRACE(END) '--- レイトレーシングの後始末(画面表示)
1990 RETURN