2024/01/11(木) [n年前の日記]
#1 [prog] C言語で宇宙飛行スクリーンセーバっぽい描画をするプログラムを書いてみた
_先日、
Python + PyOpenGL を使って、宇宙飛行スクリーンセーバ(ssstars.scr)っぽい描画をするスクリプトを書いたのだけど。ソレを、C言語 + OpenGL (+ freeglut) 用に移植してみた。
環境は、Windows10 x64 22H2 + MinGW (gcc 6.3.0) or MSYS2 MINGW64 (gcc 13.2.0) + freeglut 3.0.0 or 3.4.0-2。
環境は、Windows10 x64 22H2 + MinGW (gcc 6.3.0) or MSYS2 MINGW64 (gcc 13.2.0) + freeglut 3.0.0 or 3.4.0-2。
◎ ソースその他 :
ソースが長くなってしまったので、gist に置いておく。
_Like ssstars screensaver for C and OpenGL
一応ココにも置いておくけど…。
_01_ssstars_opengl.c
_Makefile.txt
_texture.h
_texture.png
stbライブラリ(stb_image.h) を使ってpngを読み込んでいるので、ビルドには stb_image.h も必要。入手して、.c と同じ階層に置く。
_stb/stb_image.h at master - nothings/stb
_nothings/stb: stb single-file public domain libraries for C/C++
_Like ssstars screensaver for C and OpenGL
一応ココにも置いておくけど…。
_01_ssstars_opengl.c
_Makefile.txt
_texture.h
_texture.png
stbライブラリ(stb_image.h) を使ってpngを読み込んでいるので、ビルドには stb_image.h も必要。入手して、.c と同じ階層に置く。
_stb/stb_image.h at master - nothings/stb
_nothings/stb: stb single-file public domain libraries for C/C++
◎ ビルド :
Makefile も用意したので、MinGW (gcc 6.3.0) が使える状態で make と打てば、01_ssstars_opengl.exe が生成される。
◎ 実行結果 :
01_ssstars_opengl.exe を実行すると以下のような感じの見た目になる。
◎ 今回のポイント :
今回書いたプログラムのポイントは…。
exeファイルにpng画像を含めるあたりは、xxd を使って、バイナリファイルをC言語のヘッダファイルの状態に変換して、#include で .c に内包してしまうことで実現してる。
_xxdというコマンドがあることを知った - mieki256's diary
安直かもしれないけれど、確実と言えば確実かなと…。ただ、バイナリのファイルサイズが大き過ぎる場合は問題が出てくるかもしれない。その場合は objcopy を使うことになるのかも。
_objcopyについて調べていた - mieki256's diary
メモリ上のpng画像バイナリを読み込むあたりは、stbライブラリ(stb_image.h)を使用。
- exeファイルの中にpng画像を含めてみた。これで、画像を描画するプログラムも、exeファイル1つを配布するだけで済む。別途、画像ファイルまで配布しなくて良い。
- メモリ上(exeファイル内)のpng画像バイナリを読み込んで OpenGLのテクスチャとして利用している。
exeファイルにpng画像を含めるあたりは、xxd を使って、バイナリファイルをC言語のヘッダファイルの状態に変換して、#include で .c に内包してしまうことで実現してる。
_xxdというコマンドがあることを知った - mieki256's diary
安直かもしれないけれど、確実と言えば確実かなと…。ただ、バイナリのファイルサイズが大き過ぎる場合は問題が出てくるかもしれない。その場合は objcopy を使うことになるのかも。
_objcopyについて調べていた - mieki256's diary
メモリ上のpng画像バイナリを読み込むあたりは、stbライブラリ(stb_image.h)を使用。
[ ツッコむ ]
以上です。