SDL_TTFテキストをテキストではなくopenGL赤の広場にレンダリングする
-
27-10-2019 - |
質問
Windows XP、VS2010でSDLとSDL_TTFライブラリを使用してopenGLウィンドウにテキストをレンダリングしようとしています。
バージョン:
SDLバージョン1.2.14
SDLTTF開発1.2.10
openGL(バージョンは少なくとも2〜3年前のものです)。
SDL / SDL_imageを使用してopenGLウィンドウを正常に作成し、問題なくライン/ポリゴンをレンダリングできます。
ただし、テキストに移ると、現在のプログラムに何らかの欠陥があるようです。を試してみると、次の結果が得られます。このコードはこちら
ここにペーストビンを付けたくない人のために、重要なコードセグメントだけがあります: ジェネラコディセタグプレ
セグメント2: ジェネラコディセタグプレ
欠落している明らかなコードはありますか?
この件に関してご協力いただきありがとうございます。
私はopenGLとSDLを3日間学ぼうとしていますので、私の側の誤った情報はご容赦ください。
編集:
使用していることに気づきました
TTF_RenderUTF8_Shaded
TTF_RenderUTF8_Solid
nullポインタ例外をスローします。これは、実際のテキストレンダリング関数内にエラーがあることを意味します(おそらく)。これが、TTF_RenderUTF8_Blended
が赤い四角を返すことを意味するのかわかりませんが、すべての問題はこれにかかっていると思います。>
解決
問題は、画面にテキストを描画するたびに呼び出す必要のあるglEnable(GL_TEXTURE_2D)
関数とglDisable(GL_TEXTURE_2D)
関数にあると思います。また、SDLとGLサーフェス間の色変換も正しくない可能性があります。
私はcreate_texture
とdrawText
を組み合わせて、テキストを正しく表示する単一の関数にしました。それがコードです:
ジェネラコディセタグプレ
次のようにOpenGLを初期化しています: ジェネラコディセタグプレ
他のヒント
テキストサーフェスのコードにはTTF_RenderUTF8_Blended(fntCourier、text、clrFg)と記載されており、openglのブレンド機能を有効にする必要があるため、glEnable(GL_BLEND)を追加するだけでよいと思います。
編集
さて、私はついにあなたのコードをコンパイラーに通すのに時間をかけました。最も重要なのは、警告がエラーに変わるように、-Werror
を備えたコンパイラです
ジェネラコディセタグプレ
これはCコーダーの101のようなものであり、まったく予期しないものであるため、最初は表示されませんでした。ローカル変数へのポインターを返さないでください!。関数がスコープ外になると、返されるポインターはナンセンスのみを指します。なぜポインタを返すのですか?整数を返すだけです: ジェネラコディセタグプレ
このため、後でテクスチャを削除することもありません。それをOpenGLにアップロードしますが、それからそれへの参照を失います。
コードにglEnable(GL_TEXTURE_2D)
がないため、テクスチャの効果を確認できません。ただし、テクスチャの使用は最適ではありません。彼らはあなたがそれをしたように、あなたがそのテキストを描くつもりであるたびにあなたは全く新しいテクスチャを再作成します。それがアニメーションループで発生した場合は、
-
テクスチャメモリがすぐに不足します 大幅に遅くします(1)は、再描画するたびに新しいテクスチャ名を生成しないことで対処できます(2)は、テキストが変更されたときにのみ新しいテクスチャデータをアップロードし、glTexImage2DではなくglTexSubImage2Dを使用することでアドレス指定できます(もちろん、テクスチャのサイズが変更された場合は、glTexImage2Dである必要があります)。編集、別の考えられる問題を見つけましたが、最初にポインタの問題を修正してください。
GL_REPLACEまたはGL_MODULATEテクスチャ環境モードを使用していることを確認する必要があります。 GL_DECALまたはGL_BLENDを使用すると、赤いクワッドに赤いテキストが表示されます。
以前の投稿で関数のメモリリークがあり、しばらくするとプログラムがクラッシュしました... テクスチャの読み込みと表示を分離することでこれを改善しました:
最初の関数はSDLループの前に呼び出す必要があります。テキスト文字列をメモリにロードします:
読み込まれるすべての文字列には、異なるtxtNumパラメータが必要です ジェネラコディセタグプレ
2つ目は文字列を表示し、SDLループで呼び出す必要があります: ジェネラコディセタグプレ