program

描画系のクラス設計が難しすぎる

というか全貌がわからないから設計しようがない。 もう同じところを何年も作り直し続けてる気がする。 ぐぬぬ。

CBase* array = new CDerive[10]; for(int i=0; i<10; i++){ array[i].Func(); } ^^;

DrawPrimitive周り

「DrawPrimitive系は遅いので呼び出し回数を減らせ」という言葉をよく耳にする。DrawPrimitive系とは言わずもがなDirectXの代表的な描画関数で、頂点データから線やポリゴンを描画する。系の仲間として DrawPrimitive / DrawIndexedPrimitive / DrawPrimitiv…

シェーダを使うときの設計がわからん

プログラマブルシェーダを使うと自由自在なことができるけど、その反面自由すぎてクラスとかの設計をどうすればいいか全然見通しが立たない。具体的にどういうことをやりたいかという視点で考えてみると。 ゲームのデザインテーマに沿った大本のシェーダを全…

つづき

まだ重いと思ったら登録で代入してた。 配列から空いてるところを参照でもらってくる方式に修正。

シェーダの使い方

シェーダプログラムの書き方はまあ大体わかったとして、一応プログラムの呼び出し側もメモっとく。 この例は前回のシェーダで通常のメッシュを描画する場合。 行列やライトの定義とか、メッシュのマテリアルやテクスチャを取得するメソッドとかは適当に脳内…

超基本的なシェーダ

普通に頂点変換して普通にライティングして普通にテクスチャマッピングするだけのシェーダ。 float4x4 g_WorldViewProj : WorldViewProjection; float4x4 g_World; float4 g_MaterialDiffuse; float3 g_LightDirection; float4 g_LightDiffuse; float4 g_Lig…

プログラマブルシェーダ開始

とりあえず触ってみる。固定機能シェーダすら使いこなせてないのにね。 HLSLとやらは書く上では結構わかりやすそうでよし。FX Composerのようなシェーダ用開発環境を使うとさらに便利。 とりあえず色とか考えずに素の頂点変換。 float4x4 WorldViewProj : Wo…

モデリングツールのようなカメラ制御

マウスで3D空間をぐりぐりと動かして、いろんな角度からワールドを観察したいという話。2chで学んだ方法。カメラの初期位置をXZ平面内、注視点を原点、上ベクトルを(0,1,0)にしておいて、行列変換でカメラ空間ごとぶん回す。 const D3DXVECTOR4 INIT_EYE(0.0…

乗算から加算へ

テクスチャ半透明合成で輪っかの太さを変えようプロジェクト。 まずは例の乗算で考えたやつをやってみた。 一番左が元絵で、順に2枚、4枚、8枚重ね。結構まともな結果になった。 しかしこないだ気づいたように、色つきだとダメなのよね乗算。 一番左の元絵は…

輪っかをだんだん細くする

衝撃波のようなエフェクトって単に輪っかを拡大していけばいいんだと思ってたが、なんかそれだけじゃ今ひとつよろしくない。そこでいろいろと観察してみたところ、輪の輪郭をだんだん細くしていくと見栄えがよくなるようだ。 で、細くしていく方法として考え…

なんというVC++初心者

VC++のショートカット Ctrl+spaceとF5とF7とF10とF11くらいしか使ってなかったぜー。 Ctrl+左右 トークン単位移動 Ctrl+Shift+左右 トークン選択 Alt+Shift+上下左右 不思議な範囲選択 Ctrl+上下 上下スクロール Ctrl+] 対の括弧に移動 Ctrl+J メンバ候補表…

FPSの話〜完結編〜

そもそもどういう問題であったかおさらいする。 60FPSを実現するためには1フレームを1000/60=16.666…msに区切るように時間待ちをしなければならない。しかし、timeGetTime()などの一般的に使うタイマ関数では1ms単位の時間しか取得することができない。では…

階層型メッシュを用いるオブジェクトを複数表示

プロペラを回すとか、腕を動かすとか、メッシュを部分的にアニメーションさせたいときには階層型メッシュを使います。要はD3DXLoadMeshHierarchyFromX()で読み込むやつのことで、階層関係を持つ「フレーム」にパーツごとのメッシュが格納されています。 また…

アニメーションコントローラのトラックスピード

3Dゲームの素材をどうやって作ろうかという問題は、メタセコイアでモデルを作ってRokDeBone2でボーンとアニメーションを入れ込むという方法でとりあえずできそうです。それで作ったXファイルを読み込んでアニメーションさせるときに、スピードがどうなるのか…

で、スキンメッシュの衝突判定をOBBTreeで

やりました。コピペで。 カオスになった。 で、ここの情報で解決しました。 ぶっちゃけこの情報がなかったら一生判らなかった自信がある。 DirectX開発者とマニュアル執筆者は猛省すべき。 ばっちりだね。 でも正直こんなに分割いらないね。

スキンメッシュ、衝突判定、OBBTree

キーワードだけ並べて中身の話はありません。ざまぁ。 だって俺も同じ目に遭いまくってるんだもん。しかし実際の話めんどくさすぎ。 世の中の人たちはよくもまあこんなの実装しますね。ほんま尊敬するで・・・ ほんとは実装してないんじゃない?コピペなんじ…

スキンメッシュ意味不明すぎ(2)

スキンメッシュに関してはマルペケは珍しく参考にならないので(なんかボーン行列とかで独自のクラス構築をしてるけどその説明が全く抜け落ちててわけわかめ)、SDKサンプルとかこことかとりあえず丸写しでやってみる。というかいろんなところが参考文献に挙げ…

スキンメッシュ意味不明すぎ

スキンメッシュ意味不明すぎ

DirectXプログラミング(2)

しこしこと俺専用ミドルウェアライブラリの構築中。 しっかしこれに時間かけすぎると本題のゲーム作りに入れなくて本末転倒なんでもっと速くやれ俺。 新しくできたもの 描画 2D絵の描画(テクスチャフィルタリング可) 消失リソース管理 サウンド oggの再生 フ…

ウィンドウがバックグラウンドにあるときも音楽を鳴らす

DirectSoundのデフォルトでは、アプリがフォーカスを失うと音がミュートされる。バックグラウンドにあるときも再生されるようにするには、各セカンダリバッファを作成するときに指定するDSBUFFERDESC構造体のdwFlagsメンバにDSBCAPS_GLOBALFOCUSフラグを設定…

OggVorbisファイルの再生

VC2005で。 まずここで "FOR DEVELOPERS" から libogg と libvorbis を落とす。 libogg\include と libvorbis\include をVCのインクルードパスに設定。 あとは、 libogg をビルド libogg.lib をリンクして libvorbis をビルド libogg.lib libvorbis.lib をリ…

DirectXプログラミング

いいかげんうだうだ言ってる時間もなくなってきたのではじめました。 とりあえず俺専用ミドルウェアライブラリを作成中。 現在できたもの 描画 Direct3Dの初期化 デバッグ用フォント表示 サウンド DirectSoundの初期化 waveファイルの再生(ストリーミング・…

まだタイマによるFPS調整の話

なんか違う。 タイマがms単位でしか時間を取得できない以上、1フレーム=16.666…ms の小数点以下の誤差を補完することなど原理的に不可能だ。時間を3倍にすればそれは当然3の倍数になるので、スリープをかけるときに3で割れば相殺されてしまう。前のコードで…

FPSとかの続きの続き

以前の話で prevTick = nowTick とする方法だとFPSが安定したとか書いてたけど、ふらつく原因はそれ以外のところにありました。んでもってその方法だと他のプロセスで高負荷をかけるとゲームがゆっくり簡単になっちゃうのはやっぱだめだろうってことで再修正…

FPSとかの続き

とりあえず先日書いたとおり、60Hzなら垂直同期取ってそれ以外なら垂直同期切って16msでタイマ同期するようにした。しかしこれだとまずいパターンが一つある。 60Hz以外で、アプリから垂直同期を切れない場合である。 この場合はSDL_GL_SwapBuffers()とかそ…

FPS、タイマー、垂直同期(vsync)とかその辺の話

まず最初に、以下でいうFPSとは「描画」のFPSのことを指す。 タイマーによるFPS調整 Unlimited FireworksのFPS表示が安定しない原因を調べてた。問題自体はすぐ解決したけど、調べるうちに色々とわかったのでメモ。 とりあえずその問題について。 UFのFPS調…

Windowsプログラミング(3)

今回は文字列について。 2バイト文字を含むパスを扱えるようにするには、マルチバイト文字セットかUnicodeを使わないといけない。 世の中はUnicodeに移行すべき流れのようだけど、Win9xではUnicodeは使えない。 別にchar*決めうちでもいいんだけど、後で移植…

Windowsプログラミング(2)

開発の流れ(ダイアログベースアプリの場合) リソースエディタでコントロールを配置してダイアログの外観を作成 ダイアログプロシージャにコントロールのイベントハンドラを書く イベントハンドラに、やりたい処理を書く DialogBox()もしくはCreateDialog()…

Windowsプログラミング(1)

APIを調べつつ試行錯誤して、ようやく超簡単なランチャらしきものができた。ファイルのパスを入力してEnterすると、シェルの関連付けから実行するだけのもの。 ダイアログボックスの中の1行エディットボックスでEnterを押すと、デフォルトのボタンが押される…