【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/
0213デフォルトの名無しさん
2010/10/05(火) 12:08:390214デフォルトの名無しさん
2010/10/05(火) 12:11:230215デフォルトの名無しさん
2010/10/05(火) 12:38:590216デフォルトの名無しさん
2010/10/05(火) 12:47:47だろ。の人は回答する気がないならいい加減消えればいいのに
0217デフォルトの名無しさん
2010/10/05(火) 12:59:42人が悪いなと思ってしまう。
0218デフォルトの名無しさん
2010/10/05(火) 13:22:130219デフォルトの名無しさん
2010/10/05(火) 13:29:030220デフォルトの名無しさん
2010/10/05(火) 13:56:58対処法がわかりません。教えて下さい。
fatal error RC1011: compiler limit : 'XSKINEXP_TEMPLATES': macro definition too big
0221デフォルトの名無しさん
2010/10/05(火) 14:00:50日本語でおk
0222デフォルトの名無しさん
2010/10/05(火) 14:08:520223デフォルトの名無しさん
2010/10/05(火) 14:12:07compiler limit : 'identifier' : macro definition "too big"
Try to split the definition into shorter definitions.
0224デフォルトの名無しさん
2010/10/05(火) 14:21:35MP3が読み込めません。
どうすればいいんでしょうか。
0225デフォルトの名無しさん
2010/10/05(火) 14:34:29XAudioだかはWMA風データなら読めるがMP3は読めない
MP3を簡単に再生するならWin32APIかDirectShow
ちゃんとやりたかったらSDKなりでWAVに変換せよ
0226デフォルトの名無しさん
2010/10/05(火) 14:36:30自前でデコードするかDirectShowを使うしかない
0227デフォルトの名無しさん
2010/10/05(火) 14:50:56oggなら展開用のライブラリもそのへんに転がってるし
0228デフォルトの名無しさん
2010/10/05(火) 15:47:29レスありがとうございます。
DirectShowやoggを検討してみます。
0229デフォルトの名無しさん
2010/10/05(火) 22:53:52結構安いと思うんだけど?
お前ら的にはあり?
IS01 1円スタート 即決有
http://page9.auctions.yahoo.co.jp/jp/auction/k134019945
http://page8.auctions.yahoo.co.jp/jp/auction/h145981541
http://page11.auctions.yahoo.co.jp/jp/auction/n91104112
http://page10.auctions.yahoo.co.jp/jp/auction/m77370908
http://page2.auctions.yahoo.co.jp/jp/auction/b113651808
IS02 1円スタート 即決有
http://page11.auctions.yahoo.co.jp/jp/auction/n93102178
http://page2.auctions.yahoo.co.jp/jp/auction/b113622828
http://page11.auctions.yahoo.co.jp/jp/auction/n92987886
0230デフォルトの名無しさん
2010/10/05(火) 22:59:49こいつ宣伝しまくってるな。
0231デフォルトの名無しさん
2010/10/05(火) 23:02:11面倒だけど癖になるからアク禁依頼だしてくるか
0232デフォルトの名無しさん
2010/10/06(水) 00:27:490233デフォルトの名無しさん
2010/10/06(水) 02:09:230234デフォルトの名無しさん
2010/10/06(水) 17:48:33読み込みから解放までを。
すみません。
0235デフォルトの名無しさん
2010/10/06(水) 18:06:57ファイル名や識別子などからリストを検索
未登録ならテクスチャを作成しリストに登録
登録済みならテクスチャへのポインタを返しAddRef(参照カウントを増やす)
必要なくなったら参照先でRelease
参照カウンタが0になったらリストから削除
0236デフォルトの名無しさん
2010/10/06(水) 18:21:14パスはレンダーステートとプログラムのセットですか?
0237デフォルトの名無しさん
2010/10/06(水) 18:22:49ありがとうございます。
描画する際もファイル名などからリストを検索して描画ルーチンに渡しているのでしょうか?
もしそうなら、その検索時間は気になりませんか?
0238デフォルトの名無しさん
2010/10/06(水) 18:24:04ハッシュマップとかIDでソートかけておくとか
0239デフォルトの名無しさん
2010/10/06(水) 18:26:450240デフォルトの名無しさん
2010/10/06(水) 18:26:55なるほど。ありがとうございます。
STLのコンテナを使わないのは何故ですか?
0241デフォルトの名無しさん
2010/10/06(水) 18:36:44しないよ
描画オブジェクトもテクスチャへのポインタを持たせておけば読み込み時の1回だけでいいだろう?
なんのための参照カウンタだ
0242デフォルトの名無しさん
2010/10/06(水) 19:30:24なるほど!本当にありがとうございます!
最高のシステムですね!参考にさせていただきます!
0243デフォルトの名無しさん
2010/10/06(水) 19:32:35本当に本当にありがとうございました!
0244デフォルトの名無しさん
2010/10/06(水) 20:44:49col.xyzw = 1と同じですか?
0245デフォルトの名無しさん
2010/10/06(水) 21:03:340246デフォルトの名無しさん
2010/10/06(水) 21:08:490247デフォルトの名無しさん
2010/10/06(水) 22:35:30自分は別な質問者ですが、
参照カウンタが0になったら、というので
内部参照カウンタの値を取得するにはどうすればよいですか?
それとも自分で数えておくのですか?
0248247
2010/10/06(水) 22:39:48ULONG = Hoge->addref() - 1;
Hoge->Relase();
ですね
0249デフォルトの名無しさん
2010/10/06(水) 23:31:020250デフォルトの名無しさん
2010/10/06(水) 23:41:090252デフォルトの名無しさん
2010/10/07(木) 09:24:14Syntax
C++
ULONG Release()
Return Value
Returns the new reference count. This value is for diagnostic and testing purposes only.
0253247
2010/10/07(木) 09:30:05まじすか ありがとうございます
じゃあ上の参照カウンタが0になったら、
っていうのは自分で数えておけということでしょうか?
それとももっとましな方法がありますか?
0254デフォルトの名無しさん
2010/10/07(木) 10:00:58自分で覚えておけばおk
0256デフォルトの名無しさん
2010/10/07(木) 11:13:43それって単にマルチスレッド環境での保証がされてないってだけじゃね?
0257デフォルトの名無しさん
2010/10/07(木) 13:58:14もっといい方法ないですか?
皆さんの描画システムを簡単に教えてほしいです。
0258デフォルトの名無しさん
2010/10/07(木) 14:06:26前提条件も把握せずに答える馬鹿が出てくるかもしれないが、
頭の悪い内容しか返ってこないぞ。
0259デフォルトの名無しさん
2010/10/07(木) 14:13:06テクスチャ型と座標を管理したクラス配列を持つクラスにやってもらう
てか、テクスチャ型と座標って何の話だ?www
0260デフォルトの名無しさん
2010/10/07(木) 14:28:26具体的に言うと、LPDIRECTD3DTEXTURE9とそのキャラクターの位置座標を渡して
描画してもらうようにしています。
>>259
こんな回答でも参考になります。
0261デフォルトの名無しさん
2010/10/07(木) 15:05:21【ソースコード】
for(i=DSBVOLUME_MAX; i>DSBVOLUME_MIN; i-=25)
{
pDSData->SetVolume(i);
Sleep(1);
}
pDSData->Stop();
フェードアウトの方法が間違っているのでしょうか。
よろしくお願いします。
0262デフォルトの名無しさん
2010/10/07(木) 15:05:49手段の説明しかしていないのが分からないのか?
0263デフォルトの名無しさん
2010/10/07(木) 15:08:46まずはサウンドカードを別の物に交換して確認する。
0265デフォルトの名無しさん
2010/10/07(木) 15:34:58日本語は通じてる?
対応云々の話なんて一切していない。
別のサウンドカードで確認しろと言ってるの。
0267デフォルトの名無しさん
2010/10/07(木) 15:40:210268デフォルトの名無しさん
2010/10/07(木) 15:44:54具体的にその2品の製品名なりチップセット名は?
0269デフォルトの名無しさん
2010/10/07(木) 16:01:10Sleep間隔を長くする。
もっとまともなタイマーを使う。
完全なフェードにするには1サンプル毎に減衰させる。
0270261
2010/10/07(木) 16:04:38wavデータをセカンダリバッファに書き込むときに減衰した値を書き込む訳ですね。
しかし、ストリーミング再生をしているので、恐らくセカンダリバッファをロックして
バッファの値を読んで減衰した値に書きなえないとダメだと思うのですが、
フェードアウトするためにバッファをロックするタイミングがわからなかったりします。
>>268
�@SoundMAX Integrated Digital Audio
�ADigidesign MBOX2Pro ← プロ用のDirectSound対応
です。
0271デフォルトの名無しさん
2010/10/07(木) 16:05:030272デフォルトの名無しさん
2010/10/07(木) 16:09:15サウンドカードとしては最悪に分類される製品。
音が出るだけありがたいと思わなければならない。
�ADigidesign MBOX2Pro ← プロ用のDirectSound対応
不明
0273デフォルトの名無しさん
2010/10/07(木) 16:19:060274デフォルトの名無しさん
2010/10/07(木) 16:20:20Sleep(1)が良くないんじゃね?
0275261
2010/10/07(木) 16:20:38>ボリューム値の変動を細かくする、Sleep間隔を長くする
10秒ぐらい掛けてフェードアウトするとなめらかなのですが・・・
50ms以内にフェードアウトしたいです。
>もっとまともなタイマーを使う
Sleepには、1ms〜14msのばらつきがあるのは確認しましたが、
もっとまともなタイマーを使うというのは、1msよりも短い時間で
ボリュームを変更するということを兼ねているのでしょうか。
>完全なフェードにするには1サンプル毎に減衰させる
本当はこれをやりたいのですが、どのような方法で実装すればよいのか
僕の技術力不足でわかりません。
>>272
>Digidesign MBOX2Pro
ミュージシャンがDirectSound対応のソフトシンセを使って
音を鳴らすことを前提に設計されているようです。
0276デフォルトの名無しさん
2010/10/07(木) 16:21:53USB接続の時点で、細かく切り替えたら駄目だろ。
0277デフォルトの名無しさん
2010/10/07(木) 16:24:49Sleep(16)くらいで試してくれ
0278デフォルトの名無しさん
2010/10/07(木) 16:27:30その衝撃がノイズになって当たり前なのは分かっているのか?
0279261
2010/10/07(木) 16:32:04僕も過去にそういう経験があったような気がします。
もともと、やりたいことは、
ストリーミング再生において、「play → stop → 曲を変えてplay」のときの
stop時に発生する、ノイズを消し去ることです。
ノイズを消し去る方法をインターネットで調べているうちに下記の方法を知りました。
----
セカンダリバッファを2つ用意して
1個目 -- 曲のplay → stop → 曲を変えてplay
2個目 -- 無音の音をずっと流す。
----
実装しましたが、stop時のノイズは消えませんでした。
>>276
IEEE1394仕様です。
>>277
了解しました。
Sleep(16)あたりで試してみます。
>>278
あまりわかっていません。
どこかのサイトで50msでフェードアウトするとstopノイズが消えると見かけたので
50msを目標にしています。
0280261
2010/10/07(木) 16:33:29>このバグの対処法として、セカンダリバッファの停止時に、
>50msくらいでフェードアウトさせると良い、とあります。
というのを見かけました・・・
0281デフォルトの名無しさん
2010/10/07(木) 16:34:305段階くらいのフェードアウトで十分だと思う
0282デフォルトの名無しさん
2010/10/07(木) 16:41:2250ms間隔でフェードアウトの間違いなんじゃ
0283デフォルトの名無しさん
2010/10/07(木) 16:59:53> 徐々に(50msぐらいで)フェードアウト
0284デフォルトの名無しさん
2010/10/07(木) 17:05:050285デフォルトの名無しさん
2010/10/07(木) 17:06:010286デフォルトの名無しさん
2010/10/07(木) 17:09:45二度とこないよ。
0287デフォルトの名無しさん
2010/10/07(木) 17:11:280288デフォルトの名無しさん
2010/10/07(木) 17:17:220289デフォルトの名無しさん
2010/10/07(木) 17:33:30DirectSoundって言うよりWDMサウンドデバイスのバグでしょ?
0290デフォルトの名無しさん
2010/10/07(木) 17:38:42さようならノシ
0291261
2010/10/07(木) 19:58:34LONG v;
float x;
for(x=0.0f; x<100.f; x+=2.0f)
{
v = (LONG)(x > 99.99f ? -10000 : -100.0f * log(100.0f / (100.0f - x)) / log(2.0f));
pDSData->SetVolume(v);
Sleep(1);
}
pDSData->Stop();
0292デフォルトの名無しさん
2010/10/07(木) 20:08:340293デフォルトの名無しさん
2010/10/07(木) 20:20:28変更間隔が短すぎてノイズが出るのは別問題
0294デフォルトの名無しさん
2010/10/07(木) 21:29:18x+=20.0fにしてSleep(10)くらいにしとけ
0295デフォルトの名無しさん
2010/10/07(木) 23:07:160296デフォルトの名無しさん
2010/10/07(木) 23:44:36timeBeginPeriod()で精度上げれるよ。
今はMSDNライブラリにも明記されてる。
ttp://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx
0297デフォルトの名無しさん
2010/10/07(木) 23:48:32Sleepから復帰させるスケジューラーがこの割り込み分解能より短い時間で仕事できないから
10msだったり16msだったりまちまち
timeBeginPeriod(1);
を呼べば精度の低いSleepでは限界があるものの1msに近づけることはできる
ところでtimeBeginPeriodを呼んでる臭いアプリ(WindowsMediaPlayerとか)を同時に立ち上げとくと
いきなりぬるぬる動き出すアプリあるよねw
そのプログラム内のみの変更じゃなくて
OS自体のタイマー割り込みに対する変更だから起動してる全てのアプリに影響があるので注意
0298261
2010/10/07(木) 23:57:37>ストップノイズが出るの
無音のwavファイルを再生中にストップしてもノイズが出なかったので、
ストップノイズの問題は発生してないようです。
>変更間隔が短すぎてノイズが出るの
>>294に教えていただいた値にしたいと思います。
しかし、最大の疑問は、
『v = x > 99.99f ? -10000 : -100.0f * log(100.0f / (100.0f - x)) / log(2.0f);』
の式が本当にあっているか、とても怪しいです。
上記の式では、音は多少小さくなりますが、きちんと無音までフェードアウトしているようには
聞こえないからです。
ちなみにこのサイトに情報が載っていました。
ttp://www.hgw-a.info/?date=200304
申し訳ありませんが、音の世界に詳しい人に上記の式を検証していただけると幸いです。
>>295
PentiumMのWinXPの場合、Sleep(1)は、timeGetTimeの精度を1msに上げて
測定したところ、ほとんどが1〜2ms、ばらつきがあり、最大が14msでした。
>>295の結果は酷く精度が悪いですね。僕の持っているマシンがたまたま精度がいいだけかも。
0299261
2010/10/08(金) 00:01:27その方法で精度を上げています。
>>297
>ところでtimeBeginPeriodを呼んでる臭いアプリ(WindowsMediaPlayerとか)を
>同時に立ち上げとくといきなりぬるぬる動き出すアプリあるよねw
興味があるので検証してみたいと思います。
0300デフォルトの名無しさん
2010/10/08(金) 01:12:120301デフォルトの名無しさん
2010/10/08(金) 01:12:49とりあえず今回に限ってはその式を適用させる意味はないよ
50msのフェードはユーザーに聞かせるための目的じゃないから普通に線形にボリュームを下げていいかと
一応書いとくと
「-100.0f」 * log(100.0f / (100.0f - x)) / log(2.0f);
↑の-100.0fがボリューム(x)が半分(50)の時の値になる
そこに書いてあることが正しくて
10db(10%)下がった時に半分に聞こえるとするなら
DSBVOLUME_MINの10%である-1000.0fじゃないとおかしい
0302デフォルトの名無しさん
2010/10/08(金) 01:24:28人のソースを意味も分からずコピペして
「怪しいです」「検証してください」はどうかと・・・。
ソースを公開している方にも失礼ですよ。明らかに間違っているならともかく。
x > 99.99f のときに -10000 (-10000が無音と仮定) になるんだから、
式が間違ってるわけではないでしょう。
検証するとすれば、
DSBVOLUME_MIN(無音) が本当に -10000 かどうか
x > 99.99f になるルートがあるか
といった部分だと思う。
>>291のソースでは、x =98 でループを抜けてしまう(xが100にならない)から
無音にならないのでは?
0303デフォルトの名無しさん
2010/10/08(金) 02:12:17あと>>261や>>291だと、時間が基準になってないから
思ったようなきれいなカーブ/線を描かないと思う。
設定するボリュームは、経過時間/フェード時間 を基準にするべき。
double total, fadetime;
clock_t start, end;
total = 0;
fadetime = 2.0f; //フェード時間(秒)
while (total < fadetime)
{
start = clock();
pDSData->SetVolume(DSBVOLUME_MIN * total / fadetime);
Sleep(1);
end = clock();
total += (double)(end - start) / CLOCKS_PER_SEC;
}
pDSData->SetVolume(DSBVOLUME_MIN)
こんな感じ?Volume計算式とかSleepの値は調整してね。
環境なくてちゃんと試してないけどご容赦を。
0304デフォルトの名無しさん
2010/10/08(金) 02:40:46いや、時間を基準とか関係無しに
線形にデジベルを下げると
音の性質上急速にボリュームが下がってしまうという話だから
言ってることは正しいが今は関係ない
組み合わせて
pDSData->SetVolume(-1000.0f*log(1.0f-total/fadetime)/log(0.5f));
とするなら有りだと思うが
0305デフォルトの名無しさん
2010/10/08(金) 02:41:38エラーですか?どうやらClearなどは成功していて、この関数だけが失敗しているようなんですが
0306デフォルトの名無しさん
2010/10/08(金) 02:53:06HRESULT: 0x8876086c (2289436780)
Name: D3DERR_INVALIDCALL
Description: Invalid call
Severity code: Failed
Facility Code: FACILITY_D3D (2166)
Error Code: 0x086c (2156)
呼び出しが無効
引数が不正か
IDirect3DDevice9::Presentの場合
BeginScene 〜 EndScene のペア間で呼び出されると、失敗し、D3DERR_INVALIDCALL を返す
参考までに教えとくと
SDKインストール時に一緒に入ってくる
DirectX Utilitiesのなかに
DirectX Error Lookupというツールが入ってる
16進ならHex、今回のように10進ならDecimalにチェックいれてLookUpでエラーコードを確認できる
0307デフォルトの名無しさん
2010/10/08(金) 03:03:54http://msdn.microsoft.com/ja-jp/library/bb173034(v=VS.85).aspx
失敗したときに原因がすぐ分かるようにしといたほうがいいよ
0308デフォルトの名無しさん
2010/10/08(金) 03:17:31>>307
ありがとうございます。BeginScene〜EndScene間で呼んじゃってました。
エラー処理って大事ですね、今度から使うようにします
0309デフォルトの名無しさん
2010/10/08(金) 08:18:21こんな便利なのあったのか
半年間知らずにdirectXやってた
0310261
2010/10/08(金) 16:46:48>>303と>>304のソースを、そのまま使わせていただきましたが、
SetVolume命令を使うとSleepを何ミリ秒にしようが、
ノイズが乗る仕様だと諦めました。
『fadetime = 0.3f; //フェード時間(秒)』にて実装しました。
>>303
ソースを動く状態で載せていただき、大変感謝しております。
>>304
ご指摘ありがとうございます。
>>303の方法とマージさせていただきました。
0311デフォルトの名無しさん
2010/10/08(金) 18:40:060312デフォルトの名無しさん
2010/10/08(金) 19:25:260313デフォルトの名無しさん
2010/10/08(金) 20:21:24ダイアログベースのアプリのこと?
CLIで作ったWindowsフォームアプリケーションのこと?
■ このスレッドは過去ログ倉庫に格納されています