100 ' テクスチャ差し替え型バンプマッピングのテスト 110 ' ☆ C'sさん・Sternさん・NAKATHさん のネタを参考にさせてもらいましたー。感謝。 120 ' 130 SCREEN 0: DIM TX$(31) 140 ' 150 ' ▼ 高低差の情報(0〜31)を描画する 160 ' 170 W=32: ' テクスチャサイズ 180 FOR I=0 TO 1:FOR J=0 TO 1:FOR K=0 TO 4 190 F=I*W+W/2:G=J*W+W/2:L=W/2-7-K:LINE (F-L,G-L)-(F+L,G+L),K*&H7.FFFC,BF:NEXT K,J,I 200 GCOPY (0,0)-(W-1,W-1) TO TX$ 210 CLS 0:FOR I=0 TO 1:FOR J=0 TO 1:GCOPY TX$ TO (I*W,J*W):NEXT J,I 220 ' 230 ' ▼ Y方向の高さの変化量を計算 240 ' 250 FOR I=0 TO W-1:PX=W/2+I 260 P=POINT(PX,W/2-1) 270 FOR J=0 TO W-1:PY=W/2+J 280 Q=POINT(PX,PY) 290 PSET (W*2+I,J),P-Q+32 300 SWAP P,Q:NEXT J,I 310 ' 320 ' ▼ X方向の高さの変化量を計算 330 ' 340 FOR I=0 TO W-1:PY=W/2+I 350 P=POINT(W/2-1,PY) 360 FOR J=0 TO W-1:PX=W/2+J 370 Q=POINT(PX,PY) 380 PSET (W*3+J,I),P-Q+32 390 SWAP P,Q:NEXT J,I 400 '================== 410 ' 法線ベクトル計算 420 '================== 430 AX_=2:AY_=1:AZ_=1: ' 光線の方向ベクトル 440 DV=32 450 FOR K=0 TO DV-1: ' 光線のベクトルを回転して DV方向から光を当てる 460 AX= AX_ 470 AY=-XSIN(K/DV)*AZ_+XCOS(K/DV)*AY_ 480 AZ= XCOS(K/DV)*AZ_+XSIN(K/DV)*AY_ 490 ' 500 ' ▼ 各点における法線と光線との間のcosθ(L)を計算する 510 ' 520 FOR I=0 TO W-1:FOR J=0 TO W-1 530 T1=XATN(1,POINT(J+W*2,I)-32) 540 T2=XATN(1,POINT(J+W*3,I)-32) 550 BX=XSIN(T1)*XCOS(T2):BY=XSIN(T2):BZ=XCOS(T1)*XCOS(T2) 560 D=XDIST(AX,AY,AZ)*XDIST(BX,BY,BZ):IF D=0 THEN L=1 ELSE L=(AX*BX+AY*BY+AZ*BZ)/D 570 ' 580 ' ▼ Lから各点の色を計算する 590 ' 600 C=L*15+15:PSET (J,I),RGBADD(RGB(15,3,0),C,C,C) 610 NEXT J,I 620 ' 630 ' ▼ 各方向から光を当てた場合の計算結果をTX$に格納する 640 ' 650 GCOPY (0,0)-(W-1,W-1) TO TX$:TX$(K)=RIGHT$(TX$,W*W*2) 660 NEXT 670 '-------------------------------------- 680 SCREEN 5,,,1:COLOR,,,RGB(2,2,30):PRIORITY 10,4 690 '============== 700 ' ポリゴン定義 710 '============== 720 FOR I=0 TO 3:SETTEX I,W,W,32768:NEXT 730 VER_ID=VERTEXID(-1):SETVERTEX VER_ID,8 740 PW=40:FOR J=0 TO 1:FOR I=0 TO 3 750 SETVERTEX (XCOS(I/4)*PW/1.4,J*PW-PW,XSIN(I/4)*PW/1.4):NEXT I,J 760 SETPOLYGON 0,4,VER_ID:ATR_ID=ATRID(-1):SETATR ATR_ID,4 770 FOR I=0 TO 3:J=(I+1) AND 3 780 SETPOLYGON,(I,J,J+4,I+4):SETATR (0,1,2,I,0,0) 790 NEXT :OBJATR 1,0,ATR_ID:OBJTYPE 1,4:OBJLINK 1,0 800 '========== 810 ' 床の描画 820 '========== 830 ROTOVER 0:SETCHR 8,0,STRING$(64,94):SETCHR 8,1,STRING$(64,100) 840 FOR I=0 TO 10000:PUTCHR 8,(RND(512),RND(512)),2:NEXT 850 '---------------------------------------------- 860 R=200: CAM=0: 'ポリゴンまでの距離(R)と角度(CAM:0〜255) 870 '================ 880 ' メインルーチン 890 '================ 900 *MAIN 910 CAMERA (R*XCOS(CAM/256),-5,R*XSIN(CAM/256)) TO (0,0,0),BG 920 ' 930 ' ▼ パッド入力 940 ' 950 P=PAD(0,1) 960 IF P AND @PAD_L THEN CAM=(CAM+.5)AND! &HFF.FFFC 970 IF P AND @PAD_R THEN CAM=(CAM-.5)AND! &HFF.FFFC 980 IF P AND @PAD_UP THEN R=R-1 990 IF P AND @PAD_DOWN THEN R=R+1 1000 ' 1010 ' ▼ ポリゴンを回転させながら、角度に対応したテクスチャを貼り付ける 1020 ' 1030 FOR J=0 TO 3 1040 SETTEX J,W,W,32768,TX$((DV-J*(DV/4)+DV*(((CAM+RT) AND 255)/256) )MOD (DV-1)) 1050 OBJ(1,@YR)=((CAM+RT) AND! 255)/256 1060 NEXT :RT=(RT+&H0.2)AND! &HFF.FFFC 1070 VSYNC :GOTO *MAIN