[PR] | 2025.04.04 04:25 |
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
category : |
カレンダー
プロフィール
最新記事
(10/15)
(06/17)
(01/09)
(12/14)
(06/20) カテゴリー
|
XOPS関連サイト「みかん箱」の運営や、OpenXOPSの開発などを行う[-_-;](みかん)のブログ。近状報告や独り言などを書きます。
| |||
PR
このブログ初のOpenGLネタです。 OpenXOPSの件で試しに使ってみると、ハマった点があったのでメモメモ。 OpenGL 1.1でテクスチャをGPUに転送する場合、glTexImage2D()関数が使えます。 複数のテクスチャを使う場合も、その都度glTexImage2D()関数で転送することも 不可能ではないですが、枚数・種類や切り替えタイミングが増えるとパフォーマンス に影響します。 そこで、OpenGL独自の「テクスチャオブジェクト」と呼ばれるものを作成し、予め必要 なテクスチャを転送しておくことで、(毎フレーム大量のテクスチャ情報を転送する必要 がなくなり)パフォーマンスが向上します。 glGenTextures()関数でテクスチャオブジェクトを作成、glBindTexture()関数を用いて バウンド(指定)します。後はglTexImage2D()関数で転送します。 毎フレーム描画する際に、必要に応じて再度glBindTexture()関数を呼び出せば、 予め設定したテクスチャを指定できるっといった感じです。 テクスチャオブジェクトは、不要になった時点でglDeleteTextures()関数で解放します。 (OpenGLの詳しい使い方は、他の文献を参考にしてください。) 何も知らずに、逐一glTexImage2D()関数でテクスチャを転送する設計で作ってしまい ました (汗 描画の高速化を試みるため、テクスチャオブジェクトを活用することにしたのですが、 うまくテクスチャが読み込めません。 VC++のデバック機能を活用して色々調べた結果、テクスチャオブジェクトを作成する glGenTextures()関数の動作がおかしそうだと気が付いたものの、サンプル通りの 関数呼び出し手順や引数でも動かず困っていました。 各参考文献と明らかに異なる点は、GLUT(OpenGL Utility Toolkit)を使う前提の サンプルが多い中、自分は使っていない点です。 まさかと思いGLUTとの関係性を調べてみると、どうやらGLUTを正しく初期化しない と動作しないとの解説を発見。 あぁこりゃダメだ っと諦めかけたその時、デバイスコンテキストを正しく用意してあげ れば動作するとの報告が。 そんなこんなで、GLUTを一切使用しなくてもWinAPIで動作させることに無事成功 したので書いておきます。 -------------------------------------------------------------------------------- //デバイスコンテキストのハンドルを取得 HDC hDC = GetDC(hWnd); //カレントコンテキストに設定 wglMakeCurrent(hDC, hGLRC); //テクスチャオブジェクトを生成 glGenTextures(1 , &textureobj); //デバイスコンテキストのハンドルを解放 ReleaseDC(hWnd, hDC); -------------------------------------------------------------------------------- (全角スペースがいっぱい入っているのでお気を付けあれ~) とりあえずこれで動きました。 経験豊富な方からすれば、もっと効率的で良いやり方があるかもしれません。 注意: 使用環境は、Windows7 VC++2008 OpenGL 1.1です。 OpenGLを始めたばかりで良く分かっていません。 よって、記述の正当性や効率・動作速度などは、自信も保証も一切ありません。
COMMENTS
【本文以外は任意項目です】
※過去のブログ記事は 原則として編集・修正していません。 | ||||
△ TOP |