【C++】 DirectX初心者質問スレ Part33 【C】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2010/12/22(水) 20:11:01これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前スレ
【C++】 DirectX初心者質問スレ Part32 【C】
http://hibari.2ch.net/test/read.cgi/tech/1288282082/
0809デフォルトの名無しさん
2011/02/03(木) 02:59:51自分がやりたい事が、Windowsアプリの作法から外れることを理解してる?
で、DirectXはWindowsのSDKだよね?
問題なんかじゃ無いでしょ、貴方が勝手におかしな事をやりたがってるだけ
それを理解できたなら
メッセージ、キュー
PeekMessage(), TranslateMessage(), DispatchMessage()を調べてみな
メッセージ無視で描画をするようになったら、他がどうなるかも体験するといいよ
因みに、普通はフルスクリーンと言う手を使う
と思うけどね
0810デフォルトの名無しさん
2011/02/03(木) 03:45:23単純に描画が6倍増えるんだな
0811808
2011/02/03(木) 04:17:37ありがとうございます。
>自分がやりたい事が、Windowsアプリの作法から外れることを理解してる?
そうなんですか?
私の手元の市販のDirectXを使用しているゲームでいくつか試してみましたがどれも私の期待通りの動作でした。
それからご指摘の関数等についてはMSDNのリファレンスを自分で出来る限り読み込んだ上で質問しています。
もう少し深いヒントをいただけないでしょうか?
0812デフォルトの名無しさん
2011/02/03(木) 07:14:35描画用のスレッドを作って、そこからレンダリングすればいい。
メッセージループ上でやるから止まるんだよ。
0813デフォルトの名無しさん
2011/02/03(木) 08:16:51メッセージングとそのディスパッチによる駆動というOSベンダが提供要求してる、作法の話
その辺理解出来ない人は多分、不慣れで馬鹿なだけ
0814デフォルトの名無しさん
2011/02/03(木) 08:41:40この時点で頭が悪いのがにじみ出ている。
フルスクリーンは今回の件とは何の関係もない。
あまりにも回答者のレベルが低すぎるよ。
0815デフォルトの名無しさん
2011/02/03(木) 08:48:43Windows3系統でそれでは不便だから、9x以降マルチスレッドが使えるようになったんだろう。
解決策はきっちりOSベンダが提供しているんだが、作法云々ってあまりにも無能すぎるぞ。
0816デフォルトの名無しさん
2011/02/03(木) 09:15:46作法がどうのとか変なこと喚いてる子がいるのか
0817デフォルトの名無しさん
2011/02/03(木) 09:20:171フレームにAだけ動いて欲しいのに、描画と移動のタイミングが合わないのか
途中で1フレーム程度描画が止まってしまいます
描画スレッドとMoveスレッドのタイミングがズレているのが原因だと思うのですが、
どうすればスムーズにできるでしょう?
0818デフォルトの名無しさん
2011/02/03(木) 09:25:10俺は >>813 だけど作法って文脈について補足しただけ
解決方の話ならそれでいんじゃね
0819808
2011/02/03(木) 11:00:31ありがとうございます。
試してみたら確かに期待通りの動作をしてくれました。
ただ、データの同期がめんどうすぎるのでスレッド使わない方法もありませんか?
別スレッドだと動くことから何らかのメッセージをDefwindowprocに渡さなければできそうな気がするのですが。
(DirectXでゲーム作るなら避けて通れない問題のはずなのに解説サイトがなかなかないです)
0820デフォルトの名無しさん
2011/02/03(木) 12:56:060821デフォルトの名無しさん
2011/02/03(木) 13:21:350822デフォルトの名無しさん
2011/02/03(木) 13:50:56描画スレッドより簡単な方法はない。
DefWindowProcがWM_NCLBUTTONDOWN(こんぐらい調べろ!)でブロックするのはWindowsの仕様。
スレッドよりNC系メッセージを自前で実装する方が楽だと思うなら好きにすればいい。
0823808
2011/02/03(木) 14:32:30>DefWindowProcがWM_NCLBUTTONDOWN(こんぐらい調べろ!)でブロックするのはWindowsの仕様。
なるほど。
確かにこれじゃどうしようもなさそうですね。そしてプログラムの挙動に納得がいきました。
あきらめてスレッド使うことにします。
大感謝です。
0824802
2011/02/03(木) 15:03:35フリーでお勧めのビューワとかありますか?
DXUTのサンプルのxファイルを見たりしたいのですが。
0825デフォルトの名無しさん
2011/02/03(木) 15:37:15自分で作る
0826デフォルトの名無しさん
2011/02/03(木) 15:45:57mutexとか使ってスレッドの同期をとるか、描画と移動を同じスレッドで処理する。
重たい処理をしない限り、描画と移動を別スレッドにする必要ないと思うが。
0827デフォルトの名無しさん
2011/02/03(木) 15:56:37SetTimerして、WM_TIMERのプロシージャから描画処理呼べば、
シングルスレッドでもタイトルバーをクリックしてる最中に動かせるよ。
0828826
2011/02/03(木) 16:10:22あと追加だが、スレッド間でデータを共有するときは慎重にやらないといけない
例えばグローバル変数の座標を移動スレッドで更新しても、描画スレッドに反映されないことがある
詳しくはvolatile変数とかで調べてくれ
0829デフォルトの名無しさん
2011/02/03(木) 19:47:49それともスレッドの数は最小限に納めた方がいいのかな?
0830デフォルトの名無しさん
2011/02/03(木) 21:08:23グローバル変数にvolatileを付けなくてもスレッドセーブでコンパイルされるので書く必要はない。
つまりグローバル変数にvolatileを付けろと言うのはただの知ったか。
0831デフォルトの名無しさん
2011/02/03(木) 21:11:590832デフォルトの名無しさん
2011/02/03(木) 21:12:37おいおい
0833デフォルトの名無しさん
2011/02/03(木) 21:14:550834デフォルトの名無しさん
2011/02/03(木) 21:15:230835デフォルトの名無しさん
2011/02/03(木) 21:20:54//win32に用意された関数を使う場合 --------------------------------
CRITICAL_SECTION so;
スレッドとして処理したい関数() {
EnterCriticalSection(&so);
//同期的に触れる処理はここで
LeaveCriticalSection(&so);
}
// boostを使う場合 --------------------------------
typedef boost::mutex::scoped_lock lock;
boost::mutex mtx;
スレッドとして処理したい関数() {
lock l(mtx);
//同期的に触れる処理はここで
}
0836デフォルトの名無しさん
2011/02/03(木) 21:25:37同期が必要なデータはmutexなりで保護しないと意味はないし、
保護されているならvolatileを書く必要性はない。
0837デフォルトの名無しさん
2011/02/03(木) 22:11:26メモリの READ WRITE のタイミングによる、いわゆる H側とL側が違うタイミングで更新されないように、
だとか構造体の要素などの更新タイミングがズレないようにだとか。 ロック処理するなら、いらないだけであって、
実はいらない、じゃない。 なんか混同してる人間多すぎないか。 てかここDirectXの初心者スレだからわかってないのか
0838デフォルトの名無しさん
2011/02/04(金) 00:12:10たとえば512x512のうちの0,0から64,64までとか
0839デフォルトの名無しさん
2011/02/04(金) 00:35:170840デフォルトの名無しさん
2011/02/04(金) 00:44:500841デフォルトの名無しさん
2011/02/04(金) 07:17:28グローバル変数にvolatileを付ける話をし出した馬鹿がいたからだろう。
別スレッドから参照されるのを考慮して、最初から最適化に巻き込まないようになっており、
付けても付けなくても生成されるコードに変化がないのに。
コンパイラの動作を全く理解していない。
0842デフォルトの名無しさん
2011/02/04(金) 10:59:360843デフォルトの名無しさん
2011/02/04(金) 12:27:47グローバル変数使わないけど・・・
0844デフォルトの名無しさん
2011/02/04(金) 12:35:32指定フォーマットがサポートされていたりいなかったりしますが
どんな環境でもサポートが保証されているフォーマットってありますか?
0845デフォルトの名無しさん
2011/02/04(金) 12:50:170846840
2011/02/04(金) 20:08:310847デフォルトの名無しさん
2011/02/04(金) 21:25:38テクスチャ座標は頂点座標といっしょに渡してるの?
0848デフォルトの名無しさん
2011/02/04(金) 21:31:030849デフォルトの名無しさん
2011/02/04(金) 22:51:08想定してるプログラムは、World of Warcraft や リネージュ2といったMMORPGです。
0850デフォルトの名無しさん
2011/02/04(金) 23:16:430851デフォルトの名無しさん
2011/02/05(土) 00:40:02多少カスタマイズしないと使いにくい部分はあるけどソース全部ついてるから問題なし
ただしDXUTはあくまでフレームワークであってゲームエンジンではないので
UT使ったからといってゲーム作りが楽になるわけではない
0852デフォルトの名無しさん
2011/02/05(土) 02:58:00ID3D11DeviceContext::DrawInstancedで今詰まっています。
一つのオブジェクトデータ(頂点群-テクスチャ)を使って複数オブジェクトの描画を行うものだと思うのですが、
そのまま使っただけだと表示は変わらないため、おそらく同一座標に複数回描画するだけになってると思われます。
描画座標を変えて複数オブジェクトを描画するにはどうしたらいいのでしょうか?
頂点シェーダあたりが怪しい気はするのですが・・。
0853デフォルトの名無しさん
2011/02/05(土) 10:31:48ChangeDisplaySettingでフルスクルーンとウインドウの切換を出来るようにしたのですが、
ウインドウに戻したとき、常に最前列になってしまいます。どのようにすればよいでしょうか。
念のためHWND_NOTOPMOSTを入れてもダメでした。
SetWindowLong(hWnd,GWL_STYLE,WS_POPUP|WS_VISIBLE);
SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE) );
0854デフォルトの名無しさん
2011/02/05(土) 10:56:190855デフォルトの名無しさん
2011/02/05(土) 11:25:23サンクスです。
原因がわかりました。
画面を作り直す際に、WindowsのバグでTopMostを付けられてしまったので、
1秒ぐらい時間をおいてからNOTOPMOSTを行うことでした。
ありがとうございます。
0856デフォルトの名無しさん
2011/02/05(土) 14:24:14最初にCreateWindowするとき何指定してる?
0857デフォルトの名無しさん
2011/02/05(土) 14:58:12もう見たかもしれんが
Instancing10 サンプルとか参考になるんでは?
SV_InstanceIDを使って定数バッファを切り替えながらインスタンスを描画ということだろう
0858デフォルトの名無しさん
2011/02/06(日) 03:14:03ついでに聞きたんですがウインドウからフルスクリーンにするとき別のモニターに表示されてるウインドウが横にずれるんだけど
原因わかりますか?
0861デフォルトの名無しさん
2011/02/06(日) 22:32:55モニターが変わるとずれるなら、モニターの調整位置がずれてる
0862デフォルトの名無しさん
2011/02/08(火) 02:48:11書いてないんですが。
他のコンポーネントはほとんど代替物書いてあるのに。
みんな何使ってるんですか?
0863862
2011/02/08(火) 03:20:50要するにDirectShowはゲームには大げさだから普通のAPI使えってことらしいけど、違う人の付け加えではVMR9(DShowの一部)は
DirectXのサーフェス描画に適してるってあるし、どうしろってことなんだ。
0864デフォルトの名無しさん
2011/02/08(火) 03:41:060865デフォルトの名無しさん
2011/02/08(火) 03:47:28現状GPUにスムーズに動画流すとなるとVMR9が現実的だし
Media Foundation+EVRとかあって性能特化してるけど
まとにも使うにゃ条件厳しすぎる
0866デフォルトの名無しさん
2011/02/08(火) 04:29:23メソッド( コピー元, RECT, コピー先, 色, コピー方法)
こんな感じだったと思います。教えてください!
0867デフォルトの名無しさん
2011/02/08(火) 05:10:03UpdateSurface
StretchRect
ColorFill
D3DXFill***
0868デフォルトの名無しさん
2011/02/08(火) 06:03:49オイラー角で回転させてもロールピッチヨーで回転させても、直感的でない動きをします。
(前を向いてる時と横を向いてる時で、視点を傾げるキーと上下を見るキーが変わったりとか)
これでだいぶ悩んでいるんですが、解説されているサイトなどをあんまり見ないので、
もしかしてカメラを直感的に動かす為のヘルパー関数みたいなものがあったりするんでしょうか?
0869デフォルトの名無しさん
2011/02/08(火) 06:26:38そんな関数ねぇよw
直感的とかわかんねーよ
ちょっと有名ゲームでも挙げて
これと同じようにしたいって質問したほうがまだわかりやすい
0870デフォルトの名無しさん
2011/02/08(火) 23:40:01関数っていうかクラスがDXUTcamera.hとDXUTcamera.cppに
その二つをひっぱってくればUTベースのアプリじゃなくても使える
0871デフォルトの名無しさん
2011/02/09(水) 00:55:240872デフォルトの名無しさん
2011/02/09(水) 03:36:400873デフォルトの名無しさん
2011/02/09(水) 13:17:030874デフォルトの名無しさん
2011/02/09(水) 20:45:08>>871はHDCではなくHWNDのことを言ってるんだよね?
0875デフォルトの名無しさん
2011/02/09(水) 20:48:36ありがとうございます
フォーカスはアダプタ番号指定しているのでいらないと思いました
>>874
そうです。
0876デフォルトの名無しさん
2011/02/10(木) 00:51:190877デフォルトの名無しさん
2011/02/10(木) 01:06:29よくよく考えてみればウインドウハンドルがないとウインドウズが管理できませんよね。。。
失礼しました。
0878デフォルトの名無しさん
2011/02/10(木) 04:24:040879デフォルトの名無しさん
2011/02/10(木) 07:27:53いまは推奨されていないみたい
0880デフォルトの名無しさん
2011/02/11(金) 02:28:48「デバイスを2つ以上使う場合ってあるんだろうか」と気になっただけなのですが・・・
0881デフォルトの名無しさん
2011/02/11(金) 03:39:44それ用のコードを書かないといけないような仕組みだったら、
過去のゲームに対応したりできないだろう。
0882880
2011/02/11(金) 07:24:10複数のVGAに別々のモニタをつないでそれぞれ別々に処理する場合以外
(・・・できるのか??)ありえなさそうですね。ありがとうございました
0883デフォルトの名無しさん
2011/02/11(金) 21:05:28D3DXMatrixIdentity( &rot ); D3DXMatrixIdentity( &tra ); D3DXMatrixIdentity( &sca );
D3DXMatrixTranslation( &tra, 0, 0, 0 );
D3DXMatrixRotationYawPitchRoll( &rot, D3DX_PI * 0.5, 0, 0 );
D3DXMatrixScaling(&sca, 0, 0, 0 );
mat = rot * tra * sca;
---エフェクト---
pos = mul( mat, ビュー );
pos = mul( pos, プロジェクション );
return mul( In.Pos, pos );
これで正確な位置に表示されません。例えばtraのx座標を増やしても斜め奥に移動してしまいます。
どこに問題がありますか?ちなみにカメラはz軸-から正面を見て設置しています。
0884デフォルトの名無しさん
2011/02/11(金) 21:12:180885デフォルトの名無しさん
2011/02/11(金) 21:35:16mat = sca* rot * tra;
にしようぜ
0886デフォルトの名無しさん
2011/02/11(金) 21:51:14>>883のソースのスケーリングは
D3DXMatrixScaling(&sca, 1, 1, 1 );の間違いです
0887デフォルトの名無しさん
2011/02/11(金) 23:32:49これをエフェクトに渡してるなら、エフェクト側では
return mul(In.Pos, mat); // matは↑の渡されたやつ
の1行でいけるはずなんだけど
0888デフォルトの名無しさん
2011/02/11(金) 23:37:32883で合ってるね。posって名前おかしいけど
0889デフォルトの名無しさん
2011/02/11(金) 23:38:040890デフォルトの名無しさん
2011/02/11(金) 23:52:07matの行列の中身を書いてみなよ
それで少なくともワールド変換以前で間違ってるのか
それ以降で何かおかしいのかは分かるから
0891デフォルトの名無しさん
2011/02/11(金) 23:54:340892デフォルトの名無しさん
2011/02/12(土) 00:26:37-z方向に向いています。重心も真ん中にあります。
tiny.xでやっても同じ挙動なのでモデルの不具合は考えにくいと思います。
http://www.dotup.org/uploda/www.dotup.org1339073.png
右がx軸方向に1.0動かしました
0893デフォルトの名無しさん
2011/02/12(土) 00:40:100894デフォルトの名無しさん
2011/02/12(土) 00:47:390895デフォルトの名無しさん
2011/02/12(土) 01:17:11これ嘘書いてない?
>>892見るとヨーじゃなくてピッチ軸で回転してる気がするんだけど・・・
0896デフォルトの名無しさん
2011/02/12(土) 11:14:40この分じゃ全然関係ないところでもミスしてそうだな
0897デフォルトの名無しさん
2011/02/12(土) 20:22:02DirectXではAPIを呼ぶことでGPUを動かしてますが、効率よく処理したいので、GPUがどのように動くのか知りたいです。
例えば、描画コマンドの発行やリソース管理、メモリアクセス等です。
同じような情報でも、頂点ストリームに含めたほうがイイのか、テクスチャとして与えたほうがイイのか等を
判断できるようになりたいです。
また、DirectX9から10への移行で大きく変わったという話もありますが、
このあたりの具体的な内容も知りたいです。
ttp://journal.mycom.co.jp/column/architecture/index.html
CPUだと、こういう詳細解説のコラムがありますが、
これのGPU版みたいなのがあるとうれしいです。
よろしくお願いします。
0898デフォルトの名無しさん
2011/02/13(日) 01:17:53本に書かれた瞬間から情報が古くなってしまう気がする
0899デフォルトの名無しさん
2011/02/13(日) 01:37:360900883
2011/02/13(日) 10:32:38ボーンによる頂点ブレンデリングは投影変換後にやるものなのですか?
0901デフォルトの名無しさん
2011/02/13(日) 10:39:10スキニングの仕組みからわかってねーじゃねーか!
0902デフォルトの名無しさん
2011/02/13(日) 11:31:21○頂点ブレンドのing
0903883
2011/02/13(日) 12:43:33頂点ブレンドと投影変換の手順だけでも教えてください
0904デフォルトの名無しさん
2011/02/13(日) 14:58:48IMediaControlのGetStateのWaitってどの程度いれればいいのでしょうか?
0906デフォルトの名無しさん
2011/02/13(日) 18:47:26やだよ
お前見込みねーもん
お前なんかにスキニングを理解するなんてムリムリムリムリかたつむりよ
そもそも普通のワールド座標からスクリーン座標に変換するまでの流れ知ってるのかよ?
ちょっと書いてみろ
0907デフォルトの名無しさん
2011/02/13(日) 19:22:14とーんちーんかーんちーん一休さーんのヤツかおまえ。
答える気がないなら黙ってろよw
0908デフォルトの名無しさん
2011/02/13(日) 22:08:58レス数が900を超えています。1000を超えると表示できなくなるよ。