2024/05/28(火) [n年前の日記]
#1 [prog] OpenGLのglBitmap()関係を再勉強中
_以前作ったスクリーンセーバ
を、サブPC上で動かしてみたところ、FPSやテキストメッセージが表示されなくて悩んでしまった。OpenGLを利用しているスクリーンセーバで、文字描画には glBitmap() を利用しているのだけど…。不具合を解決できないか色々調べていた。
ちなみに、メインPC(GeForce GTX 1060 6GB)上では文字描画ができている。サブPCは AMD製オンボードGPU(Radeon R3, GCN世代)だからダメなのだろうか…?
ちなみに、メインPC(GeForce GTX 1060 6GB)上では文字描画ができている。サブPCは AMD製オンボードGPU(Radeon R3, GCN世代)だからダメなのだろうか…?
◎ z値関連を修正してみた :
glOrtho() に指定している zNear と zFar の範囲が広すぎて、z値の分解能?に問題が出ているのだろうか。そのあたりをギリギリ狭くするように修正してみた。
また、フェードイン、フェードアウト用のポリゴンを描画する際のz値や、glBitmap() を呼ぶ際のz値を、0.001単位ではなく、1.0単位でずらすように修正してみた。
そもそも、デプステストで問題が起きているのであれば、デプステストを止めてしまえばいいのではないか…。glBitmap() を使う時だけ、glDisable(GL_DEPTH_TEST) を呼んで無効化してみた。
色々試してたら、文字描画がされるようになった。どこが効いてくれたのかよく分かってないけど…。
また、フェードイン、フェードアウト用のポリゴンを描画する際のz値や、glBitmap() を呼ぶ際のz値を、0.001単位ではなく、1.0単位でずらすように修正してみた。
そもそも、デプステストで問題が起きているのであれば、デプステストを止めてしまえばいいのではないか…。glBitmap() を使う時だけ、glDisable(GL_DEPTH_TEST) を呼んで無効化してみた。
色々試してたら、文字描画がされるようになった。どこが効いてくれたのかよく分かってないけど…。
◎ glBitmap()の色が反映されない :
一応文字描画はされるようになったけれど、文字の色が何故か黒になってしまう。白で描画するように指定しているはずなのに…。
改めて調べたところ、OpenGL には描画色とラスター色という2つの概念があるそうで。一般的なポリゴンは描画色で描画されるけど、glBitmap() はラスター色で描画されるらしい。
そのラスター色は何を使って指定するのかというと…。glColor() 等の描画色指定関数を呼んでおいた状態で、glRasterPos*() 系を呼ぶことで、描画色がラスター色として設定されて、その色でロックされる、ということらしい。
_Coloring a bitmap - OpenGL Wiki
_glColor not being used by glBitmap - OpenGL / OpenGL: Basic Coding - Khronos Forums
つまり、glColor4f() を呼んでから glRasterPos3f() を呼ぶ、といった順番なら問題ないはず。逆の順番では反映されない。
ただ、今回、順番はあっているのだよな…。
他にも調べてみたところ、「照明を無効化せよ」という話も見かけた。となると、マテリアルの利用も無効化しておいたほうがいいだろうか…。そのあたりごっそり無効化してみた。
この状態で、ようやく指定した色で文字描画されるようになった。
改めて調べたところ、OpenGL には描画色とラスター色という2つの概念があるそうで。一般的なポリゴンは描画色で描画されるけど、glBitmap() はラスター色で描画されるらしい。
そのラスター色は何を使って指定するのかというと…。glColor() 等の描画色指定関数を呼んでおいた状態で、glRasterPos*() 系を呼ぶことで、描画色がラスター色として設定されて、その色でロックされる、ということらしい。
_Coloring a bitmap - OpenGL Wiki
_glColor not being used by glBitmap - OpenGL / OpenGL: Basic Coding - Khronos Forums
つまり、glColor4f() を呼んでから glRasterPos3f() を呼ぶ、といった順番なら問題ないはず。逆の順番では反映されない。
ただ、今回、順番はあっているのだよな…。
他にも調べてみたところ、「照明を無効化せよ」という話も見かけた。となると、マテリアルの利用も無効化しておいたほうがいいだろうか…。そのあたりごっそり無効化してみた。
glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); glDisable(GL_COLOR_MATERIAL); glDisable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D);
この状態で、ようやく指定した色で文字描画されるようになった。
◎ 白線の高さも修正 :
道路の上に置いて描画している白線のポリゴンも、サブPC上ではチラチラしてしまっている。道路のポリゴンと距離が近すぎるのではないか…。
これも、+0.01 ほどずらしてたところを、+1.0 でずらしてみた。これならチラつかない描画になった。見た目が不自然になるかなと思ったけれど、特に気にならない感じなので、これでいいかな…。
これも、+0.01 ほどずらしてたところを、+1.0 でずらしてみた。これならチラつかない描画になった。見た目が不自然になるかなと思ったけれど、特に気にならない感じなので、これでいいかな…。
[ ツッコむ ]
以上です。