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

【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
>>152
たぶんシェーダが問題なのではなく、RenderState等だと思う。
シェーダに問題があれば、コンパイル時にエラーが出るんじゃないかな。
シェーダのコンパイルでエラー出てないよね?

RenderStateやSamplerStateは影響するものは全て自分で設定しないと駄目。
default値をあてにしてはいけない。ドライバで勝手に変えてる設定も多い。

HALとREFでは使える機能に差はあるが、使える範囲内で使う分には基本的に
動作に違いはないよ。(そのためのリファレンスラスタライザだし)
01541502007/03/04(日) 18:04:25
>>153
ありがとうございます。

なるほど。確かにシェーダーのコンパイルでエラー出ませんね。
ちょっと全部のRenderState見直して設定してみます。
0155デフォルトの名無しさん2007/03/05(月) 10:26:27
DirectXでAVI等の動画ファイルを再生する関数などはあったとおもうんですけど、
となるとゲームとか作って配布する際にAVIファイルを丸出しにしないといけません。
それはいやなので、どうにかその生ファイルが見えない形にして
配布したいのですが、そういう場合はどういった方法がありますか?
0156デフォルトの名無しさん2007/03/05(月) 11:01:48
>>155
暗号化する
0157名無しさん@お腹いっぱい。2007/03/05(月) 13:12:02
>>156
ありがとうございます。暗号化は一つの方法としてあると思うんですが
ファイルの暗号化自体のプログラムについてはおいて置くとして、
まず動画ファイルを読み込んで再生するために
MDXを使う場合はnew Video(path);のようにファイル名を渡さないといけません。
プラットフォームSDKにもAVIFIELOPEN等、動画再生の関数があるみたいですが、
これもファイル名を指定して読み込んだりするようです。
なので暗号化したファイルを読み込み→再生する間の部分で
どういう事をすればよいのかが想像できないというか、分かりません。
その辺の事を教えていただけないでしょうか。
0158デフォルトの名無しさん2007/03/05(月) 13:15:24
バイナリを自前で読んで暗号を解除した後、デコーダのインタフェイスに渡して再生。
0159名無しさん@お腹いっぱい。2007/03/05(月) 13:38:47
>>158
暗号解除までのやり方はなんとなく想像がついていますが、
例えばこれが元もとAVI形式のファイルだった場合に
>デコーダのインタフェイスに渡して再生。
この辺がどうすればいいのか分かりません。
復号化したAVIのバイナリデータを渡したら再生してくれる
関数かなんかがどこかに用意されてるんでしょうか?
0160デフォルトの名無しさん2007/03/05(月) 13:42:25
DirectShow
0161デフォルトの名無しさん2007/03/05(月) 13:58:54
まずは、自前で普通のファイルを対象としたストリーミングを組んでごらん。
0162名無しさん@お腹いっぱい。2007/03/05(月) 14:23:20
図々しくてすいませんが余裕がないんで端的に教えて欲しいんですけど、
要するに復号化したデータを渡す関数等がDirectShowにあるなら
名前を教えてください。調べてみたところどれも普通に〜.aviとか
ファイル名で指定してるようなので、どうしたらいいのかさっぱりわかりません。
0163デフォルトの名無しさん2007/03/05(月) 14:34:49
161と同じで、とりあえず組め。
そしたら『普通に〜.aviとかファイル名で指定してる』の意味がわかるから。
0164名無しさん@お腹いっぱい。2007/03/05(月) 15:11:28
でも最終的にファイル名を指定して渡さなきゃいけないんですけど・・・
自分で暗号化したファイルを読み込んで複合化して、
それをどうやってその関数に渡したらよいのですか?
0165名無しさん@お腹いっぱい。2007/03/05(月) 15:24:27
・・・自分で組んでみろというのが
私にそこから何を得る事を期待してそういって頂いているのかがわかりません。
例えば適当なバイナリのテキストファイルを読み込んで
暗号化したり複合化したりというのは、やろうと思えばできると思います。
でもデータはメモリの上で操作しているわけで、、、
再生関数などに渡す必要があるのは「ファイル名」でして・・・
複合化したデータをファイルに書き出したりするのはできますが、、、。
複合化したデータを一旦.aviで書き出してそれを再生関数に渡せといっているのか、、、それはないですよね?
0166デフォルトの名無しさん2007/03/05(月) 16:01:49
複合化したaviファイルのヘッダ部分からcodec情報等を取り出して、
適切なソースフィルターを作成してバイナリーストリームを流し込み再生する。
0167デフォルトの名無しさん2007/03/05(月) 16:57:04
フィルタグラフの勉強からやり直して来い
0168名無しさん@お腹いっぱい。2007/03/05(月) 17:58:55
では普通のファイルを再生する奴を作って
そこから何かを得られる事に期待します・・・
ありがとうございました。
0169デフォルトの名無しさん2007/03/05(月) 21:09:41
こいつは何で拡張子に囚われてるんだ?春休みだからか。。。
0170デフォルトの名無しさん2007/03/05(月) 21:21:07
初心者相手に嫌みか
0171名無しさん@お腹いっぱい。2007/03/05(月) 21:37:41
>>169
どんな形式のファイルを渡しても
勝手に解釈して読み込んで表示してくれる便利な関数があったら
ぜひ使いたいので教えてください。お願いします。
0172デフォルトの名無しさん2007/03/05(月) 22:53:22
つ [チャンクヘッダ]
全部とはいかんがな。
01731552007/03/06(火) 11:26:03
昨日から引き続き恐縮ですが、やはり「メモリ上のデータ」を渡す方法が分かりませんでした。
普通に「ディスク上の.aviファイル」を再生するのは
フィルタグラフを作るまでもなくRenderFileで簡単にできました。
しかし今回は暗号化されたファイルを復号化して再生することが目的です。
なので次にttp://www.firefly-vj.net/dshow/graph/make.html
を参考にしつつ自前でフィルタグラフを構築して再生してみようと思ったんですけど、
結局ここでもAddSourceFilterの部分で「ファイルからロード」してるので
「復号化したメモリ上のデータ」からフィルタを作る方法が分かりませんでした。

>バイナリーストリームを流し込み再生する。
ここ↑がどうすればよいのか分かりません。
どなたか教えてください。お願いします。
0174デフォルトの名無しさん2007/03/06(火) 12:02:59
>適切なソースフィルターを 作 成 してバイナリーストリームを流し込み再生する。
0175デフォルトの名無しさん2007/03/06(火) 12:06:15
暗号化したaviを復号するソースフィルタを作ればいいんじゃね?
01761552007/03/06(火) 12:19:39
えー!!そこから!!!???
そういうことですか・・・
果てしなくめんどくさそうですねこれは・・・
勉強します。ありがとうございました。
0177デフォルトの名無しさん2007/03/06(火) 13:09:05
ReadFileでもフックするか?www
そっちも面倒そうだけどな。
01781552007/03/06(火) 13:12:42
なんかもう既に手におえなそうな雰囲気なんで挫折気味なんですけど、
「暗号ファイル→復号→DS」以外の方法はないものですか。
0179デフォルトの名無しさん2007/03/06(火) 13:15:23
暗号化しない。
0180デフォルトの名無しさん2007/03/06(火) 13:17:03
復号化して一時ファイル作ってそれを読み込む。
0181デフォルトの名無しさん2007/03/06(火) 13:17:41
1. とりあえずファイルの先頭4バイトだけ弄くっておく。
2. 再生直前になったら先頭4バイトを元に戻す
3. DirectShow で再生する。
4. 終わったらまた4バイトを弄くっておく。
01821552007/03/06(火) 13:25:37
>>179-181
この辺が身の丈にあってるというかスキル的に妥当な線かもしれません。
試してみます。ありがとうございました!!
0183デフォルトの名無しさん2007/03/06(火) 13:31:09
>>182
memfile.cpp
01841552007/03/06(火) 14:37:16
>>183
サンプル発見。これなら頑張れば分かるかもしれません。
ありがとうございます!
0185デフォルトの名無しさん2007/03/06(火) 15:00:56
>>181
異常終了したときにavi丸出しになり、
次から再生できなくなるという罠か。
0186デフォルトの名無しさん2007/03/06(火) 15:09:23
DirectShowなんて使わないという選択肢もある。
0187デフォルトの名無しさん2007/03/06(火) 23:38:32
答えが出たな。。。
01881552007/03/07(水) 05:22:23
参考までに、DS使わなかったら何を使えばいいですか。
メモリ上のバイナリデータをDSより簡単に再生する方法がありますか。
0189デフォルトの名無しさん2007/03/07(水) 07:14:03
video for windows
0190デフォルトの名無しさん2007/03/08(木) 18:04:27
SetStreamSource()の第4引数でデータサイズをしてすると思うのですが
ここで指定するデータサイズの上限ってあるのでしょうか?
構造体
D3DXVECTOR4を16個メンバとして持っている構造体のデータサイズ(sizeofで)を指定すると
stream stride is too big. Check device caps.
SetStreamSource failed.
とエラーが出ます。
御願いします。
0191デフォルトの名無しさん2007/03/08(木) 18:42:59
>>190
ビデオカードによって頂点数・インデックス数に制限がある。
GetDeviceCapsでMaxVertexIndexとかMaxPrimitiveCountとかみるか、
(SDKDir)\Samples\C++\Direct3D\ConfigSystemにある
CardCaps.xlsってのを見るといろいろ書いてある。
01921902007/03/08(木) 18:46:00
>>191 って、書いたけど1個の頂点のサイズのことかな。
それだとMaxStreamStrideだね。 でもそんなのなったことないから
解決するかどうかは知らん。
0193デフォルトの名無しさん2007/03/08(木) 18:46:37
↑
名前190ってしたけど間違い191ね。
01941902007/03/08(木) 19:00:11
>>191-193
CardCaps.xlsの私の使っているグラボを見るとMaxStreamStrideが255となってました。
D3DXVECTOR4 15個はOKなんのに16は駄目な理由が分かりました。
有り難うございますm(_ _)m

さて、どうしたらしいものか・・・
0195デフォルトの名無しさん2007/03/08(木) 19:21:14
>>194
255は無いだろ、常識的に考えて・・
と思ったけど、俺のカードは508だった
うざいなD3DCAPSは
0196デフォルトの名無しさん2007/03/08(木) 23:27:46
しかもCardCaps.xls内のグラボは頂点1つにつき最高16データしか送れないみたいだな・・・
4バイト4要素が指定できる最大サイズの型だから
16*16=256でMaxStreamStride256よりでかくても意味なくね?
0197デフォルトの名無しさん2007/03/08(木) 23:46:08
>>178
DirectShowにあるAsyncというソースフィルタのサンプルで
AVIファイルを開いて再生って出来る?
出来るならAsyncを改造するだけで出来そうだね。
ちょっとデータの一部をXORしたりして
再生できないようにするだけで目的は達成できそうだし。

独自のI/FでXORする値を指定するようにすれば
専用アプリなしのグラフエディットで再生させることも出来なくできるし。

ソースフィルタとスプリッタが一体なやつだと
この手は使えないかもしれないが
AVIはできたような気がする。

出来なかったらごめんね。
0198デフォルトの名無しさん2007/03/09(金) 00:21:26
>>196
ん?最高16ってMaxStream?
それはストリーム16本ってことだと思うけど。
1本のストリームに何頂点おくれるかは、
MaxPrimitiveCountとかIndexedならMaxVertexIndexの方だと思うけど。
0199デフォルトの名無しさん2007/03/13(火) 19:16:55
HLSLの頂点シェーダに頂点情報を引数として渡すのにSetVertexDeclarationは必要ですか?
頂点座標とかを直打ちした板ポリみたいなのに適用するときはないとダメっぽかったんですけど、
Xファイルに頂点シェーダを適用するときはやらなくてもちゃんと動いたので、
必要なときと必要でないときの違いはあまりわかりません。
Xファイルだけ特殊ってことなんでしょうか?
0200デフォルトの名無しさん2007/03/13(火) 20:46:30
>>199
必要
まあ本当なら、不要な情報なんだけれど
D3Dがよこせと言っているんだから仕方ない。

>>Xファイル
これが何を指しているかは不明だが
D3DXのヘルパオブジェのことなら
あれは内部的に呼び出してる。

0201デフォルトの名無しさん2007/03/14(水) 11:28:14
メイプルストーリーってDX9で作ってるんですか?
どう見ても2Dなんですけど
0202デフォルトの名無しさん2007/03/14(水) 11:41:36
>>201
2DだとDirectX使っちゃダメみたいな言い方だな。
何で作ってるかなんて知らないけど。
0203デフォルトの名無しさん2007/03/14(水) 11:52:27
>>201
なんでDX9で2Dゲーム作ったらダメなの?
DX10かもよwwww
0204デフォルトの名無しさん2007/03/14(水) 11:55:37
DirectDraw使ったらだめですか
DirectSoundもDirectInputもだめですか>>201
0205デフォルトの名無しさん2007/03/14(水) 19:34:58
頂点を作成するための関数IDirect3DDevice9::CreateVertexBuffer
の利用法を指定する引数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:48
>>205
D3DUSAGEの項みろよ
0207デフォルトの名無しさん2007/03/14(水) 20:54:59
>>202-204
いちいち釣られるな
0208デフォルトの名無しさん2007/03/14(水) 21:57:58
>>206
D3DUSAGE定数の意味を聞いてるわけじゃないんですよ

[注意]の部分の説明は、
CreateDevice関数の引数で D3DCREATE_HARDWARE_VERTEXPROCESSING
を使ったら、CreateVertexBufferのUsageの引数に「0」を使う必要があると
書いてある。

この言い分だと、「0」以外の定数は使えないということになるけど、
実際は、サンプルとかでは「0」以外の定数をUsageに指定しています。
これはおかしくはありませんか?
[注意]が間違っているのか、サンプルが間違っているのか
どちらでしょう?

と言うことを質問しにきたんです。
0209デフォルトの名無しさん2007/03/14(水) 23:11:29
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/graphics/reference/d3d/interfaces/idirect3ddevice9/createvertexbuffer.asp
> ただし、使用法が必要な場合は、1 つまたは複数の D3DUSAGE 定数の組み合わせを使用する
0210デフォルトの名無しさん2007/03/14(水) 23:22:17
>>208
それは、exciteでの翻訳なので当てになりません。
0211デフォルトの名無しさん2007/03/15(木) 03:12:24
セカンドライフみたいに3Dの上にブラウザを重ねて表示させるのってどうやってるんですか?
0212デフォルトの名無しさん2007/03/15(木) 03:28:12
ブラウザ表示させればおk
0213デフォルトの名無しさん2007/03/15(木) 03:35:49
>>212
サンプルかなにかどっかにないもんでしょうか?
0214デフォルトの名無しさん2007/03/15(木) 23:47:50
DirextXの初期化などのソースコードは皆さんはどうしていますか?
何箇所かサイトを巡ったところ細かいところで違うような気がしたのですが
初期化などはその都度必要な事だけを書いているのでしょうか?
または、MSのほうで初期化ライブラリなどがあるのでしょうか?
0215デフォルトの名無しさん2007/03/16(金) 00:00:59
必用なことを書かないでどうする?
0216デフォルトの名無しさん2007/03/16(金) 00:23:55
初期化なんて一本アプリを作るうちの0.001%くらいのもんだろう。
くだらんこと悩まずにさっさと書いちまえ。
0217デフォルトの名無しさん2007/03/16(金) 00:27:18
初期化は大切だろ…
自分の環境だけで動かすんだったら0.001%かもしれんが
0218デフォルトの名無しさん2007/03/16(金) 01:12:01
初期化を既存のコードで代用しようとするな!ぼげぇ!
0219デフォルトの名無しさん2007/03/16(金) 03:05:19
>>217
いやいや、自分が満足できる初期化コードを1回書いたら
後から何かすることなんてそう頻繁にはないってことだろ
0220デフォルトの名無しさん2007/03/16(金) 05:04:13
毎回シコシコ書きなおしてるかと。
以前のを代用できるところは代用するよな。
ゲームなら、UIとかも代用できる
ウェイ!
0221デフォルトの名無しさん2007/03/18(日) 01:11:40
HLSLで
たとえばalphablend=trueが記述されていて、ほとんどはそれを用いるけれど稀にfalseにしたいとか
lightingのon/offの違うのを見たいとか
いちいち別バージョンを作らなくてはならないんでしょうか。
組み合わせが爆発しないんでしょうか?
0222デフォルトの名無しさん2007/03/18(日) 01:57:59
int g_fillMode = 2; // D3DFILL_WIREFRAME

technique T { pass P { fillMode = g_fillMode;}}
------------------------------------------
pEffect->SetInt( "g_fillMode", D3DFILL_SOLID);
0223デフォルトの名無しさん2007/03/18(日) 02:43:25
こことここ↓
http://pc11.2ch.net/test/read.cgi/tech/1173535400/
ってどうちがうんだ?

あ、向こうは超初心者か。。
0224デフォルトの名無しさん2007/03/20(火) 02:40:56
2Dの描画部分で自分のPCでは、ちゃんと表示されるのですが、
ほかのひとPCでは、Clear()部分しか表示されません。

2D表示方法は板ポリゴンに、テクスチャをはっています。
SetTexture,SetFVF,DrawPrimitiveUPは成功しています。
開発環境はWinXPSP2 VC++2005とDirectX2006decです。
0225デフォルトの名無しさん2007/03/20(火) 03:03:55
>>224
ライティングをOFFにしてないとか?
02262242007/03/20(火) 03:12:45
ライティングOFFにしましたが、やはり表示されませんでした。
02272242007/03/20(火) 14:00:28
解決しました。
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat= D3DFMT_D16;

上のコードを削除すればすべての環境で動くようになりました。
参考までに自分のビデオカードは、RADEON X700です。
ClearではZバッファを使用していないので、不具合が生じたと思います
0228デフォルトの名無しさん2007/03/20(火) 14:21:39
>ClearではZバッファを使用していないので、不具合が生じたと思います

なんていうか EnableAutoDepthStencil = TRUE なら
Zバッファはちゃんとクリアしないといけないでしょ。
0229デフォルトの名無しさん2007/03/20(火) 17:04:55
すいません、テクスチャオブジェクトを描画クラスのデストラクタ内で
開放するように記述すると、プログラム終了時にVC++が
デバッグ欄にメモリエラー報告しまくるんですが、
テクスチャの開放のタイミングはいつが適切なんでしょうか?
教えてください。

開発環境はVC++2005pro、DirectX9です。

D3DXCreateTexture()関数呼び出し直後や描画毎などに
開放した場合、メモリエラーは発生しません。
0230デフォルトの名無しさん2007/03/20(火) 17:08:01
D3Dデバイス解放より前
0231デフォルトの名無しさん2007/03/20(火) 17:08:12
また、デストラクタ内では頂点バッファの開放も
行っていますが、こちらは問題なしです。
02322292007/03/20(火) 18:07:32
解決しました。
ありがとうございます。
0233デフォルトの名無しさん2007/03/28(水) 17:06:28
Direct3D(DirectX9.0)について質問です。
テクスチャーを2600*2600などという大きいものにしたところ、どうやらビデオカードの限界だったらしく2048*2048に大きさが丸め込まれてしまいました。

それは構わないのですが、丸めこむときの挙動が
「はみでた部分を削除」なようなのです。
これは仕様に基づいた動作(他のビデオカードで丸め込まれた時も同じ挙動をする)なのでしょうか?

なんとなくイメージで「テクスチャーサイズ限界を超えた場合、限界サイズに収まるように勝手に画像が勝手に縮小される」のではないかと思っていたのですが…。(このイメージに根拠は無いです)
0234デフォルトの名無しさん2007/03/28(水) 17:19:27
>>233
テクスチャを2は累乗で表される幅と高さにしないとダメ
4096*4096でテクスチャを用意し、
2600*2600の部分だけ表示させればよい。
0235デフォルトの名無しさん2007/03/28(水) 17:25:25
>>234
お返事ありがとうございます。
確かに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
4096*4096に対応しているカードは知らないな
普通に考えてそんなにいらないしな
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:16
基本やね
0239デフォルトの名無しさん2007/03/28(水) 20:19:23
>>237
それはD3DXのヘルパ関数の挙動だろ、D3Dやボードの挙動じゃない。
また2のn乗の制限や最大解像度は、全てCAPSから得られるので
そっちを根拠とすべき。
0240デフォルトの名無しさん2007/04/03(火) 21:12:27
質問。
D3DXCreateTextureFromFileExで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
>>240
どうでもいいが、SetSamplerStateで使うのはD3DX_FILTER_LINEARじゃなくてD3DTEXF_LINEARな
0242デフォルトの名無しさん2007/04/03(火) 23:34:34
>>240
D3DXCreateTextureFromFileEx のフィルタってFilterとMipFilterの2つあって、
Filter は 画像->テクスチャでサイズが違う時とかに掛けるフィルタだから
同サイズならNONEでもいけるかもしれないけど、
MipFilter は NONEだとまともなミップマップにならないわね。
0243デフォルトの名無しさん2007/04/04(水) 04:00:30
App.pDirect3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, App.hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dparamet,&App.pDevice );
App.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のバージョンを下げるなら、どのバージョンが適してるでしょうか
02442432007/04/04(水) 04:05:09
CreateDeviceの後ろから2つ目の引数が違ってますが、同じにしても同様でした
0245デフォルトの名無しさん2007/04/04(水) 11:22:43
>>243
関係ないと思うけど
×"MS Pゴシック"
○"MS Pゴシック"ね
0246デフォルトの名無しさん2007/04/08(日) 22:32:30
スプライトの反転表示ってどうやるんですか?
0247デフォルトの名無しさん2007/04/08(日) 23:18:40
反転といっても、
△→▽
□→■
色々あるんだがな。
しかもスプライトという用語自体がいったい何を指すのか不明だし。
0248デフォルトの名無しさん2007/04/08(日) 23:28:08
ヨ→E
みたいな反転。

0249デフォルトの名無しさん2007/04/08(日) 23:50:55
反転はメインヒロインが非処女と判明したときの演出に使います
0250デフォルトの名無しさん2007/04/08(日) 23:58:05
>>248
UVの開始と終了の値を逆にする
0251デフォルトの名無しさん2007/04/09(月) 00:00:46
ヨ→Eだけだと
ヨ→m→Eなのか
ヨ→ | →Eなのかわからん
0252デフォルトの名無しさん2007/04/09(月) 00:30:18
>>251
それを知って何か意味があるの?
■ このスレッドは過去ログ倉庫に格納されています