トップページ⇒tech
1001コメント284KB

【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/
0755デフォルトの名無しさん2010/10/25(月) 15:49:51
DXライブラリ 関数リファレンスページ 3D関係関数リファレンス
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.htm

カメラとか行列とか3D独特なものには触れれるから3Dの感触を確かめる意味ではいいんじゃないかな。
0756デフォルトの名無しさん2010/10/25(月) 15:53:02
>>755
俺もそれで3Dをマスターした。
0757デフォルトの名無しさん2010/10/25(月) 15:53:44
>>747

DXライブラリからDirectX直たたきにいこうするなら、
このライブラリのソースを読むのが一番はやいんじゃないかな?

DXライブラリでXXを行うには・・・からはいっていって、
中身の実装でDirectXの勉強とかね。

で、ソースって公開されてるの?w

0758デフォルトの名無しさん2010/10/25(月) 15:56:00
マスター(笑)
0759デフォルトの名無しさん2010/10/25(月) 16:02:15
>>755
うわあしらんかった
すぐ使ってみよう。今すぐ使おう
0760デフォルトの名無しさん2010/10/25(月) 16:02:50
公開されてる。
0761デフォルトの名無しさん2010/10/25(月) 16:41:06
主語が無い
0762デフォルトの名無しさん2010/10/25(月) 16:56:38
SlimDXもC++のソースが公開されてるし勉強になるよ。
一応、薄いラッパだし直に触るのに近い。
0763デフォルトの名無しさん2010/10/25(月) 16:57:52
>>755は最後の htm を html に修正してくださいな。
0764デフォルトの名無しさん2010/10/25(月) 16:59:21
なんですぐマスター(笑)したとかいってしまうん(´・ω・`)
0765デフォルトの名無しさん2010/10/25(月) 17:02:34
おまいらの過剰反応がおもしろいから
0766デフォルトの名無しさん2010/10/25(月) 17:20:11
UV座標のUとVって何の略でしたっけ?
0767デフォルトの名無しさん2010/10/25(月) 17:27:21
XYZW使っちゃってたからUVにしただけだったような・・・
0768デフォルトの名無しさん2010/10/25(月) 17:27:53
特に意味はないらしいよ
0769デフォルトの名無しさん2010/10/25(月) 17:36:06
>>767-768
thx!
0770デフォルトの名無しさん2010/10/25(月) 17:56:54
物体を移動させたら、一定ごとにガタンガタンってなるんですが。

floatで計算させたら一定ごとに誤差がでることあるんですか?
0771デフォルトの名無しさん2010/10/25(月) 18:11:57
>>770
移動処理はfloatでやってるのに
座標管理をintとか整数でやってたら誤差はでるかもね


でも、なんとなくだけど
垂直同期を取らずに精度の悪いタイマーでPresentしてるせいな予感
0772デフォルトの名無しさん2010/10/25(月) 18:18:26
タイマーの精度は大丈夫だと思うんですけどね。
ちなみに壁に思いっきりキーを押しっぱなしでぶつかってる時は、
ガタンガタンにならないんですよね。

移動するときだけガタンガタンってなるんですよ。
0773デフォルトの名無しさん2010/10/25(月) 18:28:36
じゃあ、タイマーじゃなくて
垂直同期待ちして描画してごらんよ
0774デフォルトの名無しさん2010/10/25(月) 18:32:54
うおおお!垂直同期待ちしたらスムーズに動きました!
ってことは私のFPS制御がおかしいってことでしょうか?
0775デフォルトの名無しさん2010/10/25(月) 18:42:57
>>774
毎フレーム、タイマーの値を吐き出してみるとか・・・
0776デフォルトの名無しさん2010/10/25(月) 18:52:18
DWORD static waittime=0;
static DWORD oldtime=0;
float wt=1000.0f/FPS;

wt=(cnt%60+1)*wt;//待つべき時間

//分解能の精度を変更(制度をあげる)
timeBeginPeriod(1);

waittime+=timeGetTime()-oldtime;

if(waittime<wt)
Sleep(wt-waittime);

oldtime = timeGetTime();

if(waittime<wt){
waittime=wt;
}

//分解能の設定を戻す
timeEndPeriod(1);
++cnt;
}

こんな感じなんですがダメですかね?
FPSには60.0fが入っています。
0777デフォルトの名無しさん2010/10/25(月) 19:04:43
>>776
毎フレーム描画のタイミングのタイマの数値をアウトプット画面にでも出して
エクセルにでも貼り付けてちゃんと正しいタイミングで機能してるか見てみたらいいんじゃね?

と、その前にSleep(0)にしてみたかったりして・・・
俺も理詰めでプログラム組めないw
0778デフォルトの名無しさん2010/10/25(月) 19:11:05
16msは垂直同期に近いってだけで実際はちょっとズレてる
垂直同期を待たずにタイマーでフリップさせると
画面の更新途中で表示されてしまうのでティアリング線がでてしまう
そしてズレがどんどん大きくなって1画面文に達すると
まったく更新されてない画面(2フレーム前)が表示されてしまいガタッっとなってみえる
0779デフォルトの名無しさん2010/10/25(月) 19:18:01
え?じゃあ皆さんは垂直同期待ちでやってて、
自分でFPS制御してないんですか?
0780デフォルトの名無しさん2010/10/25(月) 19:24:09
デバッグ出力したら、16ミリ秒か17ミリ秒でした。
これをどうやって制御をあげればいいのでしょうか?
0781デフォルトの名無しさん2010/10/25(月) 19:32:47
>>776
変に省略されてるので分かりにくいけど、cntが59から60になるときに破綻してない?


>>779
場合によりけりでは。
垂直同期させてゲーム進行が問題ないのであれば、それが一番綺麗で楽だと思う。
ゲームの性質上自分でFPS制御する必要があるのであれば、自前でできるだけやるしかない。
0782デフォルトの名無しさん2010/10/25(月) 19:36:55
垂直同期を待つか
待たずにやるにしてもそもそもFPS制御をしない
移動量を前フレームからの経過時間から算出すれば問題ないでしょ?

ターマーでやったら
60FPS以上を60に固定することはできるかもしれないけど
20FPSしかでないようなPCで動かさなきゃいけないときどうするの?
0783デフォルトの名無しさん2010/10/25(月) 19:45:34
皆さんありがとうございます。

FPSで制御しようと思ったのはどんなマシンでも一定のスピードで動かしたかったからです。
FPSが低いマシンだったら、当然ガクンガクン動くことにはなるんですが、逆に60以上のマシンは
制御できると思ったので。

いくつかのフリーゲームではFPSを自分で選択して、設定できるようにしてあるのをいくつか見たことがありました。
そういうのはやっぱり自分で計算してるんですよね。

う〜ん。悩むところですが、垂直同期待ちでやることにします。

ありがとうございました。
0784デフォルトの名無しさん2010/10/25(月) 20:07:36
「FPSを自分で選択して」
ってディスプレイがサポートしてるリフレッシュレート列挙して
選んだ値に強制的に変更してるだけんじゃないの?
0785デフォルトの名無しさん2010/10/25(月) 20:25:06
あ、なるほど。。
そんなもんなんですかね。
結局は自分でFPS制御してる人って少ないんんですかね。。
0786デフォルトの名無しさん2010/10/25(月) 20:27:58
>>785
自分が何かいてるか理解できてねえだろw
0787デフォルトの名無しさん2010/10/25(月) 20:32:09
いえ、たぶん理解できてると思いますよ
0788デフォルトの名無しさん2010/10/25(月) 20:38:44
>>787客観的事実ではないので無効です。
0789デフォルトの名無しさん2010/10/25(月) 20:40:48
そうですね。わかってないですかね。勉強しなおしますよ。
0790デフォルトの名無しさん2010/10/25(月) 20:52:56
処理落ち時にコマ落ちさせないと不味いジャンルって
MMO以外に何がある?
0791デフォルトの名無しさん2010/10/25(月) 20:59:26
>>783
ウィンドウモードの場合は垂直同期でタイミングとろうとすると
使ってるモニタが変わるとタイミング変わるけど大丈夫?
0792デフォルトの名無しさん2010/10/25(月) 21:40:09
ウィンドウモードで垂直同期なんて関係あったっけ?
なんかDirectXの初期化時にテキトーに値入れるとよろしくやってくれね?
0793デフォルトの名無しさん2010/10/25(月) 21:54:36
>>782の場合だと、入力系の反応に差が出来ちゃうよね。
その辺はどう扱ってるのだろ。
0794デフォルトの名無しさん2010/10/25(月) 22:00:22
そんなのゲーム内時間を採用すればすむではないかとおもってしまうのですよ。
描画は出来るときにすればいい。

日本伝統の2Dシュー見たいのだとフレームスキップはきらわれるから、
垂直同期で特定ゲーム内時間分の更新じゃないとだねだけどな。
0795デフォルトの名無しさん2010/10/25(月) 22:01:00
>>792

下の設定の事だと思って話を進めるけど。

 FullScreen_refreshRateInHz = 60;
 PresentationInterval = D3DPRESENT_INTERVAL_ONE;

この場合フルスクリーン時は60で更新するように設定できるけど
ウィンドウモード時は、そのモニタが設定してる垂直同期になるから
"垂直同期だけ"を使用してると環境でタイミングがずれる。

そもそもウィンドウモード時に FullScreen_refreshRateInHz 設定すると
エラーでちゃうけどね。

間違っていたら指摘おねがい。
0796デフォルトの名無しさん2010/10/25(月) 22:02:56
>>791
そうだとは思ったんですが、どうしてもきっちりFPS制御できそうにないものでして。。。
このゲームは大体60FPSで動きますので、モニタのリフレッシュレートが60ヘルツぐらいじゃないと
うまく遊べないかもしれません。という断りをいれとこうかと。。。

あと思ったんですが、皆さんって、移動量を計算するときに、前回の時間から現在の時間までの経過時間を元に
計算してる人が多いんですか?
私は1フレーム当たりの移動量をあらかじめ決めといて、足してるだけなんですが。。
0797デフォルトの名無しさん2010/10/25(月) 22:06:50
>>796
>あと思ったんですが、皆さんって、移動量を計算するときに、前回の時間から現在の時間までの経過時間を元に
>計算してる人が多いんですか?
しねーよそんなこと
バグりまくってゲーム完成するどころじゃねぇぞ
0798デフォルトの名無しさん2010/10/25(月) 22:08:05
ですよね。すいません。
0799デフォルトの名無しさん2010/10/25(月) 22:14:08
描画用と入力・計算用のスレッドは別って事?
0800デフォルトの名無しさん2010/10/25(月) 22:15:41
>>797と>>782って矛盾してないか?
0801デフォルトの名無しさん2010/10/25(月) 22:17:40
そうしとかないとマズイゲームもあるでしょ
1フレームの時間が変わったら
格ゲーのコマンド入力の難易度が変わったり
スペックの低いPCでやったらすり抜けが起きたり
0802デフォルトの名無しさん2010/10/25(月) 22:19:19
DXUTみると
処理用と描画用のコールバックは
トータルフレーム時間と前フレームからの経過時間が受け取れるようになってるね
0803デフォルトの名無しさん2010/10/25(月) 22:31:50
ダイレクトサウンド使ってるんですが、
SEとBGMで大きくわけて音量を調整したいです。

この場合プライマリバッファを2個作ったほうがいいですか?
0804デフォルトの名無しさん2010/10/25(月) 22:36:07
ボリュームはセカンダリバッファごとに設定できるでしょ
0805デフォルトの名無しさん2010/10/25(月) 22:38:07
そうでしたっけ
すんづれいしました
0806デフォルトの名無しさん2010/10/25(月) 22:41:07
dxとfps固定
ttp://www.t-pot.com/program/103_FPSFixing/index.html

こんなんがあった
0807デフォルトの名無しさん2010/10/25(月) 22:41:39
>>801
内部の処理だけ回して描画しなけりゃいいじゃない
0808デフォルトの名無しさん2010/10/25(月) 23:06:34
>>806
本当にありがとうございます。助かりました!
0809デフォルトの名無しさん2010/10/25(月) 23:15:41
>>806
D3DPRESENT_INTERVAL_DEFAULTの挙動って、
確定じゃなかったような気がするんだが違ったかな
0810デフォルトの名無しさん2010/10/25(月) 23:23:45
>D3DPRESENT_INTERVAL_DEFAULT と D3DPRESENT_INTERVAL_ONE は、ほぼ等価です
>D3DPRESENT_INTERVAL_DEFAULT では、既定のシステム タイマーの分解能が使用されます。
>一方、D3DPRESENT_INTERVAL_ONE では timeBeginPeriod を呼び出し、システム タイマーの分解能を拡張します。
>これにより、垂直同期の品質が改善されますが、処理に時間が少し多くかかります。
>いずれのパラメーターの場合も、垂直同期が試行されます。
0811デフォルトの名無しさん2010/10/25(月) 23:27:09
でも、問題になってるのは垂直同期の仕方じゃなくて
固定動作で垂直同期した場合、
プレイ環境によりリフレッシュレートが60fpsだったり75fpsだったりして困るでしょ?って話じゃ
どうしても固定じゃないと処理が難しいって言うなら
Win32APIでもうゲーム中だけ60fpsに変更しちゃえよと思ってしまうが
0812デフォルトの名無しさん2010/10/25(月) 23:32:41
フルスクリーンモード
→望みのリフレッシュレートになる

ウィンドウモード
→垂直同期なんて気にする必要ない

って感じだった気がするけどそんなことない?
0813デフォルトの名無しさん2010/10/25(月) 23:35:58
>>811
頑張ってWINAPIで60FPSにしようとしたんですが、
ガタン、ガタンってなってしまうんです。
私の制御に問題があるんでしょうが。
0814デフォルトの名無しさん2010/10/25(月) 23:35:59
>>811

それだと、60Hzに対応してないモニタだと映らなくなったりチラついたりしないかね?

多くのウィンドウズゲームでティアリング発生が放置されているのは
結局モニタの垂直同期がバラバラだからって事だと思ってるけど。

因みに、俺の場合は高分解能パフォーマンスカウンタでFPS固定してる。
必要がないからコマ落ちは、一切みてない。
0815デフォルトの名無しさん2010/10/25(月) 23:37:24
話の元は>>770で、ティアリングが問題だった訳で、
>>806によりPresentがリフレッシュレートに同期し回避されますねって話では
0816デフォルトの名無しさん2010/10/25(月) 23:45:04
>>815
「ガタンガタン」って表現は、本当にティアリングの事なのか?
俺は、移動量が一定じゃなくて、たまに移動が変になるって読み取ったけど。
0817デフォルトの名無しさん2010/10/25(月) 23:46:43
60Hzに対応してないディスプレイとかあるの?
0818デフォルトの名無しさん2010/10/25(月) 23:51:21
対応しててもプログラムから強制変更できない環境が結構あるからねえ
08197702010/10/25(月) 23:55:53
ガタンガタンは
垂直同期待ちにしたら解消したので、ティアリングが原因かと思われます。
0820デフォルトの名無しさん2010/10/25(月) 23:58:16
DXライブラリなら気にしなくて済むのにね
0821デフォルトの名無しさん2010/10/25(月) 23:58:55
>>819
ウィンドウモードの話?
08227702010/10/25(月) 23:59:42
>>821
はい。ウィンドウモードです。
0823デフォルトの名無しさん2010/10/26(火) 00:28:42
元々のタイマー処理に穴があって、表示タイミング自体がずれていたのか
ティアリング現象によるチラつきが問題だったのかは闇の中だな・・・。
0824デフォルトの名無しさん2010/10/26(火) 00:39:09
>>796から推測するに>>816は否。よって>>823も否。

でおk? >>770 w
0825デフォルトの名無しさん2010/10/26(火) 01:09:57
ガタンガタンはわかるな
俺も綺麗にスクロールとかしたらなった気がする

でもそんときは同期またずに更新するようにしたらなんか直った記憶あるんだけどな
タイマでやってたときってD3DPRESENT_INTERVAL_IMMEDIATEだよね?
0826デフォルトの名無しさん2010/10/26(火) 01:42:57
いや、だから垂直同期時間とタイマのズレのせいで
0と1のダブルバッファとして
ズレが蓄積して1画面分に達すると

010101001010
     ↑
    ガタンとなる
0827デフォルトの名無しさん2010/10/26(火) 02:46:04
はまったので質問。

マルチパスレンダリングで描画しようとしてるんだけど
バックバッファにレンダリング済みのテクスチャの描画が
特定の状況のみできなくて困ってる

描画できない設定は以下
バックバッファのサイズが 800x450
レンダリング先テクスチャのサイズが 1280x720

描画できる設定は以下
バックバッファのサイズが 1280x720
レンダリング先テクスチャのサイズが 1280x720

レンダリングターゲットってバックバッファのサイズよりでかいと
ダメなのかな?
0828デフォルトの名無しさん2010/10/26(火) 03:05:30
>>827
デプスバッファはどうしてる?
0829デフォルトの名無しさん2010/10/26(火) 03:07:36
>>827

http://msdn.microsoft.com/ja-jp/library/bb147221(v=VS.85).aspx

>複数のレンダー ターゲットのすべてのサーフェスは、幅と高さが同じでなければなりません。
0830デフォルトの名無しさん2010/10/26(火) 03:15:32
>>828
深度も作ったけどダメだった。

>>829
まじかよ!困ります。
08317702010/10/26(火) 03:23:42
>>823-826
私にもはっきり原因がわかりません。
直ったときにやったことと言えば、

D3DPRESENT_INTERVAL_IMMEDIATEを0に変更。
FPS制御用の関数をメインループから外す。

この2点だけです。

ガタンガタンの表現が悪くて申し訳ないんですが、
縦でも横でも移動するときに発生します。
それは一定の間隔です。
通常ならスーッっと行くものが、一瞬ブルッと震える感じになります。

ただしこれは、壁にぶつかってるときはこの現象は起こりません。
その現象を具体的に説明すると、

if(x<LEFT_MAX)
x=LEFT_MAX;

上記のように上下左右に移動制限をかけてます。
このようなコードだと、左を押し続けてても、座標は変わりません。
ですが、キーは押し続けてるので移動している際のアニメーションは動きます。
この時はガタンガタンとはなりません。

壁にぶつからないときの移動の時に、ガタンガタンとなってしまうわけです。


個人的には自分でFPSを制御したいと思っています。
こんな感じです。
0832デフォルトの名無しさん2010/10/26(火) 03:51:59
垂直同期の回数とフリップの回数が違うのが原因
タイマの待ち時間を
16 17 17 16 17 17 16 17 17
みたいに1秒間に確実に60回になるようにやってみな
08337702010/10/26(火) 03:57:39
ありがとうございます
やってみます
0834デフォルトの名無しさん2010/10/26(火) 04:17:37
>>829-830
いや、それ複数のレンダーターゲットに同時に描画する機能の説明だから。

駄目な設定のときって、デバッグランタイムにしてデバッグメッセージ見たら、
何かメッセージ出てない?
0835デフォルトの名無しさん2010/10/26(火) 04:29:32
某サイトのせいで
MRTのことをマルチパスレンダリングって言ってるだとおもうけど
0836デフォルトの名無しさん2010/10/26(火) 13:41:26
頂点フォーマット(頂点宣言)の組み合わせって無数に在ると思うんですけど
同じものがあればそれを使う方法って無いですかね?
0837デフォルトの名無しさん2010/10/26(火) 13:53:33
は?じゃあ使えばいいだろ
0838デフォルトの名無しさん2010/10/26(火) 13:57:27
>>835
どこか判ったw
0839デフォルトの名無しさん2010/10/26(火) 14:06:33
この中にニートが何人かいるな。絶対。
0840デフォルトの名無しさん2010/10/26(火) 14:08:02
>>837
頂点バッファ作るたびに頂点宣言オブジェクトを作るってことですか?
0841デフォルトの名無しさん2010/10/26(火) 14:16:39
頂点宣言オブジェクトって何だよ。
説明してみな
0842デフォルトの名無しさん2010/10/26(火) 14:31:43
JAVAとかC#のnewってなにしてたんだっけ
コンストラクタとか言わないよね
0843デフォルトの名無しさん2010/10/26(火) 14:33:38
C++のnewは何をしているんでしょうね?www
0844デフォルトの名無しさん2010/10/26(火) 14:34:23
ですよねwww
0845デフォルトの名無しさん2010/10/26(火) 15:16:30
malloc
0846デフォルトの名無しさん2010/10/26(火) 15:25:00
callocでもいいんじゃよ?
0847デフォルトの名無しさん2010/10/26(火) 15:52:04
ID3DXMesh->DrawSubsetって内部でDrawPrimitiveが使われているみたいなのですが、
PRIMITIVETYPEではどれを使って描画してるのですか?
0848デフォルトの名無しさん2010/10/26(火) 16:13:43
MICROSFTに聞けや
0849デフォルトの名無しさん2010/10/26(火) 16:15:16
>>847
D3DPT_TRIANGLELIST
0850デフォルトの名無しさん2010/10/26(火) 16:47:04
>>848
おまえ消えろや
0851デフォルトの名無しさん2010/10/26(火) 17:00:05
顔真っ赤(笑)
0852デフォルトの名無しさん2010/10/26(火) 17:01:15
ヒント 初心者スレ
0853デフォルトの名無しさん2010/10/26(火) 17:01:57
知らないならレスしなきゃいいのにね。
0854デフォルトの名無しさん2010/10/26(火) 17:04:55
真っ赤(笑)
0855デフォルトの名無しさん2010/10/26(火) 17:10:26
公式より
>The subset that is specified by AttribId will be rendered by the IDirect3DDevice9::DrawIndexedPrimitive method,
>using the D3DPT_TRIANGLELIST primitive type, so an index buffer must be properly initialized.

PIXでみると中で何をどう呼んでるか全部見れるよ
■ このスレッドは過去ログ倉庫に格納されています