【C++】 DirectX初心者質問スレ Part12 【C】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/12/24(日) 08:11:46これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前スレ 【C++】 DirectX初心者質問スレ Part11 【C】
http://pc8.2ch.net/test/read.cgi/tech/1159456184/
0153デフォルトの名無しさん
2007/03/04(日) 17:57:40たぶんシェーダが問題なのではなく、RenderState等だと思う。
シェーダに問題があれば、コンパイル時にエラーが出るんじゃないかな。
シェーダのコンパイルでエラー出てないよね?
RenderStateやSamplerStateは影響するものは全て自分で設定しないと駄目。
default値をあてにしてはいけない。ドライバで勝手に変えてる設定も多い。
HALとREFでは使える機能に差はあるが、使える範囲内で使う分には基本的に
動作に違いはないよ。(そのためのリファレンスラスタライザだし)
0154150
2007/03/04(日) 18:04:25ありがとうございます。
なるほど。確かにシェーダーのコンパイルでエラー出ませんね。
ちょっと全部のRenderState見直して設定してみます。
0155デフォルトの名無しさん
2007/03/05(月) 10:26:27となるとゲームとか作って配布する際にAVIファイルを丸出しにしないといけません。
それはいやなので、どうにかその生ファイルが見えない形にして
配布したいのですが、そういう場合はどういった方法がありますか?
0156デフォルトの名無しさん
2007/03/05(月) 11:01:48暗号化する
0157名無しさん@お腹いっぱい。
2007/03/05(月) 13:12:02ありがとうございます。暗号化は一つの方法としてあると思うんですが
ファイルの暗号化自体のプログラムについてはおいて置くとして、
まず動画ファイルを読み込んで再生するために
MDXを使う場合はnew Video(path);のようにファイル名を渡さないといけません。
プラットフォームSDKにもAVIFIELOPEN等、動画再生の関数があるみたいですが、
これもファイル名を指定して読み込んだりするようです。
なので暗号化したファイルを読み込み→再生する間の部分で
どういう事をすればよいのかが想像できないというか、分かりません。
その辺の事を教えていただけないでしょうか。
0158デフォルトの名無しさん
2007/03/05(月) 13:15:240159名無しさん@お腹いっぱい。
2007/03/05(月) 13:38:47暗号解除までのやり方はなんとなく想像がついていますが、
例えばこれが元もとAVI形式のファイルだった場合に
>デコーダのインタフェイスに渡して再生。
この辺がどうすればいいのか分かりません。
復号化したAVIのバイナリデータを渡したら再生してくれる
関数かなんかがどこかに用意されてるんでしょうか?
0160デフォルトの名無しさん
2007/03/05(月) 13:42:250161デフォルトの名無しさん
2007/03/05(月) 13:58:540162名無しさん@お腹いっぱい。
2007/03/05(月) 14:23:20要するに復号化したデータを渡す関数等がDirectShowにあるなら
名前を教えてください。調べてみたところどれも普通に〜.aviとか
ファイル名で指定してるようなので、どうしたらいいのかさっぱりわかりません。
0163デフォルトの名無しさん
2007/03/05(月) 14:34:49そしたら『普通に〜.aviとかファイル名で指定してる』の意味がわかるから。
0164名無しさん@お腹いっぱい。
2007/03/05(月) 15:11:28自分で暗号化したファイルを読み込んで複合化して、
それをどうやってその関数に渡したらよいのですか?
0165名無しさん@お腹いっぱい。
2007/03/05(月) 15:24:27私にそこから何を得る事を期待してそういって頂いているのかがわかりません。
例えば適当なバイナリのテキストファイルを読み込んで
暗号化したり複合化したりというのは、やろうと思えばできると思います。
でもデータはメモリの上で操作しているわけで、、、
再生関数などに渡す必要があるのは「ファイル名」でして・・・
複合化したデータをファイルに書き出したりするのはできますが、、、。
複合化したデータを一旦.aviで書き出してそれを再生関数に渡せといっているのか、、、それはないですよね?
0166デフォルトの名無しさん
2007/03/05(月) 16:01:49適切なソースフィルターを作成してバイナリーストリームを流し込み再生する。
0167デフォルトの名無しさん
2007/03/05(月) 16:57:040168名無しさん@お腹いっぱい。
2007/03/05(月) 17:58:55そこから何かを得られる事に期待します・・・
ありがとうございました。
0169デフォルトの名無しさん
2007/03/05(月) 21:09:410170デフォルトの名無しさん
2007/03/05(月) 21:21:070171名無しさん@お腹いっぱい。
2007/03/05(月) 21:37:41どんな形式のファイルを渡しても
勝手に解釈して読み込んで表示してくれる便利な関数があったら
ぜひ使いたいので教えてください。お願いします。
0172デフォルトの名無しさん
2007/03/05(月) 22:53:22全部とはいかんがな。
0173155
2007/03/06(火) 11:26:03普通に「ディスク上の.aviファイル」を再生するのは
フィルタグラフを作るまでもなくRenderFileで簡単にできました。
しかし今回は暗号化されたファイルを復号化して再生することが目的です。
なので次にttp://www.firefly-vj.net/dshow/graph/make.html
を参考にしつつ自前でフィルタグラフを構築して再生してみようと思ったんですけど、
結局ここでもAddSourceFilterの部分で「ファイルからロード」してるので
「復号化したメモリ上のデータ」からフィルタを作る方法が分かりませんでした。
>バイナリーストリームを流し込み再生する。
ここ↑がどうすればよいのか分かりません。
どなたか教えてください。お願いします。
0174デフォルトの名無しさん
2007/03/06(火) 12:02:590175デフォルトの名無しさん
2007/03/06(火) 12:06:150176155
2007/03/06(火) 12:19:39そういうことですか・・・
果てしなくめんどくさそうですねこれは・・・
勉強します。ありがとうございました。
0177デフォルトの名無しさん
2007/03/06(火) 13:09:05そっちも面倒そうだけどな。
0178155
2007/03/06(火) 13:12:42「暗号ファイル→復号→DS」以外の方法はないものですか。
0179デフォルトの名無しさん
2007/03/06(火) 13:15:230180デフォルトの名無しさん
2007/03/06(火) 13:17:030181デフォルトの名無しさん
2007/03/06(火) 13:17:412. 再生直前になったら先頭4バイトを元に戻す
3. DirectShow で再生する。
4. 終わったらまた4バイトを弄くっておく。
0183デフォルトの名無しさん
2007/03/06(火) 13:31:09memfile.cpp
0185デフォルトの名無しさん
2007/03/06(火) 15:00:56異常終了したときにavi丸出しになり、
次から再生できなくなるという罠か。
0186デフォルトの名無しさん
2007/03/06(火) 15:09:230187デフォルトの名無しさん
2007/03/06(火) 23:38:320188155
2007/03/07(水) 05:22:23メモリ上のバイナリデータをDSより簡単に再生する方法がありますか。
0189デフォルトの名無しさん
2007/03/07(水) 07:14:030190デフォルトの名無しさん
2007/03/08(木) 18:04:27ここで指定するデータサイズの上限ってあるのでしょうか?
構造体
D3DXVECTOR4を16個メンバとして持っている構造体のデータサイズ(sizeofで)を指定すると
stream stride is too big. Check device caps.
SetStreamSource failed.
とエラーが出ます。
御願いします。
0191デフォルトの名無しさん
2007/03/08(木) 18:42:59ビデオカードによって頂点数・インデックス数に制限がある。
GetDeviceCapsでMaxVertexIndexとかMaxPrimitiveCountとかみるか、
(SDKDir)\Samples\C++\Direct3D\ConfigSystemにある
CardCaps.xlsってのを見るといろいろ書いてある。
0192190
2007/03/08(木) 18:46:00それだとMaxStreamStrideだね。 でもそんなのなったことないから
解決するかどうかは知らん。
0193デフォルトの名無しさん
2007/03/08(木) 18:46:37名前190ってしたけど間違い191ね。
0194190
2007/03/08(木) 19:00:11CardCaps.xlsの私の使っているグラボを見るとMaxStreamStrideが255となってました。
D3DXVECTOR4 15個はOKなんのに16は駄目な理由が分かりました。
有り難うございますm(_ _)m
さて、どうしたらしいものか・・・
0195デフォルトの名無しさん
2007/03/08(木) 19:21:14255は無いだろ、常識的に考えて・・
と思ったけど、俺のカードは508だった
うざいなD3DCAPSは
0196デフォルトの名無しさん
2007/03/08(木) 23:27:464バイト4要素が指定できる最大サイズの型だから
16*16=256でMaxStreamStride256よりでかくても意味なくね?
0197デフォルトの名無しさん
2007/03/08(木) 23:46:08DirectShowにあるAsyncというソースフィルタのサンプルで
AVIファイルを開いて再生って出来る?
出来るならAsyncを改造するだけで出来そうだね。
ちょっとデータの一部をXORしたりして
再生できないようにするだけで目的は達成できそうだし。
独自のI/FでXORする値を指定するようにすれば
専用アプリなしのグラフエディットで再生させることも出来なくできるし。
ソースフィルタとスプリッタが一体なやつだと
この手は使えないかもしれないが
AVIはできたような気がする。
出来なかったらごめんね。
0198デフォルトの名無しさん
2007/03/09(金) 00:21:26ん?最高16ってMaxStream?
それはストリーム16本ってことだと思うけど。
1本のストリームに何頂点おくれるかは、
MaxPrimitiveCountとかIndexedならMaxVertexIndexの方だと思うけど。
0199デフォルトの名無しさん
2007/03/13(火) 19:16:55頂点座標とかを直打ちした板ポリみたいなのに適用するときはないとダメっぽかったんですけど、
Xファイルに頂点シェーダを適用するときはやらなくてもちゃんと動いたので、
必要なときと必要でないときの違いはあまりわかりません。
Xファイルだけ特殊ってことなんでしょうか?
0200デフォルトの名無しさん
2007/03/13(火) 20:46:30必要
まあ本当なら、不要な情報なんだけれど
D3Dがよこせと言っているんだから仕方ない。
>>Xファイル
これが何を指しているかは不明だが
D3DXのヘルパオブジェのことなら
あれは内部的に呼び出してる。
0201デフォルトの名無しさん
2007/03/14(水) 11:28:14どう見ても2Dなんですけど
0202デフォルトの名無しさん
2007/03/14(水) 11:41:362DだとDirectX使っちゃダメみたいな言い方だな。
何で作ってるかなんて知らないけど。
0203デフォルトの名無しさん
2007/03/14(水) 11:52:27なんでDX9で2Dゲーム作ったらダメなの?
DX10かもよwwww
0204デフォルトの名無しさん
2007/03/14(水) 11:55:37DirectSoundもDirectInputもだめですか>>201
0205デフォルトの名無しさん
2007/03/14(水) 19:34:58の利用法を指定する引数Usageについての質問です。
ヘルプを読むとD3DUSAGE 定数を指定すると書いてあり、
今まで、D3DUSAGE_WRITEONLYとかを指定していたわけですが、
今日、ふとヘルプをよく読んでいたら、ヘルプの[注意]の所に、
>頂点バッファを作成するとき、CreateVertexBuffer は利用法パラメータを使って、ハードウェアとソフトウェアのどちらで頂点を処理するか決定します。
>CreateDevice が D3DCREATE_HARDWARE_VERTEXPROCESSING を使う場合、CreateVertexBuffer は 0 を使う必要があります。
>CreateDevice が D3DCREATE_SOFTWARE_VERTEXPROCESSING を使う場合、CreateVertexBuffer は 0 または D3DUSAGE_SOFTWAREPROCESSING を使う必要があります。どちらの値でも、頂点はソフトウェアで処理されます。
>CreateDevice が D3DCREATE_MIXED_VERTEXPROCESSING を使う場合、CreateVertexBuffer は 0 または D3DUSAGE_SOFTWAREPROCESSING を使えます。
こんなことが書いてあり、これを読む限り、引数のUsageの所は、
0かD3DUSAGE_SOFTWAREPROCESSINGを使えと自分は解釈しました。
しかし、これじゃあ、D3DUSAGE_WRITEONLYとかは使ってはいけないことに
なってしまう・・・
DirectXの解説本とかでは、普通にD3DUSAGE_WRITEONLYとかを使っている・・
これは、どのように解釈することが正しいのでしょうか?
よろしくおねがいします。
0206デフォルトの名無しさん
2007/03/14(水) 20:47:48D3DUSAGEの項みろよ
0207デフォルトの名無しさん
2007/03/14(水) 20:54:59いちいち釣られるな
0208デフォルトの名無しさん
2007/03/14(水) 21:57:58D3DUSAGE定数の意味を聞いてるわけじゃないんですよ
[注意]の部分の説明は、
CreateDevice関数の引数で D3DCREATE_HARDWARE_VERTEXPROCESSING
を使ったら、CreateVertexBufferのUsageの引数に「0」を使う必要があると
書いてある。
この言い分だと、「0」以外の定数は使えないということになるけど、
実際は、サンプルとかでは「0」以外の定数をUsageに指定しています。
これはおかしくはありませんか?
[注意]が間違っているのか、サンプルが間違っているのか
どちらでしょう?
と言うことを質問しにきたんです。
0209デフォルトの名無しさん
2007/03/14(水) 23:11:29> ただし、使用法が必要な場合は、1 つまたは複数の D3DUSAGE 定数の組み合わせを使用する
0210デフォルトの名無しさん
2007/03/14(水) 23:22:17それは、exciteでの翻訳なので当てになりません。
0211デフォルトの名無しさん
2007/03/15(木) 03:12:240212デフォルトの名無しさん
2007/03/15(木) 03:28:120213デフォルトの名無しさん
2007/03/15(木) 03:35:49サンプルかなにかどっかにないもんでしょうか?
0214デフォルトの名無しさん
2007/03/15(木) 23:47:50何箇所かサイトを巡ったところ細かいところで違うような気がしたのですが
初期化などはその都度必要な事だけを書いているのでしょうか?
または、MSのほうで初期化ライブラリなどがあるのでしょうか?
0215デフォルトの名無しさん
2007/03/16(金) 00:00:590216デフォルトの名無しさん
2007/03/16(金) 00:23:55くだらんこと悩まずにさっさと書いちまえ。
0217デフォルトの名無しさん
2007/03/16(金) 00:27:18自分の環境だけで動かすんだったら0.001%かもしれんが
0218デフォルトの名無しさん
2007/03/16(金) 01:12:010219デフォルトの名無しさん
2007/03/16(金) 03:05:19いやいや、自分が満足できる初期化コードを1回書いたら
後から何かすることなんてそう頻繁にはないってことだろ
0220デフォルトの名無しさん
2007/03/16(金) 05:04:13以前のを代用できるところは代用するよな。
ゲームなら、UIとかも代用できる
ウェイ!
0221デフォルトの名無しさん
2007/03/18(日) 01:11:40たとえばalphablend=trueが記述されていて、ほとんどはそれを用いるけれど稀にfalseにしたいとか
lightingのon/offの違うのを見たいとか
いちいち別バージョンを作らなくてはならないんでしょうか。
組み合わせが爆発しないんでしょうか?
0222デフォルトの名無しさん
2007/03/18(日) 01:57:59technique T { pass P { fillMode = g_fillMode;}}
------------------------------------------
pEffect->SetInt( "g_fillMode", D3DFILL_SOLID);
0223デフォルトの名無しさん
2007/03/18(日) 02:43:25http://pc11.2ch.net/test/read.cgi/tech/1173535400/
ってどうちがうんだ?
あ、向こうは超初心者か。。
0224デフォルトの名無しさん
2007/03/20(火) 02:40:56ほかのひとPCでは、Clear()部分しか表示されません。
2D表示方法は板ポリゴンに、テクスチャをはっています。
SetTexture,SetFVF,DrawPrimitiveUPは成功しています。
開発環境はWinXPSP2 VC++2005とDirectX2006decです。
0225デフォルトの名無しさん
2007/03/20(火) 03:03:55ライティングをOFFにしてないとか?
0226224
2007/03/20(火) 03:12:450227224
2007/03/20(火) 14:00:28d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat= D3DFMT_D16;
上のコードを削除すればすべての環境で動くようになりました。
参考までに自分のビデオカードは、RADEON X700です。
ClearではZバッファを使用していないので、不具合が生じたと思います
0228デフォルトの名無しさん
2007/03/20(火) 14:21:39なんていうか EnableAutoDepthStencil = TRUE なら
Zバッファはちゃんとクリアしないといけないでしょ。
0229デフォルトの名無しさん
2007/03/20(火) 17:04:55開放するように記述すると、プログラム終了時にVC++が
デバッグ欄にメモリエラー報告しまくるんですが、
テクスチャの開放のタイミングはいつが適切なんでしょうか?
教えてください。
開発環境はVC++2005pro、DirectX9です。
D3DXCreateTexture()関数呼び出し直後や描画毎などに
開放した場合、メモリエラーは発生しません。
0230デフォルトの名無しさん
2007/03/20(火) 17:08:010231デフォルトの名無しさん
2007/03/20(火) 17:08:12行っていますが、こちらは問題なしです。
0232229
2007/03/20(火) 18:07:32ありがとうございます。
0233デフォルトの名無しさん
2007/03/28(水) 17:06:28テクスチャーを2600*2600などという大きいものにしたところ、どうやらビデオカードの限界だったらしく2048*2048に大きさが丸め込まれてしまいました。
それは構わないのですが、丸めこむときの挙動が
「はみでた部分を削除」なようなのです。
これは仕様に基づいた動作(他のビデオカードで丸め込まれた時も同じ挙動をする)なのでしょうか?
なんとなくイメージで「テクスチャーサイズ限界を超えた場合、限界サイズに収まるように勝手に画像が勝手に縮小される」のではないかと思っていたのですが…。(このイメージに根拠は無いです)
0234デフォルトの名無しさん
2007/03/28(水) 17:19:27テクスチャを2は累乗で表される幅と高さにしないとダメ
4096*4096でテクスチャを用意し、
2600*2600の部分だけ表示させればよい。
0235デフォルトの名無しさん
2007/03/28(水) 17:25:25お返事ありがとうございます。
確かに2の累乗しかサポートしていないボードがほとんどのようですね。
ただ、どうやら私のボードは2048*2048が限界らしいのです。
例えば800*600のテクスチャーは、読み込んだときに1024*1024になることを確認済みです。
描画するとき、tu=(1.0f * nX / 800)ではなく tu=(1.0f * nX / 1024)とすることで思ったとおりの描画ができていました。
ですが今回2600*2600を読ませたときは、期待通り4096*4096にしてくれなかったのです。
「それならきっと、(多少テクスチャが汚くなるけど)縮小して収めてくれてるだろう」と思ったら、切り捨てられていたのです。個人的にはちょっとびっくりでした。
0236デフォルトの名無しさん
2007/03/28(水) 17:27:24普通に考えてそんなにいらないしな
0237デフォルトの名無しさん
2007/03/28(水) 17:33:56報告させていただきます。
D3DXCreateTextureFromFileInMemoryEx
の
Filter引数に
D3DX_FILTER_NONE を指定していたからでした。
D3DX_FILTER_LINEAR を指定することで想定どおりとなりました。
ただ、限界を超えていないときにも(2の累乗以外の画像を読み込むと)、確保したサイズに強制的にあわせるようです。
つまり、無駄に「一旦引き伸ばしてテクスチャとして持ち、その後縮小して表示」することになるのでアンチエイリアシングが行なわれてしまうようです。
ドット絵のようなものは、素直に2の累乗にしたり、小さめの画像D3DX_FILTER_NONE読み込みしたほうが良いと思われます。
0238デフォルトの名無しさん
2007/03/28(水) 19:09:160239デフォルトの名無しさん
2007/03/28(水) 20:19:23それはD3DXのヘルパ関数の挙動だろ、D3Dやボードの挙動じゃない。
また2のn乗の制限や最大解像度は、全てCAPSから得られるので
そっちを根拠とすべき。
0240デフォルトの名無しさん
2007/04/03(火) 21:12:27D3DXCreateTextureFromFileExでD3DX_FILTER_NONEを指定して画像を読み込みました。
その後
m_pD3DDEV->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
を設定した上で画像を矩形ポリゴンに貼り付けて表示したところ、なんだか不自然な挙動をします。
等倍の時はいいのですが、縮小されるように矩形ポリゴンの大きさを小さくしていくと、
テクスチャが黒ずんだり、さらに小さくするとテクスチャが透けたり、
D3DXCreateTextureFromFileExでD3DX_FILTER_LINEARを指定してやると、綺麗に縮小表示されます。
テクスチャの読み込みと、SetSamplerStateでの設定は、両方D3DX_FILTER_LINEARにしてやらないといけないのでしょうか?
両方D3DX_FILTER_NONEにしても想定通り縮小表示されたのですが、アンチエイリアシングがかからないためかなり荒かったです。
0241デフォルトの名無しさん
2007/04/03(火) 23:21:49どうでもいいが、SetSamplerStateで使うのはD3DX_FILTER_LINEARじゃなくてD3DTEXF_LINEARな
0242デフォルトの名無しさん
2007/04/03(火) 23:34:34D3DXCreateTextureFromFileEx のフィルタってFilterとMipFilterの2つあって、
Filter は 画像->テクスチャでサイズが違う時とかに掛けるフィルタだから
同サイズならNONEでもいけるかもしれないけど、
MipFilter は NONEだとまともなミップマップにならないわね。
0243デフォルトの名無しさん
2007/04/04(水) 04:00:30App.pDirect3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, App.hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &App.PresentParameter, &App.pDevice );
D3DXCreateFont( dev, 32, 16, FW_NORMAL, 0, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_SCRIPT, TEXT("MS Pゴシック"), &font)
DirectX9.0cで、上記のCreateFontを実行すると、上のCreateDeviceでデバイス生成済みの場合は正常にフォントが作成できますが(ただし動作が遅すぎる)、
下のCreateDeviceを使った場合に、フォントの作成に失敗します
テスト環境はWindowsXP、グラフィックカードはIntel 82815(オンボード)、ドライバは最新版です
グラフィックカードは、DirectX9.0cに完全には対応してませんが、それが原因でしょうか。フォント作成で失敗するのが不可解です
オンボードなど多くの環境でできる、2D表示のRTSのネットゲーム(百人以上のユーザを想定)を作ってますが、
DirectXのバージョンを下げるなら、どのバージョンが適してるでしょうか
0244243
2007/04/04(水) 04:05:090245デフォルトの名無しさん
2007/04/04(水) 11:22:43関係ないと思うけど
×"MS Pゴシック"
○"MS Pゴシック"ね
0246デフォルトの名無しさん
2007/04/08(日) 22:32:300247デフォルトの名無しさん
2007/04/08(日) 23:18:40△→▽
□→■
色々あるんだがな。
しかもスプライトという用語自体がいったい何を指すのか不明だし。
0248デフォルトの名無しさん
2007/04/08(日) 23:28:08みたいな反転。
0249デフォルトの名無しさん
2007/04/08(日) 23:50:550250デフォルトの名無しさん
2007/04/08(日) 23:58:05UVの開始と終了の値を逆にする
0251デフォルトの名無しさん
2007/04/09(月) 00:00:46ヨ→m→Eなのか
ヨ→ | →Eなのかわからん
0252デフォルトの名無しさん
2007/04/09(月) 00:30:18それを知って何か意味があるの?
■ このスレッドは過去ログ倉庫に格納されています