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