忍者ブログ
カレンダー
07 2026/08 09
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
プロフィール
HN:
[-_-;] (みかん)
性別:
男性
趣味:
プログラミング、XOPS
自己紹介:
東海地方在住です。
最新コメント
[11/30 NONAME]
[11/22 NONAME]
[09/24 NONAME]
[06/10 NONAME]
[01/29 NONAME]
XOPS関連サイト「みかん箱」の運営や、OpenXOPSの開発などを行う[-_-;](みかん)のブログ。近状報告や独り言などを書きます。
Prev Month12345678910111213141516171819202122232425262728293031Next 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
OpenXOPSをOpenGLに移植してみた
えぇ、もう3月じゃん。 <急にどうした

Invisible Alpaca主催の、第十回親睦戦に参加してきました。
パックは「Qq」で、私のプレイヤー名は xopsplayer でした。
マップと武器が最後まで分からず、まともな戦略を立てないまま場の
流れで適当にやっていたので、終始”動く的”になっていましたw


前にちょっと書いた通り、OpenXOPSをOpenGLに移植してみました。


(クリックで拡大)

本家XOPSはDirectX 8.1、OpenXOPSは現状DirectX 9.0cを使っています
が、今回グラフィック周りをOpenGLに乗せ換えてみました。
OpenXOPSはRev.55を元に、グラフィック周りをOpenGL 1.1に移植して
います。 コンパイル環境はVC++2008です。
基本的にはD3DGraphicsクラスをごっそり入れ替えただけで、他の部分は
殆ど触れていません。

OpenGLとか初めて触ったので、色々分からないことがたくさんあって大変
でした。 にしても、初めてOpenGLを使って作った3Dゲームで、いきなり
XOPSレベルのFPSゲームになるとは・・・。


上の画像ではうまく誤魔化していますが、実は致命的な問題点が2点あり
ます。
 ・テクスチャは.bmpファイルと.ddsファイルしか対応してない
 ・システムフォントの表示に非対応

前者は、テクスチャの読み込み部分を独自に書いているためです。その
フォーマットを選んだ理由は、とりあえずTENNKUU氏のグラフィックデータ
に対応させるため。
残念ながら殆どのaddonは、正しくマップが表示されません。
まともに使うならば、llibjpegとlibpngを乗せるか、OpenCVでも使うべきだ
と思います。

後者は、OpenGLをやったことある人なら分かる通り、Windowsに依存す
る部分で、なんか面倒くさかっただけ。
まぁ、標準ミッションプレイするだけなら、ブリーフィング文章とかイベント
メッセージくらい読めなくても大して問題ないですし。

これら以外にも細かな不具合がありますが、まぁ近いうちに修正できるで
しょう。きっと。


なお今回はVC++を使いましたが、BorlandC++でもそのままコンパイル
できました。
さらに一部ヘッダーファイルを追加すれば、GCC(MinGW使用)でも無事
にコンパイルできるようです。

今回の成果物であるOpenGLのソースは、近いうちにOpenXOPS自体にも
載せる予定です。
標準では、今まで通りDirectXのプログラムをコンパイルする設定にしておき、
定数を変更することでOpenGLを有効化してコンパイルできるようにする
つもりです。
category : ソフト・ツール開発 comment [1]
OpenXOPS 1.011 を公開
記事にするのが少々遅くなってしまったので、既にご存じの方も多いと思い
ますが、OpenXOPSのバージョン「1.011」を公開しました。


1月10日のOpenXOPSソースコード公開に合わせて、1.000をリリースしよ
うとしたところ、バイナリ版の公開を忘れたままになっていました。

そして2月20日に、1.010を公開しました。
ソースコードを公開する以前まで、「デモ版」としてアップデートしてきまし
たが、ソースコードが公開された今、正規リリースとして初のバイナリ版公開
でした。

ところが、投入した1.010において、致命的なバグが見つかりました。
”小物破壊待ち”イベントを追加小物に対して使用すると、正しく動作しない
という深刻な不具合です。
正規リリースはある程度タイミングを考慮して行うつもりで、本問題も次回
リリース時に修正することも考えました。
しかし、本問題により正常に動作しないaddonが続発する可能性もあった
ので、2月22日に急遽バージョンアップを行いました。


既に1.010を入手された方、極めて短期間の更新でお手数をお掛けします。
また、今まで「デモH」版を使われていた方、大変お待たせしました。

デモHと比べ1.011は比べ物にならないほど進化しています。
ぜひお試しくださいませ。


OpenXOPSの開発自体は、細かな改善も行いつつ、最近OpenGLへの
移植を試みています。
全体的には概ね良い感じです。詳細は後日の記事にします。
category : ソフト・ツール開発 comment [0]
ダラダラとレーダーを開発
ブログを書こうとすると、書く直前に何かしらのコメントを頂けるようで、
非常にありがたいです。
「コメントが来てから慌てて書いているのではないか?」と疑われると
筋の通った反論がないのですが、決してそんなことはないです。

ブログを10日近く書いていなかった理由ですが、ネタもあり何度か
書こうとしたものの、上手く文章がまとめられず投稿しませんでした。
 (途中まで書いた記事を、何本かボツにしました。)
他のネタを書くなり、適当に書くなりで、とりあえず何か書くべきでした。
すいませんでした。


OpenXOPSですが、レーダー機能を実装してみました。
当然、例のコンソールから呼び出す仕掛けです。


(クリックで拡大)

ちょっと前まで、他のFPSネタを持ち出しながら「レーダーがほしい」と
言っていたユーザーがいましたが、彼らに触発されたわけではないです
よ、えぇ。 表向きには デバック(開発)用機能 です。
そのまま使っても良いですが、他にも色々応用できそうです。

上の画像だと上手く動いているように見えますが、実際には結構ボロ
がある不完全なシステムです。改良の余地アリ。
人の位置を表示するのは対して難しくなく、むしろマップを表示するの
が非常に大変でした。
意外に凝った作りで、複雑な階層構造(BUILDINGやRELICなど)の
マップでも、各階のマップを表示します。なお、予め用意した画像など
ではなく、毎フレームリアルタイムに算出しています。
 ・・・どう? 凄いでしょ? えぇ、そうでもない?

使ってみた感想。
 『どこに敵と味方がいるか丸見えで、緊張感がない超ゆとりゲー』

多分、後日リリースする正規(バイナリ)版にも乗せると思います。
ってか、いつになるのだろうか・・・。
一応説明書っぽい何かも作ったのだけれども、クソ マニュアル (^^
category : ソフト・ツール開発 comment [0]
弾の当たり判定を作り直したい
ここ数日は学業忙しくて、OpenXOPSに関する大掛かりな作業は
できませんでした。
もうちょっとすると学業の一件は終わるのですが、それら以外にも
片付けなくてはいけないことがあるので、あまり「暇」というわけでは
ないです。


OpenXOPSの開発ですが、手榴弾が爆発した際のダメージ判定と
計算部分を作り直していました。(コミット済み)

今まで、人と小物へのダメージ判定と計算を、humanクラスとsmall
objectクラスで個別に行っていましたが、今回の改良でObjectManager
クラスに判定と計算を集約しました。
また、処理を関数化することで、ObjectManagerクラスのProcess()
関数の可読性の向上を狙っています。
これで、手榴弾の爆発時の処理が銃弾の処理に近くなり、当初より
マシになっていると思います。

今後は、弾の当たり判定を作り直したいです。
ObjectManagerクラスのCollideBullet()関数がとんでもない状態に
なっているので、手を打ちたいとは思っています。
マップとの当たり判定は良さそうですが、人と小物との当たり判定
が本家と違うようなので、解析し直さなくてはいけませんね。


後は、人とマップとの当たり判定をなんとかしたり、人とカメラの制御
を改善したり、バイナリ版用に正規の説明書を作ったり。

以下報告ですが、Doxygenの使い方を解説することにしました。
設定ファイルも公式リリースです。詳細は公式サイトをご覧ください。
category : ソフト・ツール開発 comment [1]
[6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]

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

TOP