GLUTなしでglGenTextures()関数を使う | 2015.03.07 02:44 |
このブログ初の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を始めたばかりで良く分かっていません。
よって、記述の正当性や効率・動作速度などは、自信も保証も一切ありません。
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を始めたばかりで良く分かっていません。
よって、記述の正当性や効率・動作速度などは、自信も保証も一切ありません。
category : ソフト・ツール開発 | comment [0] |