【C++】 DirectX初心者質問スレ Part31 【C】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/09/30(木) 21:45:21これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前スレ
【C++】 DirectX初心者質問スレ Part30 【C】
http://hibari.2ch.net/test/read.cgi/tech/1278214135/
0562デフォルトの名無しさん
2010/10/18(月) 18:40:49具体的になにが駄目だったの?
あそこで答えてもらえないならみんな知らないか
くだらないこと質問して相手にしてもらえないかのどっちかじゃね?
いまレスしてる面子みても結構できる人いるよ
0563デフォルトの名無しさん
2010/10/18(月) 19:19:450564デフォルトの名無しさん
2010/10/18(月) 20:23:10Windows限定でよければ、GetGlyphOutlineでフォントの輪郭線とれるよ。
TrueTypeのフォーマットまでは知る必要ない。
最近はGGO_BITMAPの方の機能ばかり有名になってしまって、
曲線データの方の解説は見つけるのが大変だけど。
0565デフォルトの名無しさん
2010/10/19(火) 00:08:38テッセレート化したメッシュデータまで取得できたなぁ
0566デフォルトの名無しさん
2010/10/19(火) 00:33:390567デフォルトの名無しさん
2010/10/19(火) 09:10:18BBX昔はよく利用したけど今はなぁ
0568デフォルトの名無しさん
2010/10/19(火) 13:34:430569デフォルトの名無しさん
2010/10/19(火) 13:50:09その一つ一つに対して、別々のアルファ値を持たせる場合は、
頂点デクラレーションの作成の時にアルファ値用の値を設定しといて、
描画するときになったら、一気に頂点バッファをロックして、
個別に設定するしか方法ないですよね?
当然このオブジェクトはそれぞれ別々の方向に動くので、座標も一気に変える
つもりなんですが。
0570デフォルトの名無しさん
2010/10/19(火) 14:13:14ある程度規則的な動きなら書き換えずに済むかも知れない
どうしても書き換えなくてはいけない時でも
1000回Lockするのではなく1回で済むような仕組みを考えるべき
0571デフォルトの名無しさん
2010/10/19(火) 14:21:35ありがとうございます。
シューティングを作っているので、規則的な動きにはならないですね。
その座標は当たり判定とかの計算にも利用するつもりなので。
>1000回Lockするのではなく1回で済むような仕組みを考えるべき
5種類の弾があって、それぞれ100発ずつ撃たれている状況だとしたら、
テクスチャはそれぞれ変えなきゃならないので、
一種類ごとにテクスチャをセットして、100発まとめてlockして描画。
というのを5回繰り返すイメージですよね?
0572デフォルトの名無しさん
2010/10/19(火) 14:24:130573デフォルトの名無しさん
2010/10/19(火) 14:25:50なるほど!そういえばそうですね。助かりました。
ありがとうございました。
0574デフォルトの名無しさん
2010/10/19(火) 14:28:160575デフォルトの名無しさん
2010/10/19(火) 14:41:28D3DUSAGE_DYNAMICとD3DPOOL_DEFAULTにしておけば大丈夫ですよね?
0576デフォルトの名無しさん
2010/10/19(火) 14:52:59動的頂点バッファにしたほうが、D3DPOOL_MANAGEDで確保した静的頂点バッファより遅かったんだが・・・
1・俺のテストコードが悪い
2・ループが速すぎて、動的頂点バッファのロック待ちよりも、MANAGEDが確保しているシステムメモリーに書き込んだ(そしてMANAGEDがいっきにVRAMにUPDATEした)ほうが速かった
どっちだ!
0577デフォルトの名無しさん
2010/10/19(火) 14:57:38ちなみに静的頂点バッファっていうのは、頂点バッファの内容はいじらないってことですよね?
いじれないんだったら、それぞれのオブジェクトを好きな位置に移動するときに、
DrawIndexedPrimitiveで一気に描画することはできないですよね?
一つ一つ、DrawPrimitiveを連投する方法だったら、個々に移動行列を与えて移動できそうですけど。
0578デフォルトの名無しさん
2010/10/19(火) 15:01:57>ちなみに静的頂点バッファっていうのは、頂点バッファの内容はいじらないってことですよね?
「いじらない=いじれない」のではなく「いじらないつもりなので、そのつもりでバッファ確保してね」というのが静的頂点バッファ。
MSDN読めば書いてあるが、静的はVRAM上に。動的はAGPメモリー上に配置する傾向にあるとかなんとか。
俺も詳しくは知らん。
静的だからといって書き換え不可能ってわけではない。
0579デフォルトの名無しさん
2010/10/19(火) 15:03:12IDirect3DVertexBuffer9::Lockの実行するロックのタイプの指定フラグが正しくないんじゃない?
どういうLockの仕方してるのか分からんから何とも言えんが
0580デフォルトの名無しさん
2010/10/19(火) 15:05:47わかりました。詳しくありがとうございます。
0581デフォルトの名無しさん
2010/10/19(火) 15:07:151回ですむならやや動的頂点バッファの方が上だがほぼ大差ない
2回以上Lockするなら動的頂点バッファの方が上になるが
Lockの仕方を間違うとめちゃくちゃなパフォーマンスダウンを起こす
0582デフォルトの名無しさん
2010/10/19(火) 15:19:25テキストに買ってきた書籍が少し古くて 2005 基準で書かれたものなのですが
ここに書かれているソースコードが使えないということなのでしょうか
それともVisualC++2010 に DirectX SDK の最新版を入れて 同じ環境とみなせるでしょうか
サポートが打ち切られるというのがどういうことか分りません
0583デフォルトの名無しさん
2010/10/19(火) 15:19:270584デフォルトの名無しさん
2010/10/19(火) 15:27:18ソースコードが使えなくなるということではない
2010で動かすなら問題なく使える
とりあえず目立つところではたぶんサンプルから2005用のソリューションが消えたんじゃない?
あとは今後.libの互換性がなくなって
2005+2010Oct以降だとリンクができなくなる(かもしれない)
0585デフォルトの名無しさん
2010/10/19(火) 15:34:31MSDN探しても見当たらないぞ。
0586デフォルトの名無しさん
2010/10/19(火) 15:39:580587デフォルトの名無しさん
2010/10/19(火) 15:41:250588デフォルトの名無しさん
2010/10/19(火) 15:44:34ありがとうございます とりあえず同じ環境とみなして進めていきます
.lib の互換性がなくなるというのは文法も変わってしまうということ?
サポートの打ち切りとはどういった背景(理由)で行われたかわかりますか
何か変えなくてはいけないことがあったんだと思うのですが
0589デフォルトの名無しさん
2010/10/19(火) 15:47:580590デフォルトの名無しさん
2010/10/19(火) 15:48:48DirectX SDK は3,4か月に一度更新されているようですので 今後更新されるであろう
バージョンをさしてOct 2010(以降)と言ったのだと思います
0591デフォルトの名無しさん
2010/10/19(火) 15:51:12D3DLOCK_DISCARD使ってるから、使い方間違えてはいないと思うんだけどなぁ・・・
>>581の言う通り、1ループで1回しかLockしないから誤差の範囲内なのかもしれん。
>>583
GF9600だから、動的のほうが速いのを期待したんだけどなー
0592デフォルトの名無しさん
2010/10/19(火) 16:00:05そもそも1つのループで複数回ロックは論外。
0593デフォルトの名無しさん
2010/10/19(火) 16:04:17D3DLOCK_NOOVERWRITEでロックして追記や部分書き換えすればそれほどコストは掛からないんだぜ
これをD3DLOCK_DISCARDでロックするとアホみたいなことになる
0594デフォルトの名無しさん
2010/10/19(火) 16:06:51考えられる問題点
読み込みを伴うアクセスを行っている
全体を書き換えるのにDiscardを指定していない
Lockを複数回行っている
0595デフォルトの名無しさん
2010/10/19(火) 16:08:41そもそも何度もロックを繰り返すようなプログラムを組まなければならない時点で、
処理に無駄が多すぎる。
0596デフォルトの名無しさん
2010/10/19(火) 16:17:41んー、どれにも当てはまらないなぁ…。
とはいっても、さすがに俺のコードに問題があるんだろうし、ちょっと今再度計測してみるわ
0597デフォルトの名無しさん
2010/10/19(火) 16:18:190598デフォルトの名無しさん
2010/10/19(火) 16:19:50どーすりゃいいんだ。
0599デフォルトの名無しさん
2010/10/19(火) 16:26:501フレーム複数回のDrawPrimitiveに対し複数回Lockは当然あり得る
複数Lockする必要が無いなんていってる奴は単純な描画しかしたことがないんじゃね?
0600デフォルトの名無しさん
2010/10/19(火) 16:29:35やっぱりそうですよね。
0601デフォルトの名無しさん
2010/10/19(火) 18:11:14D3DPOOL_DEFAULT版
dev->CreateVertexBuffer(
desc.Size,
D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
desc.FVF,
D3DPOOL_DEFAULT
&buffer,
NULL
);
buffer->Lock(0, 0, &to, D3DLOCK_DISCARD);
::memcpy(to, from, desc.Size);
buffer->Unlock();
D3DPOOL_MANAGED版
dev->CreateVertexBuffer(
desc.Size,
0,
desc.FVF,
D3DPOOL_MANAGED
&buffer,
NULL
);
buffer->Lock(0, 0, &to, 0);
::memcpy(to, from, desc.Size);
buffer->Unlock();
こんな感じ。
もちろんCreateVertexBufferは最初の1回だけね。
モーフィングをやろうとして色々研究してたんだけど、D3DLOCK_DISCARDを使っても早くならねーなーと思ってたとこ。
後者のほうが微妙に速い上、D3DLOCK_DISCARDしないでモーフィング差分だけ書き変えればいい(memcpyいらね)から、ますます後者が速くなるんだ
0602デフォルトの名無しさん
2010/10/19(火) 20:35:360603デフォルトの名無しさん
2010/10/20(水) 10:51:33・・・いや、もしかしてMANAGEDの野郎、1度でも動的な使い方したら、内部で動的として確保しなおすとかしやがるのか・・・?
0604デフォルトの名無しさん
2010/10/20(水) 12:22:51すべての悩みから開放されます
0605デフォルトの名無しさん
2010/10/20(水) 12:36:580606デフォルトの名無しさん
2010/10/20(水) 13:19:02ロック呼び出しは古いデータへのポインターを返します。これにより、アプリケーションは
頂点バッファーまたはインデックス バッファー内の未使用領域に新しいデータを追加できます。
この古いデータへのポインターっていうところなんですが、
1000KBの頂点バッファがあったとして、200KB分しか使用してなかったとしたら、
その200KBの先頭のポインタを取得できるってことでしょうか?
もしそうだとしたら、未使用領域に新しいデータを追加できるっていうのは、
この先頭ポインタから200KB分のポインタを進めたところから追加しろってことでしょうか?
0607デフォルトの名無しさん
2010/10/20(水) 13:25:590608デフォルトの名無しさん
2010/10/20(水) 13:30:00座標をいじらずに、行列とかで移動できるやつはDrawPrimitive系でいいかもしれませんが、
それ以外の直接座標をいじるやつに関しては、DrawPrimitiveUP系を使ったほうが、管理とか速度面においても、
良いきがするんです。
0609デフォルトの名無しさん
2010/10/20(水) 13:30:120-199までLock
0-199までをDrawPrimitive
200-399を(使用中かもしれない0-199の中身が変わらないことを保証して)Lock
200-399までをDrawPrimitive
みたいな時に使う
0610デフォルトの名無しさん
2010/10/20(水) 13:34:14ありがとうございます!
ですが200-399までをDrawPrimitiveするときの、引数の指定がよく分からないです。
MSDNには、第二、第三引数は下記のように設定しろと載ってました。
StartVertex
[in] ロードする最初の頂点のインデックス。StartVertex を先頭に、正しい頂点数が頂点バッファから読み取られる。
PrimitiveCount
[in] レンダリングするプリミティブの数。プリミティブの許容最大数は、D3DCAPS9 構造体の MaxPrimitiveCount メンバをチェックして決定される。
PrimitiveCount は、プリミティブ タイプで指定されたプリミティブの数である。ライン リストの場合、各プリミティブは 2 つの頂点を持つ。三角形リストの場合、各プリミティブは 3 つの頂点を持つ。
これのプリミティブの数は分かりますが、頂点のインデックスって言う値が良くわからないです。
インデックスって何のことですか?
0611デフォルトの名無しさん
2010/10/20(水) 13:51:16頂点何個分ずらした位置から読むか
0-199で200プリミティブ(600頂点)だとしたら
200-399での先頭頂点は600、から200プリミティブ
400-599での先頭頂点は1200、から200プリミティブ
0612デフォルトの名無しさん
2010/10/20(水) 14:24:18なるほど!ありがとうございました!
0613デフォルトの名無しさん
2010/10/20(水) 14:27:100614デフォルトの名無しさん
2010/10/20(水) 14:32:50邪道ではないけど、いろいろ融通が利かなくなるから結局普通にやった方がよくなりそうな
0615デフォルトの名無しさん
2010/10/20(水) 14:35:30うう。そうですか。
どうにかして通常の座標変換で左上を0,0として、スクリーン座標で指定できる
方法があればいいんですが。
0616デフォルトの名無しさん
2010/10/20(水) 14:44:04http://hibari.2ch.net/test/read.cgi/tech/1278214135/781
0617デフォルトの名無しさん
2010/10/20(水) 15:15:560618デフォルトの名無しさん
2010/10/20(水) 15:25:52>>>780
>2Dスプライトを直感的にスクリーン座標と一致させたいってことだよね?
>パースペクティブ射影(D3DXMatrixPerspectiveFovLH)じゃなくて
>正射影(D3DXMatrixOrthoOffCenterLH)で射影行列作ればいいと思うよ
>スクリーンサイズが800x600なら
>
>D3DXMatrixOrthoOffCenterLH( D3DXMATRIX *pOut, 0, 800, 600, 0, FLOAT zn, FLOAT zf);
>
>で左上(0.0)になって分かりやすいんじゃないかな
>
0619デフォルトの名無しさん
2010/10/20(水) 15:30:050620デフォルトの名無しさん
2010/10/20(水) 16:51:30みたいな解説をしてくれてるページってないですかね?
0621デフォルトの名無しさん
2010/10/20(水) 16:59:07http://msdn.microsoft.com/ja-jp/library/ee422511(v=VS.85).aspx
0622デフォルトの名無しさん
2010/10/20(水) 17:03:18ありがとうございます。
0623デフォルトの名無しさん
2010/10/20(水) 17:11:32UP系の最大の欠点は頂点ストリームが1つしか使えないこと
それでまかなえる程度の単純なスプライト描画しかしないなら十分な速度は確保できると思われ
0624デフォルトの名無しさん
2010/10/20(水) 17:38:18ああ・・そういえばそうでしたね。
検討してみます。ありがとうございました。
0625デフォルトの名無しさん
2010/10/20(水) 20:15:18DrawPrimitiveUPとDrawIndexedPrimitiveUPではどちらの方が効率が良いのでしょう?
DrawPrimitiveUPでもD3DPT_TRIANGLESTRIPで描画すればそんなに変わらないでしょうか?
0626デフォルトの名無しさん
2010/10/20(水) 20:45:420627デフォルトの名無しさん
2010/10/20(水) 22:32:31DrawIndexedPrimitiveUPよりDrawPrimitiveUPの方が速かった
0628デフォルトの名無しさん
2010/10/21(木) 03:52:44実際は、各グラボのドライバの処理による環境依存だからね
その時点までの他の頂点を含む状況、今描画しようとしている頂点内容や数、
これらの組み合わせで、どれが効率良いかなんて言えない
だから、これが効率的だ(自分のPCだけの話ってなら別だが)、
なんて物を求めないで、これは大多数のケースで非効率だって実装を避ければ良いだけだと思うが
0629デフォルトの名無しさん
2010/10/21(木) 09:12:34色々やってみたんですが、DrawPrimitive系(UP含む)では、
四角形のポリゴンを一気に描くことはできないですよね?
ここで言う一気とは「一回の」DrawPrimitiveで描画という意味です。
何度やっても、思い通りの頂点と頂点がつながってくれなかったので、
最終確認したいんです。
これを可能にするにはDrawIndexedPrimitive系(UP含む)で、好きな頂点を指定してあげて
自分の思ったとおりに描画させるしかないってことでよいでしょうか?
0630629
2010/10/21(木) 09:13:58バラバラにある一定の距離を保って、大量にあるものとします。
0631デフォルトの名無しさん
2010/10/21(木) 09:41:060632629
2010/10/21(木) 09:56:480633デフォルトの名無しさん
2010/10/21(木) 10:00:360635デフォルトの名無しさん
2010/10/21(木) 22:30:01PlayMusic命令でMIDIファイルが再生できません
0x4b7e2bd8 で初回の例外が発生しました: 0xC0000005: 場所 0x4b7e2bd8 を読み込み中にアクセス違反が発生しました。
というエラーで出力が埋め尽くされています…
0636デフォルトの名無しさん
2010/10/21(木) 22:31:44知らんがな
http://hibari.2ch.net/test/read.cgi/gamedev/1286180687/
0637デフォルトの名無しさん
2010/10/21(木) 22:32:56素早いご指摘ありがとうございました
0638デフォルトの名無しさん
2010/10/22(金) 00:27:340639デフォルトの名無しさん
2010/10/22(金) 00:45:440640デフォルトの名無しさん
2010/10/22(金) 02:42:290641デフォルトの名無しさん
2010/10/22(金) 03:15:300642デフォルトの名無しさん
2010/10/22(金) 07:14:420643デフォルトの名無しさん
2010/10/22(金) 07:24:050644デフォルトの名無しさん
2010/10/22(金) 15:49:020645デフォルトの名無しさん
2010/10/22(金) 16:17:28まともなモデリングソフトを触って研究しようとしないんだろう?
どれだけ馬鹿なの?
0646デフォルトの名無しさん
2010/10/22(金) 16:20:290647デフォルトの名無しさん
2010/10/22(金) 17:54:58弾は動的確保にしたほうがいいですか?
0648デフォルトの名無しさん
2010/10/22(金) 18:07:23一度に画面に出る最大数を決めておいて配列で用意したらいいじゃん
0649デフォルトの名無しさん
2010/10/22(金) 18:08:13やっぱりそのほうがいいですか?
動的確保はやっぱり重いでしょうか?
0650デフォルトの名無しさん
2010/10/22(金) 18:15:01馬鹿の考え休むに似たりということにしかならない。
余計なことは考えずにやりたいようにどんどん作れ。
0651デフォルトの名無しさん
2010/10/22(金) 18:15:21やりたきゃ好きにしろよ
あんまり意味はなさそうだけど
なんだ?
弾一発めちゃくちゃ場所とるのか?
0652デフォルトの名無しさん
2010/10/22(金) 18:42:37とりあえずn発までがMAXって定義しといて、先に領域確保しといて弾ブッパするのと
1発ずつ確保してブッパするプログラム組んで、速度見てみるといいと思うの。
0653デフォルトの名無しさん
2010/10/22(金) 18:52:26処理オチする位に弾出してみればいいじゃん。そこから逆算してみたら?
むかーし、セレロン600Mhz位とGPU不明でやったときでも100位は出てたぞ。
現実的に300位出ちゃうとよけるの不可能じゃね?
0654デフォルトの名無しさん
2010/10/22(金) 19:15:02とりあえず好きにやってみて、処理落ちしたらまた考えます。
ありがとうございました。
0655デフォルトの名無しさん
2010/10/22(金) 19:15:59いい言葉だな
0656デフォルトの名無しさん
2010/10/22(金) 19:19:240657デフォルトの名無しさん
2010/10/22(金) 19:30:060658デフォルトの名無しさん
2010/10/22(金) 20:33:53何億発打てばメモリ不足になるんだよ?
というか馬鹿?
0659デフォルトの名無しさん
2010/10/22(金) 20:37:41動的確保にしても予め確保しといたヒープ内からとかにしたい所だ
0660デフォルトの名無しさん
2010/10/22(金) 20:39:32馬鹿の考え休むに似たり
>メモリ不足より分断化の方が気になる
馬鹿の考え休むに似たり
0661デフォルトの名無しさん
2010/10/22(金) 20:48:25■ このスレッドは過去ログ倉庫に格納されています