2024/02/22(木) [n年前の日記]
#3 [basic] FreeBASICでsoilを使ってみる
FreeBASIC は、CPUによるソフトウェア処理の描画とは別に、OpenGLを使ったハードウェア処理による描画もできる。しかし、OpenGL を使う際にネックになるのが、テクスチャ画像の読み込みと変換。OpenGL自体には、テクスチャ画像ファイルを読み込んで、テクスチャとして使える形に変換してくれる機能が無い。そのあたりは自分で処理を書かないといけない。
FreeBASICの公式掲示板を眺めていたら、soil (libsoil) を使って、このあたりを楽に行う方法が紹介されていた。
_Simple OpenGL Image Library Windows/Linux 32/64-bit - freebasic.net
興味が湧いたので試用してみることにした。環境は Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit。
FreeBASICの公式掲示板を眺めていたら、soil (libsoil) を使って、このあたりを楽に行う方法が紹介されていた。
_Simple OpenGL Image Library Windows/Linux 32/64-bit - freebasic.net
興味が湧いたので試用してみることにした。環境は Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit。
◎ 関連ファイルを入手 :
前述のページから、libsoil.zip を入手する。解凍すると、中には以下のファイルが入っている。
libsoil32.so libsoil64.so OpenGL_RGB.png OpenGL_RGBA.png soil.bi soil32.dll soil64.dll test01.bas test02.bas
- *.so は Linux で使うファイル。
- *.dll は Windows で使うファイル。動的リンクライブラリ。
- soil.bi は、FreeBASICのソースからインポートするヘッダファイル。
- *.bas は、FreeBASIC のソースファイル。今回のサンプルファイル。
◎ コンパイルする :
fbc を使ってコンパイル。
test01.exe と test02.exe が生成された。
fbc test01.bas fbc test02.bas
test01.exe と test02.exe が生成された。
◎ 実行してみる :
test01.exe と test02.exe を実行してみる。
test01.exe の結果。
test02.exe の結果。
どちらも画像ファイルを表示できている。test01 のほうは不透明画像(RGB画像)、test02 のほうは半透明画像(RGBA画像)を描画している模様。
test01.exe の結果。
test02.exe の結果。
どちらも画像ファイルを表示できている。test01 のほうは不透明画像(RGB画像)、test02 のほうは半透明画像(RGBA画像)を描画している模様。
◎ ソースを見てみる :
test01.bas を眺めてみる。
最初のほうで、OpenGL関係のヘッダファイル(GL/gl.bi, GL/glu.bi)と、soil のヘッダファイル(soil.bi)を読み込んでいる。
テクスチャ画像ファイルの読み込みは、SOIL_load_OGL_texture() で行うようだなと…。たった1行で、画像ファイルの読み込み、OpenGLのテクスチャ用データへの変換、OpenGLのテクスチャ確保を行ってくれている模様。
その後は、screeninfo() でウインドウの横幅と縦幅を取得してから、OpenGL関係のいつもの長々とした初期化処理をして、ループ内で四角形を描画しつつテクスチャを画面に出している。ループの最後に flip を呼ぶことで、FreeBASIC は OpenGLのダブルバッファ切り替えをしてくれる。
テクスチャ画像の読み込み、変換、確保を、たった1行で済ませてくれるのはありがたいなと…。
#include once "GL/gl.bi" #include once "GL/glu.bi" #include once "soil.bi" ' test of RGB texture ChDir ExePath() ScreenRes 640,480,32,,2 var texture = SOIL_load_OGL_texture("OpenGL_RGB.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO) dim as integer w,h screeninfo w,h glViewport 0,0,w,h glMatrixMode GL_PROJECTION glLoadIdentity gluPerspective 45.0, w/h, 0.1, 100.0 glMatrixMode GL_MODELVIEW glLoadIdentity glClearColor 1,0,0,1 glShadeModel GL_SMOOTH glDisable GL_DEPTH_TEST glDepthFunc GL_LEQUAL glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST glEnable GL_TEXTURE_2D glBindTexture GL_TEXTURE_2D, texture do glClear GL_COLOR_BUFFER_BIT glBegin GL_QUADS glTexCoord2f 0,0:glVertex3f -.5, .25,-5 glTexCoord2f 1,0:glVertex3f .5, .25,-5 glTexCoord2f 1,1:glVertex3f .5,-.25,-5 glTexCoord2f 0,1:glVertex3f -.5,-.25,-5 glEnd flip loop while inkey=""
最初のほうで、OpenGL関係のヘッダファイル(GL/gl.bi, GL/glu.bi)と、soil のヘッダファイル(soil.bi)を読み込んでいる。
テクスチャ画像ファイルの読み込みは、SOIL_load_OGL_texture() で行うようだなと…。たった1行で、画像ファイルの読み込み、OpenGLのテクスチャ用データへの変換、OpenGLのテクスチャ確保を行ってくれている模様。
その後は、screeninfo() でウインドウの横幅と縦幅を取得してから、OpenGL関係のいつもの長々とした初期化処理をして、ループ内で四角形を描画しつつテクスチャを画面に出している。ループの最後に flip を呼ぶことで、FreeBASIC は OpenGLのダブルバッファ切り替えをしてくれる。
テクスチャ画像の読み込み、変換、確保を、たった1行で済ませてくれるのはありがたいなと…。
[ ツッコむ ]
以上です。