忍者ブログ
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール
HN:
[-_-;] (みかん)
性別:
男性
趣味:
プログラミング、XOPS
自己紹介:
中部地方在住です。
最新コメント
[11/30 NONAME]
[11/22 NONAME]
[09/24 NONAME]
[06/10 NONAME]
[01/29 NONAME]
XOPS関連サイト「みかん箱」の運営や、OpenXOPSの開発などを行う[-_-;](みかん)のブログ。近状報告や独り言などを書きます。
Prev Month123456789101112131415161718192021222324252627282930Next Month
GLUTなしでglGenTextures()関数を使う
このブログ初の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]
PR
COMMENTS
【本文以外は任意項目です】
SUBJECT(タイトル)
NAME(お名前)
MAIL(メールアドレス)
HOME(サイトURL)
COMMENT(本文)
PASS(削除パスワード)
Secret?(管理者へのみ表示)

※スパム防止のため「Hello!」「website」「ブランド」「みかんの戦闘ブログ」
「http」などの一部キーワードを禁止しています。ご了承ください。

※過去のブログ記事は 原則として編集・修正していません。
 各記事の内容は投稿時のものであり、現在では異なる場合があります。
 最新の情報は、関係する内容について書かれた 最新の記事をご覧ください。

TOP