HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0306
youdaiHSP3 64Bit版で、OpenGLの64Bit版を使用したいです4解決


youdai

リンク

2024/3/6(Wed) 18:54:41|NO.101379

HSP3 64Bit版で、OpenGLの64Bit版を使用したいです。

試しに前回質問に使ったスクリプト( https://hsp.tv/play/pforum.php?mode=all&num=101276 )をそのままhsp3_64で実行してみたのですが、動きませんでした。
恐らく、#uselibの関連付けの部分が64bit版のそれらのライブラリと合わないのだと思うのですが、よく分かりません。

他にも以下のようなことが分かりません。

・以下のようなスクリプトの場合、intの部分はhspint64等を使用してint64化して渡した方がいいのでしょうか?

hspint64(hsp3_64でint64を使用可にするモジュール)
https://hsp.moe/#hspint64

・64bit版のglu32.dllはあるのでしょうか?
 代替ライブラリとしてfreeGlutというものがあるらしいのですが、64bit環境ではそちらを使った方がいいのでしょうか?

freeGlut
https://freeglut.sourceforge.net/


#include "hsp3_64.as" #define global PFD_TYPE_RGBA 0 #define global PFD_MAIN_PLANE 0 #define global GL_MODELVIEW $1700 #define global GL_NORMALIZE $0BA1 #define global GL_AUTO_NORMA $0D80 #define global GL_SMOOTH $1D01 #define global GL_DEPTH_TEST $0B71 #define global GL_PROJECTION $1701 #define global GL_POLYGON_OFFSET_FILL $8037 #define global GL_COLOR_BUFFER_BIT $4000 #define global GL_DEPTH_BUFFER_BIT $0100 #define global GL_LINES $0001 #define global GL_LINE_LOOP $0002 #define global GL_POLYGON $0009 #uselib "opengl32.dll" #func global glClearColor "glClearColor" int,int,int,int #func global glClear "glClear" int #func global glColor3d "glColor3d" double,double,double #func global glBegin "glBegin" int #func global glVertex2d "glVertex2d" double,double #func global glVertex3d "glVertex3d" double,double,double #func global glNormal3d "glNormal3d" double,double,double #func global glEnd "glEnd" #func global glFlush "glFlush" #func global glRotated "glRotated" double,double,double,double #func global glLightfv "glLightfv" int,int,int #func global glLightModelfv "glLightModelfv" int,int,int #func global glMaterialfv "glMaterialfv" int,int,int #func global glEnable "glEnable" int #cfunc global wglCreateContext "wglCreateContext" int #func global wglDeleteContext "wglDeleteContext" int #func global wglMakeCurrent "wglMakeCurrent" int,int #func global glMatrixMode "glMatrixMode" int #func global glLoadIdentity "glLoadIdentity" #func global glViewport "glViewport" int,int,int,int #cfunc global glGenLists "glGenLists" int #func global glNewList "glNewList" int,int #func global glEndList "glEndList" #func global glShadeModel "glShadeModel" int #func global glPushMatrix "glPushMatrix" #func global glCallList "glCallList" int #func global glPopMatrix "glPopMatrix" #func global glDisable "glDisable" int #func global glLineWidth "glLineWidth" int #func global glTranslated "glTranslated" double,double,double #func global glPolygonOffset "glPolygonOffset" int,int ;画像関係らしき命令を追加 #func global glGenTextures "glGenTextures" int, sptr #func global glBindTexture "glBindTexture" int, int #func global glTexImage2D "glTexImage2D" int, int, int, int, int, int, int, int, sptr #func global glReadPixels "glReadPixels" int, int, int, int, int, int, sptr #func global glTexCoord2f "glTexCoord2f" float, float ;アフィン変換系及びその他 #func global glRotatef "glRotatef" float, float, float, float #func global glScaled "glScaled" double, double, double #func global glScalef "glScalef" float, float, float #func global glTranslatef "glTranslatedf" float, float, float #func global glColor3f "glColor3f" float, float, float #func global glVertex2f "glVertex2f" float, float #func global glTexEnvi "glTexEnvi" int,int,int #func global glTexParameteri "glTexParameteri" int,int,int #define global GL_TEXTURE_2D 0x0DE1 #define global GL_RGBA 0x1908 #define global GL_UNSIGNED_BYTE 0x1401 #define global GL_REPLACE 0x1E01 #define global GL_TEXTURE_ENV 0x2300 #define global GL_TEXTURE_ENV_MODE 0x2200 #define global GL_TEXTURE_ENV_COLOR 0x2201 #define global GL_LINEAR 0x2601 #define global GL_TEXTURE_MAG_FILTER 0x2800 #define global GL_TEXTURE_MIN_FILTER 0x2801 #uselib "glu32.dll"//Win32API #func global gluLookAt "gluLookAt" double,double,double,double,double,double,double,double,double #func global gluPerspective "gluPerspective" double,double,double,double #uselib "gdi32.dll"//Win32API #func global SwapBuffers "SwapBuffers" int #cfunc global ChoosePixelFormat"ChoosePixelFormat" int,int #func global SetPixelFormat "SetPixelFormat" int,int,int #uselib "user32.dll"//Win32API #cfunc global GetDC "GetDC" int #func global ReleaseDC "ReleaseDC" int,int ;-------------------------------------------------------------------------------------------------------------------- ; モジュール部分 #ifndef hsp3_opengl #module hsp3_opengl #define PFD_TYPE_RGBA 0 #define PFD_DOUBLEBUFFER 0x01 #define PFD_DRAW_TO_WINDOW 0x04 #define PFD_SUPPORT_OPENGL 0x20 #define PFD_MAIN_PLANE 0 //double を floatに変換する #defcfunc d2f double d_ d=d_ f=0 asdf=lpeek(d, 4) f = asdf & 0x80000000 if d ! 0 { f |= (((asdf >> 20) & 0x7FF) -896) << 23 f |= (asdf << 3) & 0x7FFFFF f |= (lpeek(d, 0) >> 29) & 7 } return f //ウィンドウにOpenGLを関係付ける #deffunc GLinit dim pfd ,24 pfd(0) =96 ; nSize pfd(1) =1 ; nVersion pfd(2) =PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ; dwFlags pfd(3) =PFD_TYPE_RGBA ; iPixelType pfd(4) =32 ; cColorBits pfd(17)=16 ; cDepthBits pfd(18)=0 ; cStencilBits pfd(20)=PFD_MAIN_PLANE ; iLayerType WinDC=GetDC(hwnd) pixelFormat = ChoosePixelFormat( WinDC,varptr(pfd) ) if (0 >= pixelFormat) : dialog "0", 1, "pixelFormat error" : end mes "pixelFormat" stop SetPixelFormat WinDC,pixelFormat,varptr(pfd) hRC = wglCreateContext( WinDC ) wglMakeCurrent WinDC, hRC //オブジェクト描画モードにする。 glMatrixMode GL_MODELVIEW ;オブジェクト描画モード glLoadIdentity ////////////////////////////////////////////// //必要な機能の有効化 // ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL ;glShadeModel GL_SMOOTH ;GL_SMOOTHでないと頂点カラーは使用できない glShadeModel GL_FLAT ;初期値 glEnable GL_DEPTH_TEST ;Zバッファを使用する return #deffunc GLcamera double u_fov, double u_aspect, double u_near, double u_far, int u_sw fov = u_fov aspect = u_aspect near = u_near far = u_far sw = u_sw return #deffunc GLview w=ginfo_winx h=ginfo_winy glMatrixMode GL_PROJECTION ;投影モード glLoadIdentity if sw == 0 { gluPerspective fov, 1.0*w/h, near, far } else { ;#func global glOrtho "glOrtho" double, double, double, double, double, double ;glOrtho } glViewport 0, 0, w , h glMatrixMode GL_MODELVIEW ;オブジェクト描画モード return #deffunc GLdraw glFlush SwapBuffers WinDC return ;vramからHSP3の指定のバッファへOpenGLの画像を送る命令 #deffunc glScreenShot int _p1 gsel _p1 title "ScreenShot" redraw 0 pos 0, 0 mref _vram_ScreenShot, 66 id = varptr(_vram_ScreenShot) ;_vramの部分は直接指定ではなく、ポインタ指定 glReadPixels 0, 0, ginfo_sx, ginfo_sy, GL_BGR_EXT, GL_UNSIGNED_BYTE, id redraw 1 ;ddim _vram_ScreenShot, 0;変数クリア return //キューブを作る #deffunc glmakeCube double x,double y,double z,int mode glBegin mode glNormal3d 1,0,0 glVertex3d x, -y, -z glVertex3d x, y, -z glVertex3d x, y, z glVertex3d x, -y, z glEnd glBegin mode glNormal3d -1,0,0 glVertex3d -x, -y, -z glVertex3d -x, y, -z glVertex3d -x, y, z glVertex3d -x, -y, z glEnd glBegin mode glNormal3d 0,1,0 glVertex3d -x, y, -z glVertex3d x, y, -z glVertex3d x, y, z glVertex3d -x, y, z glEnd glBegin mode glNormal3d 0,-1,0 glVertex3d -x, -y, -z glVertex3d x, -y, -z glVertex3d x, -y, z glVertex3d -x, -y, z glEnd glBegin mode glNormal3d 0,0,1 glVertex3d -x, -y, z glVertex3d x, -y, z glVertex3d x, y, z glVertex3d -x, y, z glEnd glBegin mode glNormal3d 0,0,-1 glVertex3d -x, -y, -z glVertex3d x, -y, -z glVertex3d x, y, -z glVertex3d -x, y, -z glEnd return //終了時に開放する #deffunc ReleaseOpenGL onexit wglMakeCurrent WinDC,0 wglDeleteContext hRC ReleaseDC hwnd,WinDC return #global #endif ;-------------------------------------------------------------------------------------------------------------------- #const WAITTIME 1000 / 60 gosub *make_rgba gosub *setup goto *main ;ノイズを作成 *make_rgba c = 512*512*4 color_id = 0 alloc buf_rgba, c repeat c if color_id == 0 { ;rの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 1 { ;gの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 2 { ;bの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 3 { ;aの部分は常に255 poke buf_rgba, cnt, $ff color_id=0 } else { color_id++ } loop buf_rgba_pointa = varptr(buf_rgba) return *setup bgscr 0, 1024, 768, 0, 0, 0 gsel 0 pos 0, 0 GLinit glClearColor d2f(0.118), d2f(0.255), d2f(0.353), 0.0 r=M_PI/4 glPolygonOffset d2f(1.1), d2f(1.1) ;テクスチャ生成 glEnable GL_TEXTURE_2D ;テクスチャ機能を有効 glTexImage2D GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, varptr(buf_rgba) ; ここフィルター方法 glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ; ここポリゴンの色との合成方法。置き換えにした(初期値は混ぜる) glTexEnvi GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ;glTexImage2D GL_TEXTURE_2D, 0, 4, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf_rgba return *main glPopMatrix ;座標系を展開 glPushMatrix ;座標系を記憶 ;カメラ設定 GLCamera 40, 0.333333, 0.5, 128.0, 0 ;ウィンドウサイズにおける表示域の設定(ウィンドウリサイズの際に呼ばれるべき) GLview ;クリアーカラーにもとづいて 背景塗りつぶし glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ;カメラ位置 x,y,z カメラ目標位置 x,y,z カメラ上方向ベクトル x,y,z gluLookAt sin(r)*30,10,cos(r)*30, 0,0,0, 0,1,0 //////////////////////描画領域はじめ////////////////////// glEnable GL_TEXTURE_2D ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL glEnable GL_POLYGON_OFFSET_FILL glEnable GL_DEPTH_TEST gosub *draw_etc_line glPushMatrix ;カレント位置を記憶 a += 2.0 glScalef 2.0, 2.0, 2.0 glTranslated 3,1,3 glRotatef a, 0.1, 0.1, 0.1 gosub *draw_test gosub *draw_wire_and_obj glPopMatrix ;ずれたカレントを前回記憶した座標に元に戻す ;pokeで自作したrgbaデータでも表示されるので、openGLに読み込まれていることは確定 ;ただしこれを直接呼ぶと画面の深度値がおかしくなるので注意 ;glDrawPixels 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, buf_rgba_pointa //////////////////////描画領域おわり////////////////////// GLdraw ;描画&画面更新 r+=0.005 ;カメラのXZ平面上の角度を加算する stick key,15+256 if key&128 : end await WAITTIME goto *main *draw_test ;とりあえずの色指定(この色がそのままポリゴンに描写されていたらテクスチャ適用失敗) glColor3f 0.0,0.0,1.0 glEnable GL_TEXTURE_2D ; ★有効にして ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL glEnable GL_POLYGON_OFFSET_FILL glEnable GL_DEPTH_TEST glBindTexture GL_TEXTURE_2D, GLtexID.0 ;テクスチャをバインド ;講座用のものを移植してみたが・・・ glBegin GL_POLYGON glTexCoord2f 0 , 0: glVertex2f -0.9 , -0.9 glTexCoord2f 0 , 1: glVertex2f -0.9 , 0.9 glTexCoord2f 1 , 1: glVertex2f 0.9 , 0.9 glTexCoord2f 1 , 0: glVertex2f 0.9 , -0.9 glEnd glDisable GL_TEXTURE_2D ; ★無効にする return *draw_wire_and_obj glColor3d 1.0, 0.0, 0.0 ;色 (赤) glLineWidth 1.0 ;線幅 ;glDisable GL_TEXTURE_2D ;テクスチャを無効 glMakeCube 1,1,1,GL_LINE_LOOP ;ワイヤーでできた箱を作る return *draw_etc_line //軸の線を描画 glLineWidth 2.0 //線幅 glBegin GL_LINES //glColor3d の0.0〜1.0は hspのcolorでいうところの0〜255 と等価 glColor3d 1.0, 0.0, 0.0//赤 glVertex3d 0, 0, 0//x glVertex3d 30, 0, 0 glEnd glBegin GL_LINES glColor3d 0.0, 1.0, 0.0//緑 glVertex3d 0, 0, 0//y glVertex3d 0, 30, 0 glEnd glBegin GL_LINES glColor3d 0.0, 0.0, 1.0 //青 glVertex3d 0, 0, 0//z glVertex3d 0, 0, 30 glEnd return

アドバイスお願いいたします。



この記事に返信する


TOMATO

リンク

2024/3/7(Thu) 01:20:12|NO.101388

64bit版のdupptrやvarptrが正常に動作していないので、使用しないようにコードを改良する必要があります。
(本来は64bitで返ってくるべきはずの値が32bitに切られてしまっているので…)

hspint64 を使用しても回避できるかと。
(varptrが64bitで取得できるように修正されます)

>以下のようなスクリプトの場合、intの部分はhspint64等を使用して
する必要はないです。
varptrを使っているところのみ、細工をする必要がありますけども。

>64bit版のglu32.dllはあるのでしょうか?
32bit版も64bit版も同じglu32.dllという名前ですが、違うフォルダにあります。
glu64.dll みたいな名前ではない点は注意ですね。

64bit版:C:\Windows\System32\glu32.dll
32bit版:C:\Windows\SysWOW64\glu32.dll

【修正コード】

#include "hsp3_64.as" #define global PFD_TYPE_RGBA 0 #define global PFD_MAIN_PLANE 0 #define global GL_MODELVIEW $1700 #define global GL_NORMALIZE $0BA1 #define global GL_AUTO_NORMA $0D80 #define global GL_SMOOTH $1D01 #define global GL_DEPTH_TEST $0B71 #define global GL_PROJECTION $1701 #define global GL_POLYGON_OFFSET_FILL $8037 #define global GL_COLOR_BUFFER_BIT $4000 #define global GL_DEPTH_BUFFER_BIT $0100 #define global GL_LINES $0001 #define global GL_LINE_LOOP $0002 #define global GL_POLYGON $0009 #uselib "opengl32.dll" #func global glClearColor "glClearColor" int,int,int,int #func global glClear "glClear" int #func global glColor3d "glColor3d" double,double,double #func global glBegin "glBegin" int #func global glVertex2d "glVertex2d" double,double #func global glVertex3d "glVertex3d" double,double,double #func global glNormal3d "glNormal3d" double,double,double #func global glEnd "glEnd" #func global glFlush "glFlush" #func global glRotated "glRotated" double,double,double,double #func global glLightfv "glLightfv" int,int,int #func global glLightModelfv "glLightModelfv" int,int,int #func global glMaterialfv "glMaterialfv" int,int,int #func global glEnable "glEnable" int #cfunc global wglCreateContext "wglCreateContext" int #func global wglDeleteContext "wglDeleteContext" int #func global wglMakeCurrent "wglMakeCurrent" int,int #func global glMatrixMode "glMatrixMode" int #func global glLoadIdentity "glLoadIdentity" #func global glViewport "glViewport" int,int,int,int #cfunc global glGenLists "glGenLists" int #func global glNewList "glNewList" int,int #func global glEndList "glEndList" #func global glShadeModel "glShadeModel" int #func global glPushMatrix "glPushMatrix" #func global glCallList "glCallList" int #func global glPopMatrix "glPopMatrix" #func global glDisable "glDisable" int #func global glLineWidth "glLineWidth" int #func global glTranslated "glTranslated" double,double,double #func global glPolygonOffset "glPolygonOffset" int,int ;画像関係らしき命令を追加 #func global glGenTextures "glGenTextures" int, sptr #func global glBindTexture "glBindTexture" int, int #func global glTexImage2D "glTexImage2D" int, int, int, int, int, int, int, int, var #func global glReadPixels "glReadPixels" int, int, int, int, int, int, var #func global glTexCoord2f "glTexCoord2f" float, float ;アフィン変換系及びその他 #func global glRotatef "glRotatef" float, float, float, float #func global glScaled "glScaled" double, double, double #func global glScalef "glScalef" float, float, float #func global glTranslatef "glTranslatedf" float, float, float #func global glColor3f "glColor3f" float, float, float #func global glVertex2f "glVertex2f" float, float #func global glTexEnvi "glTexEnvi" int,int,int #func global glTexParameteri "glTexParameteri" int,int,int #define global GL_TEXTURE_2D 0x0DE1 #define global GL_RGBA 0x1908 #define global GL_UNSIGNED_BYTE 0x1401 #define global GL_REPLACE 0x1E01 #define global GL_TEXTURE_ENV 0x2300 #define global GL_TEXTURE_ENV_MODE 0x2200 #define global GL_TEXTURE_ENV_COLOR 0x2201 #define global GL_LINEAR 0x2601 #define global GL_TEXTURE_MAG_FILTER 0x2800 #define global GL_TEXTURE_MIN_FILTER 0x2801 #uselib "glu32.dll"//Win32API #func global gluLookAt "gluLookAt" double,double,double,double,double,double,double,double,double #func global gluPerspective "gluPerspective" double,double,double,double #uselib "gdi32.dll"//Win32API #func global SwapBuffers "SwapBuffers" int #cfunc global ChoosePixelFormat"ChoosePixelFormat" int,var #func global SetPixelFormat "SetPixelFormat" int,int,var #uselib "user32.dll"//Win32API #cfunc global GetDC "GetDC" int #func global ReleaseDC "ReleaseDC" int,int ;-------------------------------------------------------------------------------------------------------------------- ; モジュール部分 #ifndef hsp3_opengl #module hsp3_opengl #define PFD_TYPE_RGBA 0 #define PFD_DOUBLEBUFFER 0x01 #define PFD_DRAW_TO_WINDOW 0x04 #define PFD_SUPPORT_OPENGL 0x20 #define PFD_MAIN_PLANE 0 //double を floatに変換する #defcfunc d2f double d_ d=d_ f=0 asdf=lpeek(d, 4) f = asdf & 0x80000000 if d ! 0 { f |= (((asdf >> 20) & 0x7FF) -896) << 23 f |= (asdf << 3) & 0x7FFFFF f |= (lpeek(d, 0) >> 29) & 7 } return f //ウィンドウにOpenGLを関係付ける #deffunc GLinit dim pfd ,24 pfd(0) =96 ; nSize pfd(1) =1 ; nVersion pfd(2) =PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ; dwFlags pfd(3) =PFD_TYPE_RGBA ; iPixelType pfd(4) =32 ; cColorBits pfd(17)=16 ; cDepthBits pfd(18)=0 ; cStencilBits pfd(20)=PFD_MAIN_PLANE ; iLayerType WinDC=GetDC(hwnd) pixelFormat = ChoosePixelFormat( WinDC,pfd ) if (0 >= pixelFormat) : dialog "0", 1, "pixelFormat error" : end SetPixelFormat WinDC,pixelFormat,pfd hRC = wglCreateContext( WinDC ) wglMakeCurrent WinDC, hRC //オブジェクト描画モードにする。 glMatrixMode GL_MODELVIEW ;オブジェクト描画モード glLoadIdentity ////////////////////////////////////////////// //必要な機能の有効化 // ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL ;glShadeModel GL_SMOOTH ;GL_SMOOTHでないと頂点カラーは使用できない glShadeModel GL_FLAT ;初期値 glEnable GL_DEPTH_TEST ;Zバッファを使用する return #deffunc GLcamera double u_fov, double u_aspect, double u_near, double u_far, int u_sw fov = u_fov aspect = u_aspect near = u_near far = u_far sw = u_sw return #deffunc GLview w=ginfo_winx h=ginfo_winy glMatrixMode GL_PROJECTION ;投影モード glLoadIdentity if sw == 0 { gluPerspective fov, 1.0*w/h, near, far } else { ;#func global glOrtho "glOrtho" double, double, double, double, double, double ;glOrtho } glViewport 0, 0, w , h glMatrixMode GL_MODELVIEW ;オブジェクト描画モード return #deffunc GLdraw glFlush SwapBuffers WinDC return ;vramからHSP3の指定のバッファへOpenGLの画像を送る命令 #deffunc glScreenShot int _p1 gsel _p1 title "ScreenShot" redraw 0 pos 0, 0 mref _vram_ScreenShot, 66 // id = varptr(_vram_ScreenShot) ;_vramの部分は直接指定ではなく、ポインタ指定 glReadPixels 0, 0, ginfo_sx, ginfo_sy, GL_BGR_EXT, GL_UNSIGNED_BYTE, _vram_ScreenShot redraw 1 ;ddim _vram_ScreenShot, 0;変数クリア return //キューブを作る #deffunc glmakeCube double x,double y,double z,int mode glBegin mode glNormal3d 1,0,0 glVertex3d x, -y, -z glVertex3d x, y, -z glVertex3d x, y, z glVertex3d x, -y, z glEnd glBegin mode glNormal3d -1,0,0 glVertex3d -x, -y, -z glVertex3d -x, y, -z glVertex3d -x, y, z glVertex3d -x, -y, z glEnd glBegin mode glNormal3d 0,1,0 glVertex3d -x, y, -z glVertex3d x, y, -z glVertex3d x, y, z glVertex3d -x, y, z glEnd glBegin mode glNormal3d 0,-1,0 glVertex3d -x, -y, -z glVertex3d x, -y, -z glVertex3d x, -y, z glVertex3d -x, -y, z glEnd glBegin mode glNormal3d 0,0,1 glVertex3d -x, -y, z glVertex3d x, -y, z glVertex3d x, y, z glVertex3d -x, y, z glEnd glBegin mode glNormal3d 0,0,-1 glVertex3d -x, -y, -z glVertex3d x, -y, -z glVertex3d x, y, -z glVertex3d -x, y, -z glEnd return //終了時に開放する #deffunc ReleaseOpenGL onexit wglMakeCurrent WinDC,0 wglDeleteContext hRC ReleaseDC hwnd,WinDC return #global #endif ;-------------------------------------------------------------------------------------------------------------------- #const WAITTIME 1000 / 60 gosub *make_rgba gosub *setup goto *main ;ノイズを作成 *make_rgba c = 512*512*4 color_id = 0 alloc buf_rgba, c repeat c if color_id == 0 { ;rの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 1 { ;gの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 2 { ;bの部分はランダム poke buf_rgba, cnt, rnd(255) } if color_id == 3 { ;aの部分は常に255 poke buf_rgba, cnt, $ff color_id=0 } else { color_id++ } loop buf_rgba_pointa = varptr(buf_rgba) return *setup bgscr 0, 1024, 768, 0, 0, 0 gsel 0 pos 0, 0 GLinit glClearColor d2f(0.118), d2f(0.255), d2f(0.353), 0.0 r=M_PI/4 glPolygonOffset d2f(1.1), d2f(1.1) ;テクスチャ生成 glEnable GL_TEXTURE_2D ;テクスチャ機能を有効 glTexImage2D GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf_rgba ; ここフィルター方法 glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ; ここポリゴンの色との合成方法。置き換えにした(初期値は混ぜる) glTexEnvi GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ;glTexImage2D GL_TEXTURE_2D, 0, 4, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf_rgba return *main glPopMatrix ;座標系を展開 glPushMatrix ;座標系を記憶 ;カメラ設定 GLCamera 40, 0.333333, 0.5, 128.0, 0 ;ウィンドウサイズにおける表示域の設定(ウィンドウリサイズの際に呼ばれるべき) GLview ;クリアーカラーにもとづいて 背景塗りつぶし glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ;カメラ位置 x,y,z カメラ目標位置 x,y,z カメラ上方向ベクトル x,y,z gluLookAt sin(r)*30,10,cos(r)*30, 0,0,0, 0,1,0 //////////////////////描画領域はじめ////////////////////// glEnable GL_TEXTURE_2D ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL glEnable GL_POLYGON_OFFSET_FILL glEnable GL_DEPTH_TEST gosub *draw_etc_line glPushMatrix ;カレント位置を記憶 a += 2.0 glScalef 2.0, 2.0, 2.0 glTranslated 3,1,3 glRotatef a, 0.1, 0.1, 0.1 gosub *draw_test gosub *draw_wire_and_obj glPopMatrix ;ずれたカレントを前回記憶した座標に元に戻す ;pokeで自作したrgbaデータでも表示されるので、openGLに読み込まれていることは確定 ;ただしこれを直接呼ぶと画面の深度値がおかしくなるので注意 ;glDrawPixels 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, buf_rgba_pointa //////////////////////描画領域おわり////////////////////// GLdraw ;描画&画面更新 r+=0.005 ;カメラのXZ平面上の角度を加算する stick key,15+256 if key&128 : end await WAITTIME goto *main *draw_test ;とりあえずの色指定(この色がそのままポリゴンに描写されていたらテクスチャ適用失敗) glColor3f 0.0,0.0,1.0 glEnable GL_TEXTURE_2D ; ★有効にして ;glEnable GL_NORMALIZE ;glEnable GL_AUTO_NORMAL glEnable GL_POLYGON_OFFSET_FILL glEnable GL_DEPTH_TEST glBindTexture GL_TEXTURE_2D, GLtexID.0 ;テクスチャをバインド ;講座用のものを移植してみたが・・・ glBegin GL_POLYGON glTexCoord2f 0 , 0: glVertex2f -0.9 , -0.9 glTexCoord2f 0 , 1: glVertex2f -0.9 , 0.9 glTexCoord2f 1 , 1: glVertex2f 0.9 , 0.9 glTexCoord2f 1 , 0: glVertex2f 0.9 , -0.9 glEnd glDisable GL_TEXTURE_2D ; ★無効にする return *draw_wire_and_obj glColor3d 1.0, 0.0, 0.0 ;色 (赤) glLineWidth 1.0 ;線幅 ;glDisable GL_TEXTURE_2D ;テクスチャを無効 glMakeCube 1,1,1,GL_LINE_LOOP ;ワイヤーでできた箱を作る return *draw_etc_line //軸の線を描画 glLineWidth 2.0 //線幅 glBegin GL_LINES //glColor3d の0.0〜1.0は hspのcolorでいうところの0〜255 と等価 glColor3d 1.0, 0.0, 0.0//赤 glVertex3d 0, 0, 0//x glVertex3d 30, 0, 0 glEnd glBegin GL_LINES glColor3d 0.0, 1.0, 0.0//緑 glVertex3d 0, 0, 0//y glVertex3d 0, 30, 0 glEnd glBegin GL_LINES glColor3d 0.0, 0.0, 1.0 //青 glVertex3d 0, 0, 0//z glVertex3d 0, 0, 30 glEnd return



usagi

リンク

2024/3/7(Thu) 01:30:02|NO.101389

スクリプトは時間がかかってしまいそうなので、
アドバイス程度になりますがコメントさせていただきます。


>#uselibの関連付けの部分が64bit版のそれらのライブラリと合わない
>64bit版のglu32.dllはあるのでしょうか?

System32(64bit)とSysWOW64(32bit)どちらのフォルダにも
opengl32.dll, glu32.dllがあるので使えそうな気はします。

※Windowsの32bit,64bitライブラリの置き場所はご存じでしょうか?
 困ったらこれらのフォルダを見るとよろしいと思います。C\Windowsにあります。

>intの部分はhspint64等を使用してint64化して渡した方がいいのでしょうか?

関数が32bitのintとして値を受け取る場合はとくに不要かとは思われます。
変数のポインタを渡すなどはhspint64で64bitのintポインタ取得が必要です。
※64bit版のポインタは64bitになりますので
※現状のHSPではちょっと苦労しないと取得できないので

HSPの64bit版はβテスト版ですから、現状対応するには#funcではなく、
SQLeleの64bit化スレッドの時の様に関数呼び出しを
Hspint64のcallfuncに置き換えてみてはいかがでしょうか?

openglというより、gdi32やuser32以下の時点でポインタが正しく受渡できてませんので、
まずはそこから始めるのがよろしいかと思いました。

WinDC=GetDC(hwnd) pixelFormat = ChoosePixelFormat( WinDC,varptr(pfd) )

>64bit環境ではそちらを使った方がいいのでしょうか?
GLUTは開発終了してますので、 freeglutに乗り換えるのはアリかもしれませんが、
使いたい機能やバグがなければGLUTが動くのであれば乗り換えなくても問題は無いのかとは思います。
(windowsのデフォにはfreeglutは入ってませんので)

先にも書きましたが、gdi,userの移植がまずできてませんので、
検討はその次でよろしかと思いました。



usagi

リンク

2024/3/7(Thu) 01:32:00|NO.101390

あっ、更新かけたら被ってましたすみません。
TOMATOさん動いてる!すごい!!



youdai

リンク

2024/3/8(Fri) 20:56:32|NO.101397

> TOMATO さん

>64bit版のdupptrやvarptrが正常に動作していないので、使用しないようにコードを改良する必要があります。
>(本来は64bitで返ってくるべきはずの値が32bitに切られてしまっているので…)

アドバイスありがとうございます。
頂いた修正版のサンプルの動作を確認しました。
64bit版では頂いたアドバイスを参考に、#func関係の当該部分を書き直すことにします。

> usagi さん

>glu32.dll関係について

>System32(64bit)とSysWOW64(32bit)どちらのフォルダにも
>opengl32.dll, glu32.dllがあるので使えそうな気はします。

>GLUTは開発終了してますので、 freeglutに乗り換えるのはアリかもしれませんが、
>使いたい機能やバグがなければGLUTが動くのであれば乗り換えなくても問題は無いのかとは思います。
>(windowsのデフォにはfreeglutは入ってませんので)

アドバイスありがとうございます。
freeGlutについては、参考にしているHPが使用することを勧めていたこともあって検討していました。
しかし、今のところglu32.dllの機能で使用しているのはgluLookAtとgluPerspectiveだけなので、
32bit版と同じく64bit版でもglu32.dllを使ってみることにします。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101379への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.