2024/02/22(木) [n年前の日記]
#1 [prog] Premakeをインストールした
OpenGL利用時に、テクスチャの読み込みを簡単にしてくれる、soil(Simple OpenGL Image Library)というライブラリがある。
_lonesock.net: SOIL (WebArchive)
_littlstar/soil: Simple OpenGL Image Library
_SpartanJ/SOIL2: SOIL2 is a tiny C library used primarily for uploading textures into OpenGL.
この soil2 をビルドする際に premake なるツールが必要になるらしいので、Windows10 x64 22H2上でインストールしてみた。
_What is Premake? | Premake
_Download | Premake
premake-5.0.0-beta2-windows.zip を入手して解凍。中には複数のファイルが入っていた。
今回は、D:\Dev\premake\ に置いてみた。
premakeadd.bat というbatファイルを作って、使いたい時だけ環境変数PATHに追加するようにしておいた。
さておき。premake を使う時は、premake.exe ではなくて、premake5.exe というファイル名で呼び出せばいいのだろうか。
_lonesock.net: SOIL (WebArchive)
_littlstar/soil: Simple OpenGL Image Library
_SpartanJ/SOIL2: SOIL2 is a tiny C library used primarily for uploading textures into OpenGL.
この soil2 をビルドする際に premake なるツールが必要になるらしいので、Windows10 x64 22H2上でインストールしてみた。
_What is Premake? | Premake
_Download | Premake
premake-5.0.0-beta2-windows.zip を入手して解凍。中には複数のファイルが入っていた。
example.dll example.exp example.lib example.pdb luasocket.dll luasocket.exp luasocket.lib luasocket.pdb premake5.exe premake5.pdb
今回は、D:\Dev\premake\ に置いてみた。
premakeadd.bat というbatファイルを作って、使いたい時だけ環境変数PATHに追加するようにしておいた。
@echo off set PREMAKEPATH=D:\Dev\premake set PATH=%PREMAKEPATH%;%PATH% echo Premake enable. echo Add Path [%PREMAKEPATH%]
さておき。premake を使う時は、premake.exe ではなくて、premake5.exe というファイル名で呼び出せばいいのだろうか。
> premakeadd.bat Premake enable. Add Path [D:\Dev\premake] > premake5 --version premake5 (Premake Build Script Generator) 5.0.0-beta2
◎ MSYS2のパッケージがあった :
インストールした後で気づいたけど、MSYS2 でパッケージが用意されていた…。そっちをインストールすれば済んだかも…。
$ pacman -S mingw-w64-i686-premake mingw-w64-i686-premake4 mingw-w64-x86_64-premake mingw-w64-x86_64-premake4 $ which premake which: no premake in $ which premake5 /mingw64/bin/premake5 $ which premake4 /mingw64/bin/premake4 $ premake5 --version premake5 (Premake Build Script Generator) 5.0.0-dev $ premake4 --version premake4 (Premake Build Script Generator) 4.3
[ ツッコむ ]
#2 [prog] soil2をビルド
OpenGLで、テクスチャ画像のロードを楽にする、soli (または soil2) というライブラリがある。
_lonesock.net: SOIL (WebArchive)
_littlstar/soil: Simple OpenGL Image Library
_SpartanJ/SOIL2: SOIL2 is a tiny C library used primarily for uploading textures into OpenGL.
soil2 を Windows10 x64 22H2 + MSYS2 + mingw64 でビルドできるか試してみた。
_lonesock.net: SOIL (WebArchive)
_littlstar/soil: Simple OpenGL Image Library
_SpartanJ/SOIL2: SOIL2 is a tiny C library used primarily for uploading textures into OpenGL.
soil2 を Windows10 x64 22H2 + MSYS2 + mingw64 でビルドできるか試してみた。
◎ ビルド :
README.md 通りに作業していけば問題無いけど一応メモ。
Makefile を作るために Premake なるツールが必要になる。MSYS2の場合はパッケージが用意されているのでそれをインストールすればいい。ちなみに、MSYS2 上では pacman -Ss hoge でパッケージの検索ができて、pacman -S hoge でインストールできる。
git clone を使って、github から soil2 のソース一式を入手する。任意のフォルダで以下を実行。
premake5を使って、Makefile を作る。
make/windows/ というフォルダが作成されて、その中に色んな Makefile が作成された。中に入る。
makeを呼び出す際、config=xxxx と指定することで、以下の版の .dll、.lib が作れるらしい。
makeと打ってビルドする。MinGW64-x85_64 で作業していたので、x86_64 を選んでみた。
../../lib/windows/ 内に、以下の2つのファイルが生成された。
更に、../../bin/ 内に、以下の2つの実行サンプルも生成された。動作には SDL2 が必要らしい。
SDL2 は、MSYS2ならパッケージで用意されているのでインストールできる。
先ほど生成した 実行サンプルを実行してみる。色々なdllを要求されるけど、ひとまず、先ほど生成した soil2.dll を bin/ にコピー。他のdllは、MinGW64 の bin/ にパスが通っている状態なら、そちらから読み込んでくれる。
ということで、Windows10 x64 22H2 + MSYS2 で soil2 をビルドすることができると分かった。
MinGW64-x86_64 (64bit版) ではなく、MinGW64-i686 (32bit版) でも試してみた。そちらも同様に動いてくれた。.dll と .lib も生成された。
Makefile を作るために Premake なるツールが必要になる。MSYS2の場合はパッケージが用意されているのでそれをインストールすればいい。ちなみに、MSYS2 上では pacman -Ss hoge でパッケージの検索ができて、pacman -S hoge でインストールできる。
$ pacman -Ss premake $ pacman -S mingw-w64-i686-premake mingw-w64-i686-premake4 mingw-w64-x86_64-premake mingw-w64-x86_64-premake4
git clone を使って、github から soil2 のソース一式を入手する。任意のフォルダで以下を実行。
git clone https://github.com/SpartanJ/SOIL2.git cd SOIL2
premake5を使って、Makefile を作る。
premake5 gmake2
make/windows/ というフォルダが作成されて、その中に色んな Makefile が作成された。中に入る。
cd make/windows
makeを呼び出す際、config=xxxx と指定することで、以下の版の .dll、.lib が作れるらしい。
release_x86 release_x86_64 debug_x86 debug_x86_64
makeと打ってビルドする。MinGW64-x85_64 で作業していたので、x86_64 を選んでみた。
make config=release_x86_64
../../lib/windows/ 内に、以下の2つのファイルが生成された。
soil2.dll soil2.lib
更に、../../bin/ 内に、以下の2つの実行サンプルも生成された。動作には SDL2 が必要らしい。
soil2-perf-test-release.exe soil2-test-release.exe
SDL2 は、MSYS2ならパッケージで用意されているのでインストールできる。
$ pacman -Ss SDL2 $ pacman -S mingw-w64-i686-SDL2 mingw-w64-x86_64-SDL2
先ほど生成した 実行サンプルを実行してみる。色々なdllを要求されるけど、ひとまず、先ほど生成した soil2.dll を bin/ にコピー。他のdllは、MinGW64 の bin/ にパスが通っている状態なら、そちらから読み込んでくれる。
cd ../../bin/ ./soil2-test-release.exe ./soil2-perf-test-release.exe
- soil2-test-release.exe ... ウインドウが表示されて画像が描画された。
- soil2-perf-test-release.exe ... 画像群を読み込んで、かかった時間が表示された。
ということで、Windows10 x64 22H2 + MSYS2 で soil2 をビルドすることができると分かった。
MinGW64-x86_64 (64bit版) ではなく、MinGW64-i686 (32bit版) でも試してみた。そちらも同様に動いてくれた。.dll と .lib も生成された。
◎ 実行サンプルに必要なdll :
soil2-test-release.exe が要求するdllは以下。
つまり、以下のdllが別途必要になる。
soil2.dll 以外は、msys64/mingw64/bin/ の中からコピーしてくれば良さそう。bin/ に各dllをコピーしてみたら、MSYS2等にパスが通ってない状態でも soil2-test-release.exe が実行できた。
$ objdump -p soil2-test-release.exe | grep dll DLL Name: soil2.dll DLL Name: libgcc_s_dw2-1.dll DLL Name: KERNEL32.dll DLL Name: msvcrt.dll DLL Name: SDL2.dll DLL Name: SHELL32.dll DLL Name: libstdc++-6.dll
つまり、以下のdllが別途必要になる。
libgcc_s_dw2-1.dll libstdc++-6.dll SDL2.dll soil2.dll
soil2.dll 以外は、msys64/mingw64/bin/ の中からコピーしてくれば良さそう。bin/ に各dllをコピーしてみたら、MSYS2等にパスが通ってない状態でも soil2-test-release.exe が実行できた。
[ ツッコむ ]
#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行で済ませてくれるのはありがたいなと…。
[ ツッコむ ]
以上、1 日分です。