|
|
|
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
アドバイスお願いいたします。
| |
|
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
| |
|
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の移植がまずできてませんので、
検討はその次でよろしかと思いました。
|
|
2024/3/7(Thu) 01:32:00|NO.101390
あっ、更新かけたら被ってましたすみません。
TOMATOさん動いてる!すごい!!
|
|
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を使ってみることにします。
|
|