2019/03/20(水) [n年前の日記]
#1 [ruby][gosu] gosu + opengl-bindings で動くようにスクリプトを修正
gosu + opengl の書き方をチュートリアルっぽい流れで紹介してくれてる、gosu-opengl-tutorials というサンプルスクリプト群があるのだけど。
_tjbladez/gosu-opengl-tutorials: Fun with opengl, gosu and ruby
せっかく opengl-bindings を試したことだし、gosu + opengl-bindings でも動くように fork してみたり。
_gosu_examples_mieki256/gosu-opengl-tutorials_fork at master - mieki256/gosu_examples_mieki256
_tjbladez/gosu-opengl-tutorials: Fun with opengl, gosu and ruby
せっかく opengl-bindings を試したことだし、gosu + opengl-bindings でも動くように fork してみたり。
_gosu_examples_mieki256/gosu-opengl-tutorials_fork at master - mieki256/gosu_examples_mieki256
◎ ハマった個所。 :
glGetTexImage() を opengl-bindings で呼び出す際の書き方がわからなくて、ちょっとハマった。
_gosu_examples_mieki256/lesson07.rb at master - mieki256/gosu_examples_mieki256
opengl の場合は以下のように書けばいいのだけど。
結果的に、opengl-bindings の場合は、以下のように書いたら動くようになった。
少し説明すると…。
glGetTexImage() の最後の引数には、テクスチャを格納する領域のアドレスを渡してやらないといけないので、以下の式で領域のバイト数を求めて…。
このサイズ分の文字列が入る変数を作って…。
その変数を渡してやる。みたいな感じ。だと思う。たぶん。
適切なサイズを確保できてないと、何も言わずにRubyが落ちるので、ちょっと気を付けないといけない。
_gosu_examples_mieki256/lesson07.rb at master - mieki256/gosu_examples_mieki256
opengl の場合は以下のように書けばいいのだけど。
# opengl texture = glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST) gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 128, 128, GL_RGB, GL_FLOAT, texture)
結果的に、opengl-bindings の場合は、以下のように書いたら動くようになった。
# opengl-bindings w, h = @minimap.width, @minimap.height float_size = [0.0].pack("f").size texture = ' ' * (float_size * 4 * w * h) glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, texture) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST) gluBuild2DMipmaps(GL_TEXTURE_2D, 3, w, h, GL_RGB, GL_FLOAT, texture)
少し説明すると…。
glGetTexImage() の最後の引数には、テクスチャを格納する領域のアドレスを渡してやらないといけないので、以下の式で領域のバイト数を求めて…。
float1つ分 x RGBAの4つ分 x テクスチャの横ドット数 x 縦ドット数
このサイズ分の文字列が入る変数を作って…。
w, h = @minimap.width, @minimap.height float_size = [0.0].pack("f").size texture = ' ' * (float_size * 4 * w * h)
その変数を渡してやる。みたいな感じ。だと思う。たぶん。
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, texture)
適切なサイズを確保できてないと、何も言わずにRubyが落ちるので、ちょっと気を付けないといけない。
[ ツッコむ ]
以上、1 日分です。