【C++】 DirectX初心者質問スレ Part16 【C】
※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
【C++】 DirectX初心者質問スレ Part15 【C】
http://pc11.2ch.net/test/read.cgi/tech/1196150200/
ゲーム製作技術板のDirectXスレくらいは足してもいいかと思ったんだけど 過去になんか揉め事があったんだっけ? まぁいいや。
>>1 そもそもお前よく考えろよ
そんなんで時間って短縮できるの?マジで?
だってさぁ、プレイヤーの入力を受け付けるから次の画面が決定する場合のが多いじゃん?
↑↓→←な
で、時間短縮ってさぁ、プレイヤーの入力は一定タイミングでくるし
入力を受け付けるまで次の画面って描画する意味ないじゃん
ていうか内部の処理が決定しなくね?
キューイングなんてどれだけ意味があるのかさっぱりわからないんだけど?
画面更新が仮に1sごとにくるなら1s以内で処理を終えても
次のフレームの処理なんてやってもたかが知れてると思うんだけど?
ていうか安定しなくね?そんな設計にしちゃそもそも駄目じゃね?
1フレ内での時間短縮は意味があるかもしれないけど
フレーム間同士の時間短縮ってなんかやる意味あんの?
全スレをこのネタで終わらせたしな
前スレ
っというか、そろそろおもしろがった他人がしてるとしか思えない。
何年の何月のSDKにならDirectMusicのインクルードファイルとか入ってますか?(´;ω;`)
とりあえずDirectInputも廃止するのはやめて欲しいなぁ というかXInputがダメすぐる
August 2007なら入ってんじゃね?
DirectX関連は事実上使われもしない機能が1/3くらいはあるので 毎回根本設計から作り直さないとゴミばかり抱え込むことになる。 世間でプロジェクトがデスマーチ進行に陥るとき、 それを推進する最も有力な力が互換性至上主義である。
今ならDX9未満か
MSは互換性至上主義でここまで来た会社なので難しいと思います先生 互換性を捨てるならくえりーいんたーふぇーすの存在意義がないです
>>13 そんな物には手を出さない方がいいです
1ヶ月ぐらい無駄にして結局DirectSoundに落ち着いた俺が言うんだから間違いない
DirectXの勉強をしようとXPx64にSDKインストールしたんですが ライブラリ ファイルの検索先パスって C:\Program Files (x86)\Microsoft DirectX SDK (November 2007)\Lib\x86 か C:\Program Files (x86)\Microsoft DirectX SDK (November 2007)\Lib\x64 のどっちの方がいいんでしょうか? どちらでもコンパイル成功してちゃんと動くんですが、x64の方は64bitOS用に コンパイルされて32bitOSでは動かなかったりしますか?
32ビットに未練があるなら大人しくx86使ってろ
>>21-22 ありがとうございます。そういうことなのね
x86の方をリンクするようにします
DirectX SDK (November 2007)にはMayaのxファイルエクスポートするプラグイン のソースついてないの?
25 :
デフォルトの名無しさん :2008/02/11(月) 13:26:30
クラスのstatic関数でD3DXCreateTextureFromFileExを呼び出すと、 E_OUTOFMEMORYが出て、高頻度でテクスチャーの作成に失敗します。 しかし、成功するときも結構あったり、 直前にウェイトを入れると失敗しなかったりと、 原因がよく分かりません。 原因に予測がつけば、教えてもらえませんでしょうか。
なんでこういう奴って自分の書いたコードを晒さないんだろうな。 出し惜しみするほどのもんでもあるまいし。 普通にやってれば動くものなんだから、ただ動きませんとか言われても エスパーじゃない限り回答不能だよ。
27 :
25 :2008/02/11(月) 14:58:28
コードが分散してて、どこを晒せばいいのか分からないんですが、 D3DXCreateTextureFromFileExの呼び出しはこんな感じです。 D3DXCreateTextureFromFileEx(_pDevice, path, _width, _height, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT, 0xff00ff00, NULL, NULL, &_pTexture);
28 :
25 :2008/02/11(月) 15:15:12
過去スレに同じ症状が出てたんですが、 CreateDeviceのBehaviorFlagsに、 D3DCREATE_MULTITHREADEDを入れたら失敗しなくなりました。 しかし原因は分からず、ホントにこれでいいのかも不明です。
アップローダに上げるなりして全部晒せよ。 全部見られるのが嫌なら、問題が発生する最小の状態にすればいい。
>>15 アリアリアリーガトーサン!!(礼を申し上げる!)
>>19 何でですか?MIDIはダメですか・・・?
>>30 MIDIを扱うならDirectMusicでいいと思う
waveを扱うなら俺もDirectSoundの方がいいと思う
32 :
デフォルトの名無しさん :2008/02/11(月) 23:11:27
失礼します メタセコイアでモデリング⇒RokDeBone2でモーション作成⇒DirectXを使ったソフトでモーションを操作しようとしています。 現在、モデリングは完了し、とりあえずボーンだけ入れてモーションつける手前なのですが、 この後、上記の事をさせたい場合はどのようにすればいいのでしょうか? モーション付きxファイルのモーションを操作する方法が分かっていない為、 こちらに書き込んだのですがスレ違いでしたらよければ誘導お願いします。
DirectMusicは、ちょっとBGMを鳴らす程度ならDirectSoundより楽かも知れないけど WAVを複数音鳴らそうとすると鳴らなかったり音が割れたり酷い事になってたな。 色々サイトまわって、何度見直してもサウンドの確保や解放手順は 同様の事をやっているはずだったのに、どうにも上手く行かない。 まあ本当は俺のプログラムの組み方が何か悪かったのかもしれないけど、 参考になるサイトもまともな質問の回答もなく、どうしようもなくなって DirectSoundに移行したら同じことが苦もなく簡単にできた。 本当に時間の無駄だった。 いや、簡単に思えるものには落とし穴があるという勉強にはなったな。
もう今更midiのまま再生させることもねーしなぁ。 BGM用途ならoggに固めてDirectSoundで再生させちゃうし、 midi編集用途ならmidi***系APIの方を使っちゃうし。
35 :
デフォルトの名無しさん :2008/02/12(火) 00:04:42
ちょっと別件の質問です。 とあるサンプルを開こうとすると、d3d8.hが見つからずエラーが出てしまいます。 あれ?と思い、インストールしてあるフォルダを直で検索してみましたが見つからず。 directc9.0になってからこのファイルは削除してしまったのでしょうか?
コンピュータ全体を検索して見つからなかったら、 別のSDKいれな。
38 :
デフォルトの名無しさん :2008/02/12(火) 01:33:32
すいません、
>>35 は解決しました。
とりあえずd3d8 = d3d9、d3dx8 = d3dx9 と読み込むファイル切り替えて、
ソースコード側でも8から9へ書き換えるという無理やりな方法でなんとかなりました。
>>34 すいません。oggに固めるってのはどのソフト使ってるのか教えてもらえませんか?
あとmidi***系のAPIってのはどちら様でしょう・・・?
一方俺は簡易ソフト音源を作ってMIDIファイルを自前で鳴らせるようにした 修羅の道だがなー
43 :
デフォルトの名無しさん :2008/02/12(火) 14:15:40
DirectXというか作法に近い質問かもしれませんが、 LPDIRECT3DDEVICE9は、 グローバルで持っていいものなのでしょうか? それとも、描画する関数に引数として持たせるべきでしょうか? void 描画管理(pDevice) { ... 描画(pDevice) ... }
んなもん好きにしろよ
描画クラスのメンバとして持たせるのが一般的です
>>41 ありがとうございます。Win32の方でしたか。ちょっと使うぐらいなら断然こっちでしょうね・・・。
>>42 ソフト音源って、まさか自前のWAVEをMIDIデータにあわせて鳴らしてるんですか?
踏み込みたくねーー!すごいよ
47 :
42 :2008/02/12(火) 18:52:34
実はそんなにすごく無かったり・・・修羅の道ってほどでもないわ DirectSoundで効果音を鳴らすくらいは誰でもやるっしょ? そしたら次に、任意の音程を付けられるようにする それを任意のタイミングで鳴らしたり止められるように管理する あとは音の仕上がりをどこまでこだわるか次第 こだわらなければ意外と簡単なのよね でもoggとかで鳴らしちゃったほうが圧倒的に楽w
MPTRACKとか言うソフト使ったらmidiをmp3に変換できたんで、やっぱり DirectSoundになりそうです。家のPCでmidi再生すると分解能が低いのか テンポが躓くような感じだったので、これも解決しそうです。
D3DXのベクトル関係の関数を使い続ける人と別に用意する人とどちらが多いのでしょうか
50 :
デフォルトの名無しさん :2008/02/13(水) 22:52:17
3D空間上に、リアルな 「炎」や「ビームのような光」、「爆発」など 特殊な効果のオブジェクトを表示させるにはどうしたら良いのでしょうか? もしかしたら基礎知識なのかもしれませんが、初心者なもので・・。 よろしくお願いします。
パーティクルの事を聞きたいのか?
>>49 俺は別に持ってるよ
なんでかというと、D3DXに依存すると
Win32にも依存することになって、
いらないモノも一緒に入り込むのがイヤだからだ。
BOOLとかDWORDとか名前空間なしのブツとか。
なんだ自己満足か
俺は普段プログラムする時は大抵INT,FLOATなど全てVC依存で書いてるよ
DirectX使ってる時点で描画レイヤはWin依存を避けられないわけで
D3DXのベクトルや行列の関数、CPUが対応してる拡張があれば使って高速化すると聞いたことがある ただ、それが微妙な精度の差を生んで、CPUが違うとSTGのリプレイなんかがズレたりするとか 自分で確認はしてないが… リプレイ等がいらないなら、D3DXの関数使っといた方が高速化を期待できるんじゃない?
D3DXの行列が速いとか、どこの都市伝説だよ(w
>>57 > D3DXの行列が速いとか、どこの都市伝説だよ(w
OS 依存避けたきゃ普通は OpenGL 使うわな。
60 :
デフォルトの名無しさん :2008/02/14(木) 14:09:40
最大テクスチャサイズの制限を回避する方法を教えてください。 1枚7680x2048の画像を同解像度の専用ディスプレイにスプライト表示させたいのですが、 テスト環境は普通のSVGAディスプレイなため、エラーが出てしまいます。
たくさんの小さなテクスチャに分割してタイル状に貼り合わせる
62 :
デフォルトの名無しさん :2008/02/14(木) 14:18:37
いえそういうチキン技を教えてほしいんじゃなくて、(それぐらい知ってますし) 何か自前で読んでコピーすれば回避できるとか聞いたんです。
自前で3Dエンジンを組む
スプライトなら2Dエンジンでいいか
>>61 その方法でやってみます。
>>64 デジカメで撮った写真を等倍で表示するビューア作ってるんですが、
最近の10Mピクセル超えの場合、ぱらぱらやった時に表示が遅すぎて
DirectXを使ってみようと思った次第です。
が、何分素人なもので右も左もわからない状態で、エラーでまくり
色々制限があるという事が判明し困っていた次第です。
対応するテクスチャサイズは環境によっても違うからな。 まあ1024×1024ぐらいならどの環境でも使えると思うから それで小分けタイルでいいんじゃねーの?
>>65 DirectXを使ったからって魔法のように速くなったりはしないよ。
その程度で遅いってのは単純に組み方が悪いだけ。
「ぱらぱら」の意味が分からんが、スライドショー的なことを言っているなら
DirectXを使う意味が全くない。
カード性能がよければDirectX使う方がまあ早いだろう。
>>67 いや、あるだろ。
グラボ積んでるなら、システムメモリーからVRAMよりも、VRAM間の方が断然早いわけで、
先にVRAMへ画像を読み込んでおけば、大きな画像ほどVRAM間の方が早く表示されるはず。
例えば、hamanaなんかはDirectX使って表示するビューアだったはず。
まあ別にDirectXじゃなきゃVRAM扱えないわけじゃないけどな
71 :
デフォルトの名無しさん :2008/02/14(木) 15:23:16
メッシュは表示されるが割り当ててあるはずのテクスチャが 表示されない場合、まずどの辺から疑ってかかるべきですか? SUCCEEDED( D3DXCreateTextureFromFileEx(...) )が通ってる (=画像を読んではいる)ところまでは確認できてます。
>>71 とりあえず固定機能パイプラインなのか
頂点・ピクセルシェーダーなのかくらい書こう
それすら関係ないところだと
頂点情報の中にテクスチャ座標がきちんと格納されてるかとか
>>70 と言うからにはもちろん使えるんでしょうな?(・∀・)ニヤニヤ
74 :
デフォルトの名無しさん :2008/02/14(木) 16:01:42
>>72 固定機能かシェーダーなのかわかりませんがDirectX 9についてるサンプルプログラムです
全部テクスチャが表示されないんです
画像を読んでるところも問題ないですしセットしてるところも通ってました
一応パソはこれです Pentium3-1G 512MバイトRAM 8GバイトHD Milenium-2M SB Windows XP SP2
75 :
デフォルトの名無しさん :2008/02/14(木) 16:06:34
> D3DXの行列が速いとか、どこの都市伝説だよ(w 一応、D3DXの場合、ランタイムでSSEとかが利用可能かチェックして、使えれば使ってるみたいだし、かなりの最適化はされているはず。 自分で普通にC++で書いたコードよりは速いんじゃない。
76 :
71 :2008/02/14(木) 16:14:15
>>74 勝手に便乗すんなw
>>72 固定機能かシェーダーなのかはわからないですが
下記URLサンプルのCMapModelクラスを移植しておかしくなりました。
ttp://www.cmagazine.jp/books/3drpg/ 元のサンプルは正常に表示されるのでどこかで移植ミスやったか、あるいは本家SDKの
チュートリアル頼りに組んだDirect3Dの初期化処理周りがおかしいかとか考えていたのですが
(最初はメッシュも表示されなかったがClearでZバッファ消してなかった)
77 :
71 :2008/02/14(木) 16:47:12
ちょっと試行錯誤してて気づいた点があったので補足。 ・移植元と問題ので同じメッシュを作りD3DXSaveMeshToX()で Xファイルを吐きださせたところMeshNormalsの値が違う 移植元は0.000000;1.000000;0.000000;が延々と続くが 問題の方は0.250000;0.500000;0.000000;<br>0.500000;0.500000;0.000000;と 2行ごとに0.25ずつ増えていき24で0に戻るループになっている。 ・メッシュの壁と床に別々のテクスチャを張り付けているが、テクスチャファイルを 入れ替えたところ、表示されているメッシュの色が入れ替わった。 (片方が微妙に黄ばんでいる。ちなみにテクスチャは両方ともモノクロ) つまり ・テクスチャを読めてはいる。かつ反映・表示もされている。 ・反映のされ方がおかしいか、初期化の仕方がおかしいかで ちゃんとテクスチャの模様が表示されるところがツルッツルになっている ・しかしどこがおかしいのかまでは突き止められていない。
とりあえず1ポリで試してみろ
>>70 明示的にVRAMに確保できるわけじゃないし、Vistaだとシステムメモリに
確保されてしまうけどね。
等倍表示程度では、DirectXを使う意味は全く無い。
スライドショーなら、ユーザの入力を待たずに次の画像を読み込んでおくとかの
工夫の方が遥かに大事。
>>77 テクスチャ座標が設定されてないだけかと。
80 :
71 :2008/02/14(木) 18:20:01
ありがとうございます。解決できました。 構造体D3DVERTEXの定義がおかしかったのが原因でした。
ワロス
質問者なりすまししてフザけてるバカでトンマな能無しが居るので質問者はトリップでもつけれ。
OpenGLのNVidia拡張を使うのは機種依存のうちに入るの?
DicrectSound を使うための サンプルコードなのですが //聞き手の位置の設定 //(x,y,z) ... 3D空間上の座標 void CWaveControl::SetListenerPos(double x,double y,double z) { if(lpDS3DListener!=NULL) lpDS3DListener->SetPosition(D3DVAL(x),D3DVAL(y),D3DVAL(z),DS3D_IMMEDIATE); } error C3861: 'D3DVAL': 識別子が見つかりませんでした というエラーがでてしまって 先に進めない状況です どうしたら解決するでしょうか?
85 :
デフォルトの名無しさん :2008/02/15(金) 19:44:56
>>84 D3DVALUEなら知っている。
ただの float。
typedef float D3DVALUE;
ぶっちゃけdoubleってほとんどつかわないよな
3D だと使わないだろうね。 逆に科学計算だと float が役に立たないが。
88 :
デフォルトの名無しさん :2008/02/15(金) 20:02:09
俺はむしろ、3Dゲー制作で 256bit 浮動少数とか使いたい。 特に物理演算。float 市ねといいたい。
みやみやなにやってんの?
>>88 具体的にどんな演算をしていて精度が足りなくなったの?
ミサイルの弾道計算だろ
>>85 確認してみたのですが
D3DVAL で間違いないです
>>93 たぶん参考にしてるものがめちゃくちゃ古いバージョンなんだよ
>>94 参照してるコードですが
>>95 たしかに 参照してるページ自体
古いものでした
別のサンプルを探してきます
ありがとうございました
floatは駄目だけどdoubleではOKです、なんて それはちょっと違うだろ。 自分のソフトが誤差に対応出来てないだけだろ。 double並みのダイナミックレンジが欲しいってなら別だが、 本当に必要なのかあやしいもんだ。 って、俺もこれを克服出来なくて挫折した部類な訳だが。
D3DVALは型じゃなくてD3DVALUE型を生成するマクロだよ。 #define D3DVAL(val) ((float)val)
どっちみちそんなの標準装備のだと他で上手くいかないんじゃないか?
肝心なこと書き忘れたけど、7までのd3d.hにはあるけど 8以降はない>D3DVALマクロ
VC使ってる奴にとってマクロは インテリセンス機能が働かなくなる嫌がらせにしか見えない
単一色で塗りつぶされたテクスチャを作りたいのですが、サイズや色が 変わる仕様です。どうするのが一番簡単でしょうか?
単一色ならテクスチャである必用はありません。
>>103 >単一色ならテクスチャである必用はありません。
いえディフューズとテクスチャでは色が異なりますから、
正確な色を必要とするときはテクスチャである必要がありますよ。
たとえばマテリアルは256階調でしかやれませんが、
テクスチャなら1024階調まで表現できます。
正確な色が出せないのは固定機能ならステートの設定を理解していないか、 シェーダなら書き方がおかしいだけです。 自分の頭が悪い理由を他に求めるのはやめましょう。
>>105 たとえばD3DRGBマクロは256階調になっていますよ。
これ以上の何を理解しろというんでしょうか。
色が変わるのは精度の問題ではなく計算方法が間違っているからです。
確かに単一色ならテクスチャを使う必要はなさそうだな。
シェーダ定数やテクスチャブレンディングファクタで代用出来るだろう。
(
>>104 のようにレンジを考えなければ)
だけど
>>103 の指摘は余計なお世話なんじゃないの?
マテリアルで良いじゃんっちゅー話なんじゃねーの。余計なお世話とも思わんが。 ところで、単一色を「正確に」モニタに表示するのにレンジを気にする意味がわかりません。
110 :
102 :2008/02/16(土) 13:16:27
レス、ありがとうございます。 発想が良くなかったみたいなので元の問題の方を教えてください。 ある色で塗りつぶされた背景に文字列を表示しようと思っています。 背景は動きます。文字列も変化します。 文字の色は黒にする予定ですが、変わるかもしれません。 これを10〜50程度表示します。 どの様にするのが良いでしょうか? マテリアルは今からぐぐってきます。
背景塗りつぶされてるのに 背景が動くとか言ってることに不安を感じる 正しく直せ
>>113 誘導ありがとうございます
そちらの方へ行ってみます
115 :
デフォルトの名無しさん :2008/02/17(日) 21:16:31
すみません質問です。 LPD3DXMESHに入った巨大なメッシュを絵画する時に 「カメラからどの辺の距離まで絵画するのか」を制御するにはどうすればよいですか?
絵画するって面白い言葉だな
普通は描画な
さらに巨大になると壁画とか
小さくなると漫画か。
総合するとこういうことか? D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, FLOAT fovy , FLOAT Aspect , FLOAT manga , FLOAT hekiga );
>>115 メッシュの各頂点のうち、カメラに最も近い点までの距離を
カメラの近平面の距離とすればいいんじゃね?
もしくはバウンディングボリュームでもいい。
122 :
デフォルトの名無しさん :2008/02/18(月) 01:56:45
Far Clipping 以前に、絵画しちゃっている時点でちゃんとレンダリングできているのかどうかが心配。
>>122 「絵画しちゃっている」という言葉を使い続けている時点で日本語ができているのかどうかが心配。
新しく覚えた言葉を使いたい年頃なんだろうねぇ うんうん、分かるよ 俺も幼稚園の頃そうだった
マスタリングDirectXとかいう本買って飛行機のxファイル読み込んで表示して 左右に揺らす。っていうところまで来たんですけど、パラメーターの設定多いわややこしいわ で泣きそうなんですが、ここさえ乗り切ったら後は楽ですか?
>>125 その本は知らんが、正直DirectXの関数は全部そんな感じ
>>123 「絵画しちゃっている」という皮肉に本気で突っ込んでいる時点で本当に日本人か心配。
>>125 その本おれも買ったけど分かりにくくて結局ネットで解説してくれてるサイト見て勉強した
ある程度分かってから見てみたらあぁこうやって書くといいのか、とか分かって
かなりいい本だけど正直一からDirectX勉強する用には向いてないと思う
内容は初歩的なことだけど解説とか少なくてDirectXまったく知らないと分かりにくい
とりあえずDirectXはWinAPIみたいに最初はつらいけどある程度分かってくると
楽になるからGoogle駆使してがんばれ
DirectXは ・引数の指定の複雑さに嫌気がさしてラップクラスを作る ・欲がでてきて、「OpenGLも使える様にすれば汎用的になるんじゃね?」と妄想する ・VectorクラスとMatrixクラスを作って力尽きる ここまで来て初心者です
ラップクラスを作るだけで力つきました
とりあえず絵画して挫折した
似たようなの作っては捨てて後に残るはゴミばかりって感じ
DirectXに限らず、無駄なコードを書くのは初心者
だが、無駄なコードを書いているときが一番楽しい。
勉強には無駄なコード書くのが一番
初心者は黙って絵画してろ
正直一回作っちゃえばあとはそれをコピペしてちょこちょこっと値かえるだけ
まぁ構造的に使いまわせる部分は多そうだよな 実際にはそうそう巧くいかないもんだが
140 :
デフォルトの名無しさん :2008/02/19(火) 12:57:47
セーブファイルを作りたいんですが、文字型配列が上手く書き込めません。 TCHAR a[10]; …略… fprintf(sfp,"%10c",a); …略… ファイルを見ると文字化けしています。
ヒント:マルチバイト文字列
さらに大ヒント:スレ違い
アニメーションメッシュ、スキンメッシュを表示するプログラムはできたのですが、 例えばびっくり箱のような、 両方が含まれているXファイルを表示すると、 アニメーションメッシュのオブジェクト(箱)が変な位置に表示され、 かつアニメーションがされません。 スキンメッシュの方(じゃばらみたいなもの)は正常に表示されます。 1ファイルのアニメーションメッシュ、スキンメッシュ両方を表示する方法を教えてください。
まずはデータがどうなってんのか。
>>144 DXViewerでは正しく表示できているので、
データには問題ないと思ってます。
じゃあDXViewerを参考にすればいいんだな。 解決。
相対座標が間違ってるから変な位置に表示されるんだよ 座標計算を見直せ
148 :
143 :2008/02/20(水) 00:11:19
解決しました。 頂点ブレンディングをオンしたまま アニメーションメッシュの描画をしてました。
149 :
デフォルトの名無しさん :2008/02/20(水) 05:57:14
directXの3dを初めて間もない者です。MFCで作成していてCSplitterWnd を使って二つにウィンドウを分割して、片方には画像、片方には3dモデルを表示したいのですが、どうしてもエラーが起こってしまいます。 メニューから画像を読み込もうとすると終了してしまうのです。directxとそれ以外は混在できないのでしょうか?
できます
ボーンアニメーション再生サンプルって、SDKのどれですかね。
>>149 要点が伝わってない、とりあえず画像を読み込もうとしている関数を教えれ。
それと、一部分にDirectXを使うだけならView Matrixでウィンドウ上の一部を設定するだけでいい。
>>151 一体どこを探したら見つからないんだってくらいに
Sample Browserにそのまんまのモノが。
>>153 まぢですか!?ごめんなさい、そしてありがとうございます。
155 :
デフォルトの名無しさん :2008/02/22(金) 01:25:26
DirectInputができん・・・ パッド数が一個はできたんだけど、二個の場合がイマイチわからん。 LPDIRECTINPUTDEVICE8で作ったデバイスを配列で2個にして、 forで回すだけじゃダメですか?
2個それぞれのパッドを EnumDevicesでちゃんと列挙できてるか?
157 :
155 :2008/02/22(金) 18:11:37
アフォすぎ
159 :
デフォルトの名無しさん :2008/02/22(金) 19:24:52
3Dのワールド空間中にあるキャラクタの座標を、 スクリーン座標として得るにはどうしたらいいですか? キャラクタ座標(3,10,4) → スクリーン座標(370,300) のようにスクリーン上での座標を得たいんですが・・。
D3DXVec3Project
もしかするとDirectX以前の問題かもしれないが・・・
DirectX初期化のデバイスインターフェイスを取得するところで
失敗してしまうのでよければソースコードを見ていただけますか?
(グラフィックボードはGeForce7300GTで作成しています)
DxGraph9.cppのInit()という関数で、とりあえずウインドウモードのみ作成してます。
ttp://www.hsjp.net/upload/src/up12285.zip
DirectX以前の問題だな。 構造体の初期化からやりなおせ。
ありがとうございます 助言いただいたとおりDirectXGrahics関連クラスのコンストラクタCDXGRAPH()で ZeroMemory( this, sizeof(*this) ); を追加すると正常に初期化できました・・・何というミス・・・
>>164 ソースを見てないから何ともいえないけど、thisが指す先をゼロクリアはやめとけ。
仮想関数のテーブルを持ってたら…
thisを初期化してんじゃねー!www
えwwマジですかww数年前に現場で働いてた講師から教わってそれ以来ずっと(ry じゃあ仮想関数はまだ無いですが今後を考えるとZeroMemoryはやめたほうがいいですね… ちょっと方法が思い浮かばないのでグーグル先生に聞いてきます
方法が見つからないwwやっぱ1つ1つ初期化するしかないんですかね? D3DPRESENT_PARAMETERS m_D3DPP; 上のソースはこの構造体の未初期化が原因ですが、これがクラス内で定義されていた場合、 コンストラクタでどう初期化すればいいものか…ZeroMemory…駄目ですよね…w スレ違いで申し訳ないので、最後にヒントだけでもいただけないでしょうか?
>1つ1つ初期化 C++では普通はそうする。 でも配列のような分かりやすいPODはZeroMemoryで一気に ゼロクリアしてもいいと思う。
なるほどそこは状況によって使い分けってことか… 考えても仕方ないので色々と試行錯誤してみます 勉強になりました、ありがとうございます
>勉強になりました、ありがとうございます 全然理解していないと思われる
つーか、ZeroMemoryなんてローカルな関数を教える方がどうかしているだろ。
DirectX 自体がローカルだろw
まさか、いくらなんでも数年前からずっとDirectXを勉強しているわけじゃないだろ。
OpenGLは最新の機能を求め始めたらDirectX以上のカオスだというイメージで怖いんですが
イメージどおりです
ZeroMemoryじゃなくて、memset使おうぜ
DirectXに限らない話なのですが、みなさんは煙の表現をどのようにしているんでしょうか 煙草の煙や、飛行機雲のように細長く伸びる煙を掻きたいのですが、
基本的にテクスチャだろ。リアルタイムレンダリングで粒子の計算とか出来んし。 研究分野ではそういうこともやってるが、時間がかかりすぎるのが難点。
>>177 将来MS様の構造体の初期化方法が変わったらどうすんだ!
・・・ないね・・・ないw
>>180 それだったらZeroMemoryもあやうい
STRUCT obj = {}; this->obj = obj;
>>179 テクスチャを一番初めに考えたんですが、
角度によって濃さが変わって見えるようにするところで詰まっていました
なにか解決策があるんでしょうか
煙をたくさん並べる
ビルボードの仕組みでやってるんだよな? それでも色が変わるならライティングがまずいかカメラに近すぎ。
普通は煙にライトなんてかけないだろ まあ昼夜などの周りの状況に応じて煙の色を変える必要はあるだろうが。 半透明である程度はごまかせる。
煙にもライトをかけないと、立体感が出ないと思う
ビルボードに立体感要求されてもな
スプライトのアルファブレンディングについて質問です。 現在スプライトの点滅処理をしようとしているのですが、 (画像はPNGで背景をPhotoShopの透明部分として出力してあります) スプライト描画時に SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ) と設定してPNG画像自体の透明部分を抜くと アルファ値によるアルファブレンディングができず、 SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ) と設定するとアルファ値によるアルファブレンディングはできるのですが、 PNG画像自体の透明部分が抜けません。 SetTextureStageStateの引数を色々調べて試して、 なんとか問題と思われる部分を上記の2つに絞ってみたのですが、 一向に解決できないので、よければアドバイスお願いします
>>183 Particle Illusion というソフトが参考になる
ビルボードを重ねて煙などのエフェクトを作っている
ビルボードの中心座標を3Dで記憶しておけば
見る角度がかわってもボリューム感があるようになるよ
>>191 その元テクスチャはボリュームパーティクル前提だからそっけないけど
普通は元テクスチャの状態で陰影がつけられるからな
まあどうしてもパーティクルで表現したいんなら使うのもありかもね
煙にZ値入れてやる奴ってなかったっけ? ってまあそんなキモイ煙誰も望んでないならあんま頑張る必要ないと思うけどw ていうか、端折れるところは端折ったらいいと思うよ ユーザはそんなところ見てないから グラに関してはサボれるところはできるだけサボる その代わり全体をよくしようぜ その裁量がないポジにいるときはグラ頑張ったらいいとおもうけど そうでないなら頑張る必要ないよ
>>189 元画像を抜きではなくてアルファ付きイメージで出力すればいいと思うよ
196 :
189 :2008/02/24(日) 07:15:39
>>194 ,195
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)でできました!
アドバイスありがとうございました!
パレットいじるがいいさ
>>197 マスクかけたいとか思ってるかもしれないけどナンセンス。
昔風だとパレット操作
今風だと頂点カラー変更
の予感
ツクールとかの人は、色違いの画像も持ってたり
200は何を言ってるんだろう
単なる重ね合わせのハナシじゃないのかコレ
>>197 マスクとかアルファとかでぐぐれ
DirectX以前にそういう事がわかってないと話にならない
204 :
デフォルトの名無しさん :2008/02/27(水) 04:15:58
HDRレンダリングについて教えてください 1.0を越える光や負の値を浮動小数フォーマットのテクスチャにレンダリングすると思うんですが そのテクスチャを使ってもピクセルシェーダから出力するとき結局0〜1にクランプされて意味ないのでは?と考えてしまっています ブルームとかトーンマッピングというのが関係しているのでしょうか? 具体的にどのようなことができるのかわかっていません 初歩的な質問かもしれませんがよろしくお願いします
>>204 そこまで用語を知ってるなら、HDRとブルームで検索すれば
いくらでも説明あるだろう。
ブルームも大事だが、一番重要なのは環境マッピングかな。
206 :
デフォルトの名無しさん :2008/02/27(水) 14:31:45
ぐぐってもよくわからなかったので質問したのですが とりあえずHDRは諦めます ありがとうございました
207 :
197 :2008/02/27(水) 23:20:30
>>208 ヒント:Nov2007のリリースノート
DirectMusicなんて意味ないよ
211 :
208 :2008/02/28(木) 15:09:18
>>209 ありがとうございます、前バージョンの物を入れたらDirectMusicのモード関しては動かすことが出来ました。
ですが肝心のサンプルプログラムは動かない…
ちなみにそのプログラムはMicrosoft DirectX 9.0 SDK Update (Summer 2003) で書かれているんですが
やはり、他言語のようにDirectXSDKのバージョンが違うとコードによってはエラーになるとかあるんでしょうか?
やっぱりWebでの学習はあきらめて最近の参考書を買って勉強した方がいいのかな、、、
DirectXに他バージョンとの互換性など期待しない方がいい
direct3d mobileのスプライトを使った小規模なサンプルプログラムがある場所を教えてください
画像サイズが2のべき乗になっていない、例えばデジカメの写真などを読み込んで表示したい場合、 どのようにすればよいのでしょうか?
読み込んで描画すればいい。 それ以上でもそれ以下でもない。
つーか、画像サイズが2のべき乗ってどういう意味だ? 画素数が2のべき乗っていうなら判るがサイズなんてmmで測るかptで測るかでも違うじゃないか。
くだらん突っ込みを入れるなよ
CreateDeviceした後にウィンドウサイズを変えると描画内容が伸び縮みして描画できる広さが変わらないんですが、 どうすればウィンドウサイズ変えてウィンドウ外の描画内容見たりできますか?
まずは描画元のサイズをきっちり管理しろ。
描画元??
>>216 一般的に画像サイズと言った場合は普通はピクセル数だよ
そんな事を仕事で言ったら笑われるぞ?
222 :
216 :2008/03/01(土) 18:41:07
そう? 私の仕事では、まず寸法なんだけど。 「半径100μmだから差し渡し200μmの画像なんだけど、 画素サイズ125nmだと画像1枚何msecで処理できる?」 てなもんで。 # まぁ表示は二の次なんで、このスレのお歴々とは違うのだろうけどねw
お前はここが何のスレだと思ってるんだ
DirectXスレで画像サイズと聞いて単位mmだと思うのか。 あほですな。
普通インチだよな
バイトだろ。
>>222 まあ君はこんな所で電波発言してないで、画像処理ソフト関係のスレに行けばいいと思うよ
○umの画像とやらが何ピクセルを指すのかわからなきゃDirectX的に何の意味もないしな
DTP職の奴と話をすると全く不要な場面でもdpi持ち出すから困る
>>218 デバイスを新しいクライアントサイズでResetしろ
原稿サイズ、プリントサイズ→ミリ、インチ 画像サイズ→ドット、ピクセル 普通はこう。 画像サイズと単体で聞いてmmとか言い出すのは電波さん。
232 :
216 :2008/03/01(土) 20:35:05
惜しい。電波じゃなくてレーザー波なんだ。
(・∀・)デテケ!!
>>232 つまんね
ごまかしたい気持ちはわかるが、これ以上恥の上塗りする前に消えた方がいいよ
235 :
216 :2008/03/01(土) 20:50:18
誤魔化すも何も、扱う画像の光源は215nmレーザだったりするから洒落てみたんですがw まぁ、自然光では撮像できない世界を知らない人にはそれさえ理解できないか。
中二にしてはずいぶん専門的な分野を専攻されているようで
ここはDirectXのスレです。。
また何の関係もない自分の脳内世界を語るキチガイがでたか。 スレタイ見直してから出直して来いよ。
自分が一生懸命考えた爆笑モノの駄洒落が、他人には全く受け入れてもらえずに寂しいんだろ もうそっとしといてやれよ
画像を使わずに、線や矩形や円をスプライトに描画するにはどうすればいいですか?
そもそもDirectXにスプライトなど存在しない
243 :
241 :2008/03/01(土) 22:58:39
LPD3DXSPRITEとLPDIRECT3DTEXTURE9で画像を描画してるんですが、 (2Dです。3D描画はやったことないです) 画像を描画するやり方しか分からなくて、 デバッグ用に単純な矩形や円を描画するときも、いちいち矩形や円の画像を用意してます。 プログラムで描画する方法があったら教えてほしいです。
>>243 画像をどうやって表示してるのか知らんけど、Primitive系でよくね?
画像も結構早く描画してくれるし
245 :
241 :2008/03/01(土) 23:30:15
>>244 ありがとうございます。
DirectX始めたばかりで、関数も全然知らないんですが、
DrawPrimitiveとかのことでしょうか。
今やってる描画は簡単に書くと、こんな感じです。
LPDIRECT3DDEVICE9 _pDevice;
LPD3DXSPRITE _pSprite;
LPDIRECT3DTEXTURE9 _pTexture;
_pDevice->BeginScene();
_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
_pSprite->Draw(_pTexture, &_rect, &_start, &pos, _colorEffect);//引数は適当に
_pSprite->End();
_pDevice->EndScene();
_pDevice->Present( NULL, NULL, NULL, NULL );
これ以外の描画方法はまだやったことがありません。
Primitive系というのをやってみます。
初心者なのになんでチュートリアルすらやろうとしないんだ?
247 :
241 :2008/03/01(土) 23:46:44
>>246 SDKに入ってるんでしょうか?やってみます。
初心者用の本を買って、その通りにインストールして設定して、
本の通りに進めてるだけなので、それ以外のことはまだ知らないんです。
あんな動かすのに一苦労するようなバージョンもあってないサンプルはイラネ
待て。アンダースコア始まりに突っ込むのは禁止だ。グローバル変数とは確定していない。
どこの誤爆だ アンスコがどうしたって?
誤爆じゃないっしょ。 ファイルスコープの変数ならアンダーバー+小文字も予約されているけれど、 ローカル変数ならOKっていう、知識を披露するための前振りでしょ。
アンスコ=見せパン(見せてもいいパンツ)=グローバル推奨
逆だろ。そんなもんコート外で見せるなってことでローカルのみ許可なんだよ。
255 :
デフォルトの名無しさん :2008/03/02(日) 18:08:40
MoveToEx(hdc,0, 0,NULL); LineTo(hdc,800, 400); こんな感じで直線引くと最前面に描画されちゃうのですが、 最背面に描画するにはどうやったらいいのでしょう?
最初に線描画すればいいんじゃね?
257 :
255 :2008/03/02(日) 18:34:04
>>256 if( SUCCEEDED( pDevice->BeginScene() ) ){
MoveToEx(hdc,0, 0,NULL);
LineTo(hdc,800, 400);
画像表示させる関数
pDevice->EndScene();
}
かなりはしょったけど、こうやれってことだよね?
やってるんだけど、どうしても最前面に出てしまう。
BeginScene - EndSceneの外で使ってはどうか?
259 :
Visual C++ Runtime Libraryってエラーが出てネットゲーム強制終了 :2008/03/02(日) 19:33:06
そのメッセージは 「エラー終了」 としか言いようがないもので、 何らかのエラーが起きて、そこから復帰できなかったか、 あるいは復帰する必要があるのにそういう風にプログラムを組めていなかったか、 といったところだろう、ということしか言えない。 メモリ不足の可能性もあるけど、何らかのバグの可能性もある。
262 :
255 :2008/03/02(日) 20:05:02
>>258 >BeginScene - EndSceneの外で使ってはどうか?
やってみたが結果変わらず・・・。
HDC hdc;//デバイスコンテキスト
HPEN hPen = NULL;//ペン
hdc = GetDC(hWnd);
hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));//ペンの設定
SelectObject(hdc, hPen);//ペンを反映
MoveToEx(hdc,0, 0,NULL);//描画
LineTo(hdc,800, 400);
手順はこれだけなんだが、他に設定しないといけないのだろうか?
ググっても出ないっす。
263 :
デフォルトの名無しさん :2008/03/02(日) 20:29:40
>>259 ですが開発元は対処してくれないかもしれません。他に方法ありますか?
まず、エラーの出た状況を詳しく。
>開発元は対処してくれないかもしれません なんでだよ どうせあやしい事してるからだろ
そもそも何のゲームやってるかぐらい書けよ。 自分は詳しく書かないくせに丁寧に教えろとか、社会を舐めるなよ小僧。
キャプ見ればそのくらい分かるだろ
厨房のするネトゲなんて知るかよ
そもそもなんでこのスレなんだよ。スレ違いだボケが。
よく判らんがずうずうしい教えて君視ね
>>262 GetDC()って、IDirect3DSurface9::GetDC()じゃないの?
君が取得しているのは、ウインドウのクライアント領域のHDCであって
Direct3Dが描画するのは、D3Dのレンダリングターゲットな訳だから
レンダリングターゲットのHDCじゃなきゃ駄目じゃないのか?
273 :
255 :2008/03/02(日) 23:44:47
>>272 あ〜なるほど。確かにウィンドウのHDCでした。
情報ありがとうございます。
ちょっと調べてきます。
仮にバックバッファにした場合でもGetDCで取得したもんに描画できるのか? いや、でも、フロントバッファには描画できてんだからできんのかな? 俺、もう10年近くDirectX弄ってるけどGetDCと組み合わせてなにやらやったことねぇや マジで
WindowのHDCへ描画とキャッシング Direct3D側の描画 メッセージループから抜けるタイミングでWindowのHDCのキューがフラッシュ
GdiFlushだっけか 普段意識しないな
別のパソコン上でDirectXを使ったプログラムを起動しようとするとD3dx9_24.dllが見つからないというエラーが出ます。 そのパソコンはOSはWindowsXPでDirectX 9.0cが入っていますが、DirectX 9.0cにもいくつか種類があると言うことなのでしょうか?
そうです
>>277 ランタイムライブラリの詰め合わせがMSのサイトのどっかにあるからとってこい
まとめて配布しろよ 馬鹿か?
DLLを同梱しろってことでは ライセンス的に大丈夫かは知らんが
285 :
デフォルトの名無しさん :2008/03/04(火) 21:39:21
ID3DXSprite#Draw(IDirect3DTexture9)で平面を描き、 IDirect3DDevice9#DrawPrimitiveで四面体を描いてるですが、 D3DXMatrixLookAtLH( &matView, &vecEyePt, &vecLookatPt, &vecUpVec ); を使ってどうViewを変えても、四面体がスプライトの奥に見えてしまいます。 vecEyePtのX座標を凄くプラスにしても、凄くマイナスにしても、 Y座標を凄くプラスにしても、凄くマイナスにしても、 四面体がスプライトより奥に見えるのですが、なんででしょうか。
Zの問題だろ
287 :
285 :2008/03/04(火) 22:00:45
Zも同じです。 vecEyePtのZ座標を、プラスマイナス反転しても、 左右反転するだけで、後は変わらず、 四面体がスプライトの裏側にあるように見えてしまいます。 初めて3D描画をしたので、まあ色々と自信はないんですが。。
ディスプレイの表面にマジックで文字を書いて、 顔を近づけたり離したりしても表示されている内容が奥に見えると言っているわけだが、 なんでそんなに頭が悪いの?
>>288 例えが悪い
>>287 モニタを下から覗き込んでもパンツは見えないんだよ。
分かったか?
>>287 spriteとdrawprimitiveは描画されるタイミングが違うぞ
291 :
285 :2008/03/04(火) 22:23:23
言い方が悪かったかもしれませんが、勘違いしてるような。 スプライトは平面だけど、 IDirect3DDevice9#DrawPrimitiveの四面体は立体で、 Z=0平面上にあるわけじゃないです(たぶん)
292 :
デフォルトの名無しさん :2008/03/04(火) 22:30:13
すいません。 本に書いてあるとおり、libファイルを追加しようと 「構成プロパティ」⇒「リンカ」⇒「入力」としたいのですが、 リンカという項目がそもそもありません。 (表示されないのです、C/C++の下には何も無いのです。) これはVC++のインストールの段階での問題でしょうか?? くだらない質問でもうしわけありません。
293 :
285 :2008/03/04(火) 22:38:55
>>290 おお。たぶんそれのような気がします。
位置関係に関わらず、
DrawPrimitiveがSpriteに上書きされてる感じです。
基本2Dのゲームを作りたくて、スプライト描画してたんですが、
エフェクトに3Dを使おうと思ったんです。
スプライトと3Dは同居できないのでしょうか?
>>292 ちょうど参考書に載ってたので。
Visual Studio.NET 2003の場合、メニューより、プロジェクト→プロパティ→リンカ→入力
Visual C++6.0の場合、メニューより、プロジェクト→設定→リンク
294 :
デフォルトの名無しさん :2008/03/04(火) 22:43:06
>>293 ありがとうございます。
ソリューションエクスプローラーからみえる
ファイルのプロパティを右クリックして見ていました。
しかし、本はメニューから選ぶのは書いてなかった・・・。
実は以前はこの本のとおりにやって普通に出たと思うのですが・・・。
なんかちょっと気になるな。
スプライトの座標のZを1にする
296 :
デフォルトの名無しさん :2008/03/04(火) 22:45:09
>>293 すいません。
プロジェクトを右クリックだったのです。
なんて馬鹿なんだ。
忘れないようにメモを書いて保存しておきます・・・。
298 :
デフォルトの名無しさん :2008/03/04(火) 23:16:12
DirectX で点線を描画するには皆さんどうしているのでしょうか? OpenGL で以下にしていることがDirectXでできなくて困っています。 glEnable( GL_LINE_STIPPLE) ; glLineStipple( 1, 0xF0F0 ); ・・・ glDisable( GL_LINE_STIPPLE ); よろしくお願いします。
DirectXでできる細かいことよくわからないからテクスチャ貼っちゃうよ!
300 :
285 :2008/03/05(水) 00:44:05
>>295 スプライトのZ座標を色々動かしましたが変わりません。
>>290 さんの言うとおり、描画タイミングの問題だと思います。
DrawPrimitiveをカメラで撮った画像に、
Sprite平面をカメラで撮った画像を上書きしてる感じです。
>>296 ID3DXLineで似たようなことが出来そうだけどね。
まあ後はShader使うかだな
303 :
285 :2008/03/05(水) 07:59:43
ID3DXSprite::Endもしてます。
Draw、End、DrawPrimitiveという順番で?
305 :
デフォルトの名無しさん :2008/03/05(水) 16:24:21
Zバッファーをオンにしてみたらどう?
そもそもスプライトって常に最前面に描かれる仕様じゃなかったっけ? そういうときはビルボーディングとかやるんじゃなかったかな。
スプライトって何ですか?
寝てる間に仕事を仕上げてくれる小人さん
レモンライムの爽やかなテイスト、強炭酸のシャープでクリアーな喉ごし、純水使用でフルリニューアル。
>>310 描画先がα成分の含まれるフォーマットなら書き込まれる。
312 :
デフォルトの名無しさん :2008/03/05(水) 20:29:16
HLSLの質問ってここでもOKでしょうか? ....\hoge.fx(54): error X4004: program too complex; there are more active values than registers とかいうエラーが出てコンパイルに失敗します。 HLSL上でのスキニングをやろうとしたんですが、 HLSLコード上での変数宣言をなるべく減らしてもダメでした・・・ こういうときってどうやってレジスタ数を節約すればいいのでしょうか?
ボーン数を減らすしかあるまい 頂点シェーダ2.0以上で定数レジスタが256個 4x3行列を使ったとしても使えるのはボーン80本弱か? ローポリなら十分な数だとは思うが それ以上のボーンを扱いたいならCPUで計算だな
314 :
312 :2008/03/05(水) 21:07:16
>>313 ありがとうございます。
が、ボーン数は28しか指定してないです;;
struct BONE_NODE_STATE_LERP {
float4 vec4GlobalPositionAndScaling;
float4 vec4RotationQuaternion;
float4 vec4BoneBaseOffset;
};
こんな構造体の28個の配列を宣言してます。(28はどうしても必要なんで妥協できないですorz)
for文でブレンド数だけループさせてるとこを
for文使わずにブレンド数に2を指定したらエラーは起こらなくなりました。
for文ってあんま良くないのかなぁ・・・
315 :
312 :2008/03/05(水) 21:09:05
意味不明なんで修正 ×ブレンド数に2を指定したら ○ブレンド数2に限定して2つ同じ処理書いたら
316 :
285 :2008/03/05(水) 21:20:15
>>304 Draw、DrawPrimitive、Endという順でやってました。
Draw、End、DrawPrimitiveの順にしたところ、
今度は逆にスプライトがDrawPrimitiveに隠れるようになってしまいました。
スプライトは3Dと同居できないのかもしれません。
参考書に、ポリゴンにテクスチャーを貼り付ける方法が書いてあったので、
スプライトをやめて、そっちで2D画像を描こうかと思います。
>>321 さんの言う、Shaderとはそのことでしょうか。
というかスプライトって実はマイナーなんでしょうか。
>>316 2D処理だけやるならSprite使う方が楽
3Dと同居させたいならスプライトもプリミティブ化した方が便利
まあ、例えば3D画面の上に2Dでフレームやら体力ゲージやら
表示させるだけなら同居も可能だし
318 :
デフォルトの名無しさん :2008/03/05(水) 23:41:02
298 だけど Lineクラスを使うのか? Pattern プロパティが使えそうな気がするのだが、何を設定すれば良いのか? 調査中... 大量の線があるとき、描画速度は大丈夫か?心配事てんこ盛り...
>>318 あんなケッタイなもん覚えるより自分で書いた方が早いって。
既にレスがあるように自分でパターンテクスチャ用意して
頂点のスクリーン座標からUVを算出するだけじゃん。
>>313 モデルを分割すりゃいいような気がするんだけど・・・
ぶち込んだメッシュに必要なボーンの情報があればいいわけで・・・
321 :
デフォルトの名無しさん :2008/03/06(木) 21:57:42
>>319 そうなのか...DirectX はなにせ初めてなもんで...
ありがとう、そっちでやってみる。
322 :
デフォルトの名無しさん :2008/03/06(木) 23:42:03
スレッドにした無限ループで描画しています。 Windowの終了ボタンが押されたときは、 ウィンドウプロシージャ内でループ停止フラグを立てた後、 Sleepして1ループ終わるのを待ってから、 デバイスを解放したいんですが、 ウィンドウプロシージャ内でSleepすると、 描画ループ内の、IDirect3DDevice9::EndScene(); も一緒に止まってしまいます。 なんででしょうか?
>>322 Direct3DDeviceのマルチスレッドに関する注意は読んだ?
何かドキュメントに色々あった気がするけど。
出力されたXファイルを見ていると、たいがいヘッダーの後に Header { 1; 0; 1; } みたいなのが付いているんですが これはいったいなんですか? SDKのドキュメント読んでもXファイルテンプレートの項にはどこにも書いてないですし、 いったいどんなテンプレートで書いてあるのかもよくわかりません、。 消しても問題なく動くので、よけいよくわからないのですが…
そんなの 出力をしているソフトの製作者に聞け
327 :
326 :2008/03/07(金) 21:51:21
書き忘れました、プロジェクトの依存ファイルはd3d9.lib d3dx9.lib winmm.lib、文字セットはunicodeです。
>>326 なんでバージョンまでわかってるのに別バージョン入れるんだ?
何もわからない馬鹿ならまずは環境あわせるぐらいしとけ
sdkのバージョンの違いの可能性が高いけど、 本に付いてるサンプルもすべて実行できないなら環境の問題、 本のほうは動くなら入力したコードとプロジェクト設定を見直す。後MBCSで試してみるとか。 まぁ本が間違ってる可能性もあるけどな。
ちなみにビルド時に出たエラーは何?
Vector2をVector3にキャストしますた
332 :
326 :2008/03/07(金) 22:43:50
>>328 すいません、、この部分まで正常に動作していたので、バージョンは最新のままにしていました。
>>329-330 このコードより前の分は動きました。
MBCSで試してみましたけどダメでした、、、
エラーは↓です。
c:\documents and settings\*****\デスクトップ\my3dlib\my3dlib.cpp(123) : error C2664: 'D3DXCreateTextureFromFileA' : 2 番目の引数を 'LPCTSTR' から 'LPCSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\*****\デスクトップ\my3dlib\my3dlib.cpp(141) : error C2664: 'IDirect3DDevice9::SetTexture' : 2 番目の引数を 'LPDIRECT3DTEXTURE9 *' から 'IDirect3DBaseTexture9 *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
中身が違うものにキャストしてもなw
とりあえず、1番目のエラーに関しては、マルチバイト文字セットを使えと
>>332 D3DXCreateTextureFromFileAの(LPCTSTR)は不要。
その少し上の配列確保のとこで==が=になってる。
SetTextureのとこの&はいらない。
Direct3Dでクリッピングかけるのってどうしたらいいんだ・・・
>>335 うわ、、、動きました。
普通にタイプミスとかホント迷惑かけてすいませんでした、、、
じゃあバージョンアップで(LPCTSTR)のキャストが不要になったと考えて良いんですかね。
クリッピングといっても千差万別なのだが
>>326 その本、とても15歳で理解できるとは思えないようないいかげんな解説なうえ、
リンカの設定とか、やらないとどんなにがんばってもコンパイルの通らないものの説明が一切ない
アマゾンの評価のほうに設定のしかたがのってたと思う
341 :
デフォルトの名無しさん :2008/03/08(土) 15:21:26
フルスクリーン表示をしたいのですが、 クライアント領域の大きさは固定で、ディスプレイの解像度を変更するか、 クライアント領域をディスプレイ全体に広げて、IDirect3DDevice9::SetTransformで拡大描画するか 迷っています。 それぞれの利点・欠点・特徴や、他にいい方法があったら、 教えてもらえませんか。 ちなみに、作っているのはシューティングゲームです。
自分がフルスクリーンにしたい理由が分からないならフルスクリーンにするな。
>>341 前者は環境依存
後者は無駄なフィルレート
簡単なんだから両方試してみるのが一番かと
開発は最後までデバッグしやすいウィンドウモードでする。 それを少しだけ書き換えて、フルスクリーンでも動くようにするのが基本。 まずはそれをやれ。それで物足りなくなったらそのとき考えろ。
346 :
341 :2008/03/08(土) 16:13:25
どうもありがとうございます。
処理が重くなると困るので、解像度変更を使おうと思います。
ところで、フルスクリーン、ウィンドウを切り替えるたびに、
デバイスを破棄して、もう一度CreateDeviceしなければいけないのでしょうか。
>>342 ゲームは大画面の方が派手で良いですよ。
>>346 >デバイスを破棄して、もう一度CreateDeviceしなければいけないのでしょうか。
そうだべ
ノートPCだと省エネモード起動したら復帰できないべ
>ゲームは大画面の方が派手で良いですよ。
低スペックマシンで動かんべ
そこはある程度切り捨てても構わんだろう
>>346 CreateDeviceは必要ない
>>347 はでたらめ
デバイスリセットするだけで問題ないよ
350 :
341 :2008/03/08(土) 16:55:31
>ノートPCだと省エネモード起動したら復帰できないべ この言葉は初めて使いますが、kwsk お願いします。
>>349 デバイスのロストは2とおりある
一つはMANAGEDで復帰できるタイプ
もう一つはデバイスごとロストするタイプ
この両方を別々にサポートするかデバイスがロストするほうにあわせるか?
でたびたび対立が出来てる
デバイスがロストするほうは条件がよくわからない上に
知らない奴もいるので起きる・起きないで喧嘩になることもしょっちゅう
ただ、BBXの書き込みに綺麗にまとめられてる文があったがいまBBXを見に行ってないため
いまも残ってるかはよくわからない
いつの時代の話してんだ
え?いま違うの?w
デバイスごとロストするってのが起こったことないんだけどなんでだろうか
DX10か10.1でその辺解決されるみたいな話があったけど実際どうなんだろ
DirectXのC#版では起こらないようになってるんだよな
ハードかOSの問題なんじゃね? そういえばうちのWin98マシンだとResetがうまくいってないっぽいな まあどうせSetDialogBoxModeとかも正常動作してないからWin98対応は諦めたけど
>>354 動いている最中にnViewのモード切り替えるとかすると
Resetでは戻らなかった気がする。
359 :
341 :2008/03/08(土) 18:52:34
なかなか面倒な問題ですね。 常に描画前に、IDirect3DDevice9::TestCooperativeLevel()をやって、 D3D_OKなら描画、D3DERR_DEVICELOSTなら待機、 D3DERR_DEVICENOTRESETならResetという感じでしょうか。 うちの環境では、 スクリーンセイバー起動や、ディスプレイの設定変更の場合は、 復帰できるロストでした。 nViewはレアっぽいので、デバイスごとロストはとりあえず放置です。 ただ、フルスクリーン時に、Alt+Tabを押すと、 D3DERR_DEVICELOSTになったままResetできる状態にならないのですが、 この場合はもう一度CreateDeviceするしかないのでしょうか。
解像度切り替えとかってデバイスロストしないんだっけ? これで大丈夫だったらビデオカードの切り替えぐらいしかねぇんじゃねぇかな?>デバイスごとロスト オンボード→グラボ、グラボ→オンボードとかやってみるのが一番速いかもね
361 :
デフォルトの名無しさん :2008/03/08(土) 21:14:45
SetRenderTargetでレンダターゲットを替えると ビューポートの設定がロストしてしまうんだが これは仕様ですか?それともバグ?
>>359 >ただ、フルスクリーン時に、Alt+Tabを押すと、
>D3DERR_DEVICELOSTになったままResetできる状態にならないのですが、
>この場合はもう一度CreateDeviceするしかないのでしょうか。
あれ?それでなったっけ?
かなり頻度低かった気がするんだけど?>デバイスごとロスト
363 :
341 :2008/03/08(土) 21:35:25
根本的な部分から色々作り直さないといけないかも。鬱だ。。。 まずはちっちゃなプログラムで、実験してみます。
復帰できるデバイス消失時に、
IDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPresentationParameters)
を行っても、「D3DERR_INVALIDCALL」が返ってしまいます。
以下のことは確認したのですが。
・Resetの引数はデバイス作成時の「D3DPRESENT_PARAMETERS」と同じ(作成は失敗しない)
・TestCooperativeLevel();は「D3DERR_DEVICENOTRESET」を返している
・CreateDeviceしているだけで、リソースは何も作っていない
行き詰まってしまったので、よければ誰かソースを見てもらえませんでしょうか。
http://www.sepia.dti.ne.jp/zigzag/src.zip ※画面の色の設定を変更すると(32ビット→16ビット)復帰できるデバイス消失になります。
デバイスはどうやって消失させたんだ?
っと、これか >※画面の色の設定を変更すると(32ビット→16ビット)復帰できるデバイス消失になります。 画面のプロパティから画面情報を変えた場合のロストを復旧させることは基本的にできないはず。 対応するなら、作成したリソースは全部システムメモリに自前で所持して、 Direct3Dの初期化から全部やり直し。
>>364 ソースは見たが、D3D8なんでコンパイルは通せなかった。
なので確証なし。
デバイスのリセット前には、D3DPOOL_DEFAULTで作成したリソースは
全てリリースしなければならない。それはやってますか?
>>・CreateDeviceしているだけで、リソースは何も作っていない
例えば、InitBg()でIndexBufferを作っているが、これとかは?
>>366 少なくとも俺の環境ではリセットで復旧出来ているよ。
ポストエフェクト用のテンポラリバッファとしてテクスチャを使うケースですが、 今は、これは最初に1回だけ作成して毎フレーム使いまわしていますが 毎フレーム作成・破棄する方にしたいと思っています。 それでテクスチャの作成・破棄って重いでしょうか? 単純にメモリブロックをアロケートするだけなので重くなさそうだと踏んでいるのですが。 ※自分でテストすべきなのでしょうが、計測用のベースが無いのでなかなか難しい・・
>>366 >画面のプロパティから画面情報を変えた場合のロストを復旧させることは基本的にできないはず。
何の問題も無く出来る。
こんな簡単に出来ることを確かめもせず、
「はず」とかテメエの脳内妄想で見当違いな講釈を垂れて何がやりたいの?
>>369 それはドライバ依存だろ?
メモリ破棄されてるのにどう復旧させるんだ?
元になるものが消滅してるんだぞ?
どうせNVIDIAとAMDの最新環境だけテストして終わりなんだろ?
>>370 ロストからデバイスを復旧させるのと、破棄されたメモリを元に戻すのが
ごちゃごちゃになっている時点で、根本的に何も分かっていない。
分かっていないのに口を挟むのはやめた方が良い。
>>370 デバイスがVRAM上で管理しているメモリはReset前に破棄。
デバイス復帰後イメージ自体はプログラマ側の自己責任で元に戻す。
この過程でメモリ内容が消失していても、デバイスを復帰させる場合の障害にはならないよ。
>>371 画面の色かえるとメモリを初期状態にするドライバがあるんだわな
元のデバイスが何だったかすら記録されてない状態で
どうやって復旧させるのか答えてみなよ
あんたが言うロストの復旧が可能というのは
DirectXの関数を呼び出すだけなんだよな?(まさか今更意見かえたりしないよな)
関数は動いてもドライバが初期状態を返してきたら
そのあとどうすんだよ?
もしかしてアンタは全部初期状態でレンダしてんのか?
だからドライバがメモリ破棄しても問題ないのか?
>>372 この話にプログラマ側の自己責任で戻すとかは関係ない
ロストの復旧だけで済むとか言ってる奴がいるんだ
しかも「何の問題も無く出来る」と言い切ったんだ
毎回この話題になるとおかしな奴が湧いてくるよな
俺も画面プロパティからの変更は記憶があいまい 仕組み的には復帰できない気がするんだけど 32bit→16bitってなんで復帰できるんだろうねw バックバッファとかマジでどうなってんのかと思う ちなみにもう1度書いておくとデバイスロストは2通り 1.POOL_MANAGEDの内容が元に戻せる 2.デバイスごとロスト(D3DDeviceシボンヌ、D3DDeviceから作成し直す必要アリ) この2つは確実に存在するのはわかってるんだけど この2つがどんな条件で分けられてるのかわからない これで認識あってる? ただ、2のほうってたしか表現の違いでごちゃごちゃすんだよな 結果的にはデバイス作り直すしかないんだけど ポインタの先までまるごと無効になったかどうかは正直覚えてない 作りなおすしかないのはそうだと思うんだけど・・・? 微妙な間違いはあるだろうけどその辺は訂正してくれる形でサポート頼む
なんでこれだけ指摘されてもデバイスの復旧と、イメージを元に戻すの混同し続けるんだろう? あまりにも頭が悪すぎる。
377 :
364 :2008/03/09(日) 15:39:06
揉めてるようですが、こちらは解決したので報告します。 原因はマルチスレッドのせいでした。 以下MSDNより。 Direct3D では、IDirect3DDevice9::Reset、IDirect3D9::CreateDevice、 IDirect3DDevice9::TestCooperativeLevel、または IDirect3DDevice9 の 最後の Release の各メソッドは、ウィンドウ メッセージを処理するスレッドと 同じスレッドからのみ呼び出すことができるように設計されている。 なんたること。。。
>>375 >32bit→16bitってなんで復帰できるんだろうねw
領域を確保し直しているだけだろ。
内容自体は保証されないんだから。
>>378 それってデバイスごと作り直さないといけないタイプ?
POOL_MANAGEDで復帰可能なタイプ?
デバイスの普及を不可能にする手っ取り早い手立ては、動作中にビデオカードのドライバを入れ直しでもすれば再現可能。 しかしドライバを入れ直していたら、動作中のプログラムが動かなくなったと文句を言っている奴を見たことはない。
>>380 まだそこまでいってなくて
デバイスの復旧が必要な条件がわからないんだ
>>381 CTRL+ALT+DELを押してごらん
>>379 システムメモリ上に無いデータは、ロストした時点でリソースが破棄されるだけで、
デバイスそのものは作り直す必用はない。
バックバッファは内部的に再確保されているから、内容を書き換えないで出力すると、
ゴミデータが描画されるのが確認出来る。
384 :
デフォルトの名無しさん :2008/03/09(日) 15:52:31
点線描画の件ですが、単純に PrimitiveType.LineStrip で点線を描画したいだけなのです。 テクスチャを張って一見点線らしく描画できましたたが、スケールをかけると点線の幅が変わってしまいます。 スケール、ロールを行うシステムなのですが、常に一定間隔の点線描画を得るにはどうやるのでしょうか? 頂点バッファで CustomVertex.PositionColoredTextured を使用しましたが、やり方が悪いのでしょうか? まさかスケールやロールするたびにu, vを計算して設定し直すのではレスポンスが気になりますし...
>>384 点をスクリーン座標に変換したあとに描画してみてはどうだろうか?
uvはそのつど決める感じで
あ、違うか スクリーン座標上の距離を求めて そこからUVを決定すればいいんじゃね? 多分、解決ーw 俺は天才だなw
389 :
364 :2008/03/09(日) 16:11:54
どうもお世話になりました。 いちお、うちの環境で調べたことを書いときます。 (ビデオカードはGeForce 6600GT) ◆デバイスロスト(復旧可能)になる条件 ・ウィンドウモード時にスクリーンセイバー起動 ・ウィンドウモード時にディスプレイの設定を変更する(32bit→16bitや、画面90度回転など) ・フルスクリーンモード時にALT + TAB ・フルスクリーンモード時にCTRL+ALT+DEL ◆デバイスロスト(復旧可能)とはどういう状態か Deviceを作り直す必要はなく、Resetすればまた使える。 POOL_MANAGEDでシステムに作ったリソースは失われない。 POOL_DEFAULTでVRAMに作ったリソースはReset前に解放して再作成する必要がある。 復旧できないロスト(デバイスごと作り直さないといけない状態)は、 一度も起こらず、やり方も分かりませんでした。
>復旧できないロスト(デバイスごと作り直さないといけない状態) オレもなった事ないな MSのサイトのどこかにドキュメントないかな
391 :
デフォルトの名無しさん :2008/03/09(日) 17:08:33
>>388 たとえばマウスホイールの回転でズームする場合、
マウスホイールのイベントにて、頂点バッファをLockして
u,vを設定し直してUnlock、そして描画ということでしょうか。
DirectXをよく知らないので教えてほしいのですが、
頻繁な頂点バッファの更新はレスポンスに影響しないのでしょうか?
(実際に問題ありかどうかはやって見れば良い話ですが...)
>>375 の2種類のデバイスロストだが
2のD3DDeviceしぼんぬは無いだろう。これはいわば都市伝説だな。
ID3DDevice9は、GPUに結びついているとはいえ
実態はメインメモリ上のデータにすぎない。
GPUがあろうがなかろうが、ドライバを消そうがどうしようが
こいつ自体が死ぬ直接的な理由にはならんだろ。
分けるとすれば、reset()で救済できるロストと救済できないロストに
なるんじゃないか?
例えば、D3Dアプリケーション起動中に GPUの[プロパティ]->[トラブルシューティング]->[ハードウェアアクセラレータ]を 最大からLv2ぐらいまで落とすと、デバイスはロストしっぱなしになるが 元に戻すと何事も無く復活する。何気にスゲーなD3Dは。
>>392 単純に
POOL_MANAGEDで復活可
POOL_MANAGEDで復活否(これができない状態を俺はデバイスごとロストだと思ってる(勘違いの可能性アリ))
ってわけられると思うけどその辺の境目はみんなの中でどうなってんの?
395 :
デフォルトの名無しさん :2008/03/09(日) 19:40:52
391だけど、やってみたらやっぱり遅い...当然か... 毎回u,vを計算し直して頂点バッファにセットして描画はでは遅すぎますね。
397 :
デフォルトの名無しさん :2008/03/09(日) 19:55:38
Win32APIを使い、C++でプログラムを組んでいます。(DirectXも使っています。) //質問 PCゲームなど、セーブ、ロード画面に演出の一つとして使われている 現在のウィンドウ画面を小さくして表示しているサムネイル画面? について質問です。 やり方がわかりません。そういうAPIが用意されているのでしょうか? 教えてください。
399 :
デフォルトの名無しさん :2008/03/09(日) 20:28:09
インターネットがつなげない友人に頼まれて、directXをフラッシュメモリに入れて フラッシュメモリ ↓コピー 友人のパソコン としたのですが、インストールできませんでした。 directXはインターネットが繋げないとインストールできないのでしょうか?
元データの段階で表示されてるパーツの小さいのをサムネイル用に用意する
401 :
デフォルトの名無しさん :2008/03/09(日) 20:33:06
>>398 Saveフォルダに、その画像が保存してあったりするので、それはないかと。
その画像をサムネイル画面として表示しているのでは?
そのやり方さえもわからないので。
>>401 自分で縮小してその画像を保存すればいいだろ。
どれだけ頭が悪いんだ?
404 :
デフォルトの名無しさん :2008/03/09(日) 20:37:54
>>400 現在表示しているウィンドウ画面の保存のしかたは、
どうすればよいでしょうか?
>>404 DIBにイメージをコピーして好きな画像フォーマットに変換して出力しろ。
406 :
デフォルトの名無しさん :2008/03/09(日) 20:52:50
BMPのこと
表示するキャラや背景の画像データがあるじゃないですか それを画面の表示状態と同じように並べるじゃないですか それを縮小するじゃないですか それを保存すればいいんじゃないですか?
>>406 ググれば分かるような単語ですら調べようともせず質問するお前は、プログラマには向いていない。
迷惑にしかならないから、もうやめておけ。
>>395 アルファブレンドのアルファ値を設定するようにUVも決まらんものですか?
まあ、それでもダメなら次の手を
ところでいまって
頂点と線一つ一つすべてに対して計算してんの?
例えば100〜200まではこの点線テクスチャ、
200〜300まではこの点線テクスチャ、
300〜400まではこの点線テクスチャ
・
・
・
っていうように使ってみたらどうよ?
>>396 パースペクティブコレクトでググルとなんかわかるか?
いや、違ったらスマンコ
412 :
デフォルトの名無しさん :2008/03/09(日) 21:48:57
>>410 >アルファブレンドのアルファ値を設定するようにUVも決まらんものですか?
>頂点と線一つ一つすべてに対して計算してんの?
スクリーン座標系でほぼ点線の間隔が同一になるように各頂点に対してu,vを
計算しました。これ自体も点数が多いのでレスポンスの観点から問題ですね。
>例えば100〜200まではこの点線テクスチャ、
>200〜300まではこの点線テクスチャ、
>300〜400まではこの点線テクスチャ
各頂点は全て3次元的に折れています(各点間は微小です)ので
具体的にどのようにやるのか私には解りかねます...
ロールも3次元的に行いますので、スクリーン座標で点線間隔が一定で
リアルタイム表示というのはDirectXはそもそも無理なのでしょうか?
OpenGLからDirectXへというのはこのあたりに弊害があるのでしょうかね???
>>412 >各頂点は全て3次元的に折れています(各点間は微小です)ので
?
1枚目(網目が超大きい)
u0.0 u0.5 u1.0
− − − − − − − − − − − − −
2枚目(網目が大きい)
−−−−−−−−−−−−−−−−−−−−
3枚目(網目が細かい)
----------------------------------------
ってテクスチャ用意して
スクリーン座標上の点間の距離を調べて
uv(0,0)-uv(1.0,0.0)で見た目等間隔になるように適当に比率だして
繋げりゃいいんじゃねぇの?
初めてWinAPIとDirectX触ったんだけど、 ウィンドウが表示されて感動した。 半日格闘してたから涙ものです。
大半はウィンドウ表示して 「で、どうすんの?」ってなって挫折する
416 :
デフォルトの名無しさん :2008/03/09(日) 22:20:22
>>413 すみません。
私自身がまだよく理解できていない思うのですが、
今1つのテクスチャでスクリーン座標上で距離を調べてu、vを
設定しているのですが、
それを3つのテクスチャでどのように繋げれば高速描画になるのかが
解りません。アホですみません。
(プログラムを見たら解ると思いますが...)
>>416 0〜100ならテクスチャ1
100〜200ならテクスチャ2
200〜300ならテクスチャ3
みたいな一定の距離で使用するテクスチャを切り替えちゃう誤魔化し技w
これならuvを弄らないしテクスチャの切り替えだけでいけるから
擬似的に速くなるんじゃないかと思ったわけ
ところで頂点シェーダでuv設定する方法で上手くいかんかった?
この程度楽勝速度だと思うんだけど
コンピューターおばあちゃん乙
お前ら久しぶり。
420 :
デフォルトの名無しさん :2008/03/10(月) 16:11:40
スレ汚しすいません。同じ質問させてもらいます... インターネットがつなげない友人に頼まれて、directXをフラッシュメモリに入れて フラッシュメモリ ↓コピー 友人のパソコン としたのですが、インストールできませんでした。 directXはインターネットが繋げないとインストール、更新できないのでしょうか?
ここはプログラム板です。 その手の質問はPCゲーム板にでも投げて下さい。
422 :
デフォルトの名無しさん :2008/03/10(月) 16:36:27
DirectXには現在のゲーム画面を保存するのに、D3DXSaveSurfaceToFile() がありますが、これは今現在の画面をそのまま(またはその一部を)保存します。 そうではなく現在の画面を縮小拡大して保存するようなものはありますでしょうか? WIN32APIで用意されているStretchBlt()は試しましたが画像がひどかったので。
サーフェイスに縮小描画すればいいじゃん。 StretchBlt使わないで自分で補間縮小すればいいじゃん。
>>422 マルチしてる暇あったら自分で調べろよ(w
426 :
デフォルトの名無しさん :2008/03/10(月) 18:09:41
directXのカメラの画角指定は対角画角ですか? 水平画角ですか? どなたかよろしくお願いします。
429 :
428 :2008/03/10(月) 19:36:04
最近できたInstantActionってブラウザゲームのサイト、どういうしくみなんだろ。 インストールされるのは小さいプラグイン1個なのに実行されるゲームは明らかにDirect3D製。 XBAPをゲーム寄りに進化させた感じ。 Direct3Dのサーフェイスをそのままブラウザに転送してる?
431 :
デフォルトの名無しさん :2008/03/10(月) 20:51:34
ShadowMapなどを2のべき乗サイズでテクスチャに記録して 1024x768の画面に使う場合 縦横の比率が違うことによって誤差は出ないのでしょうか? それとも気にしなくていい程度なのでしょうか?
433 :
デフォルトの名無しさん :2008/03/10(月) 21:53:26
>>417 0〜100・・・と言われているのはスクリーン座標系での距離ですよね。
ロールしたら全ての点(とりあえずテストで数十万点)のスクリーン座標変換び距離計
していますが、これだけでとても使えるレベルの速度ではありません。
(テクスチャを張るだけの場合は、スケール、ロールは全く問題ない描画速度でした。)
※ちなみに今までのシステムはC++&OpenGLですが、今後のWindowsの状況から
C#&DirectXも対応すべきではとのことで調査しています。
何のシステムかは察しが付くかもしれませんが...
>>ところで頂点シェーダでuv設定する方法で上手くいかんかった?
このあたりも私にはよく解りませんが、スクリーン座標系でのuv計算自体で
リアルタイムの描画は難しいという感じです。
(OpenGLと同等の)点線はあきらめムードです。
点線でなければならないこともないかなとメンバーで話し合っています。
コンパイル出来ることぐらい確認しろよ。 なんで関数がダブってるんだ?
ちゃんとzipを解凍してソースをみてやるお前に惚れた
>>432 無料で遊べる4本のゲームの内、一本だけ
「DirectX9のShaderバージョンが不足している〜.exe」ってメッセージが出て動かなかったから、
Direct3Dを使ってることは間違いないと思う。
パフォーマンスもJavaやFlashより高い。
インターネット一時フォルダか何かにexeをダウンロードして実行させてる感じ。
>>434 ぱっとみ、そんな問題なさそうな気がする
D3DPRESENT_PARAMETERSの初期化が甘いのが気になった
初期化してないから、Zバッファが自動作成有効になってないから画面がみだれるんじゃね?
FPSが遅いのはわからん
俺の環境では60FPSでてた
440 :
439 :2008/03/10(月) 23:05:48
補足 1秒ごとにテキスト書き出してるみたいだけど、それがFPSの足ひっぱってるとかない?
>>439 なるほど、Zバッファあたりが怪しいのですか
私の環境でも稀に60FPSになりますがDebugフォルダを消して再ビルドすると
かなりの高確率で38〜36FPSになります(VisualStudio.NET2003にて)
起動時が60FPSなら起動後もずっと60で、36FPSなら同様にずっと36のままなので、
どうも気になる・・・とりあえずZバッファ辺りを見てみます、ありがとうございます
>>440 Core2Duoマシンなので処理性能ならば恐らくは大丈夫かと思います。
>>442 ファイルへのIOはHDへのアクセスがあるので、CPUの性能はあんまり関係ない。
とはいえ、Core2Duo使ってるPCならボロHD使ってることはないと思うけど、
ファイルへのIOはメモリアクセスに比べて何十倍も遅いので、バッファ使うなどした方がいい(中身みてないけど、使ってる?)
444 :
439 :2008/03/10(月) 23:11:41
>>441 ZバッファはFPSには関係ない
なんか前回のウィンドウが残るとか書いてたからそれのほう
ためしに
if( nowTime - lastTime >= 1000 ){
この条件の処理の最後に
lastTime = ::timeGetTime();
入れたらどうなる?
445 :
439 :2008/03/10(月) 23:16:51
while ( timeGetTime()*6 - UpdateTime < CHECK_TIME ) { // フレーム時間(16.66*6 = 100)を越えるまで この処理もなんかおかしい気がする timeGetTime()は0スタートではないので、そのまま*6はおかしい
関係ないけど、thisをZeroMemoryするのはヤメトケ…
447 :
439 :2008/03/10(月) 23:24:16
ごめん
>>445 は問題なさそうやね
というわけで、俺的結論は、FlipのときにVsync同期しているため、
ぎりぎりタイマでタイミングとっているところで、ちょっとでもずれると次のフレームへ持ち越しになるから
処理落ちがおきてるのかと
Vistaとかなら、強制で同期するので
・・・と思うんだけどどうでしょ?
>>443 あ、CPUはあんまり関係無いんですねw
ファイルに書き込むときは
char str[32]; sprintf( str, "FPS:%.2f\n", fps );
という感じでfloat型をchar型の配列に格納してますが、これが怪しいのでしょうか…
>>444-445 書いた後気になったんですがやっぱりウインドウの方ですよねwすみません
んーtimeGetTime()*6もか…なんか次から次へと怪しいところが(苦笑
アドバイス頂いたFPSの方を試してみましたが、今のところは問題なく60FPS出てます
もう少しテストを続けてみます
>>446 確か仮想関数があるとどうとか聞いたような…
直しておいたほうがいいなぁ…指摘ありがうございます
449 :
434 :2008/03/10(月) 23:42:12
>>445 60FPS出るようになったーとパソコンを再起動したら再発しましたwworz
明日はもっと性能の低いパソコンに触る機会があるので
そちらの方でも一度試してみてまた報告したいと思います。
(もしかするとこのパソコンがおかしいだけかもしれないので)
ともかく、アドバイスくださった皆様方ありがとうございました
>>449 timeBeginPeriodしてる?
>>450 返答ありがとうございます。・・・どうもしていないっぽいですね。
色んなDirectX関連のサイトのサンプルやソースを実行しても60FPSだし問題無かったので
指定しなくても大丈夫なんだと気にも留めて無かったんですが、
timeBeginPeriodとtimeEndPeriodを指定すると見事に60FPSになってます。
Sleep(1)の部分で余分に待機してたってことでしょうかorz
勉強不足で申し訳ないです・・・どうもありがとうございます。
タイマーの精度ってそんなに違ってくるのか
俺のPCじゃ問題無かったけどな
>>451 OSはXP?
>>452 NT系のOSはtimeBeginPeriodしないと1ms単位にならん。
98系はしなくても1ms単位だったのでNT系で動作が可笑しくなる場合は其処が原因。
いや、笑いどころじゃないんだから無理に漢字にするなよ。
ウチのマシンはSleep(1)使っても2ms休む
QueryPerformanceCounterってどうなの?
「どうなの?」とは、無能極まりない発言としか言いようがない。
中身はRDTSCだからメニーコアだとたまに想定外の数値が返ってくるよ と嘘を書く俺よりはマシかもしれない
>>458 「としか言いようがない」って言い回しは視野がせまく
多面的な思考が出来ない事を表している。
人生やり直せとしか言いようがない。
>>460 「としか言いようがない」って言い回しは視野がせまく
多面的な思考が...
無言よせとしか言うようがない。
日本語のお勉強スレはここですか?
>>459 スレッドごとに利用するCPUをアフィニティマスクで
1つに固定すればおかしな値が帰ってこなくなるよ。
スレッドAはCPU1、スレッドBはCPU2、スレッドCはCPU2みたいな感じで全部指定
言いようがないとしか言いようがない言いようがない。
そんなことよりそろそろDirectX初心者スレに戻ろうぜww って話題が無いから外れてるのか
質問です。 GetBackBuffer や GetSurfaceLevel といった、IDirectSurfaceXを取得する関数。 これらは取得に(結構な)時間がかかるのでしょうか? それとも(参照カウントを増やしたうえで)ポインタを返すだけなのでしょうか? 前者ならば一度GetBackBufferしたポインタを保持しておくのですが、 そうなるとデバイスロスト時に解放しないとならず、1手間かかります。 後者ならば描画前に確保し、描画し終わったらすぐにReleaseするようにすれば楽そうです。
>>469 ありがとうございます。
なるほど、例えばpSwapChain->GetBackBufferでとれるIDirectSurface9は、
pSwapChainが自身の生成時にカウント1で保持しているわけですね。
参照カウントなので後者だろうなとは予想していたのですが、確信がありませんでした。ありがとうございます
デバイスロスト>デバイスリセットの際、 せっかく最初に行なった pDevice->SetRenderState だとかの設定まで全て初期化されてしまうようなのですが 以前の設定=ロスト直前の設定に簡単に戻すことは出来ませんか?
テクスチャを2次元的に拡大して表示した時に貼っつけた画像にアンチエイリアシングかけるのって SetRenderStateでD3DRS_DITHERENABLEにTRUE設定とはまた別なんでしょうか? どうもかかってないみたいなんですが・・・
それ生ポリ用 SetTextureStageState
>>471 RenderStateの設定部分だけを関数にでもしておけばいい。
>>472 D3DRS_DITHERENABLEは補間をディザ法で行うという設定。
TRUEにしたら、ザラザラの画像になるだけ。
今時のビデオカードが対応してるかは分からんが。
>>473 それらしいのが見つからないんですが・・・?
>>471 無理
全部覚えておくのが定石らしい
けど俺はデバイス作り直してルーチンもう一回通しなおして再設定しなおしてるw
でもこれバグり安いからどうせ1から作ってるなら絶対辞めたほうがいいw
こんな時こそえふぇくとふぁいる
みんな1つのモデルに 普通(?)に描画するときと フォグかけたときとαかける必要があるときと その他色々変化するときと 1つのモデルが描画方法によって色々必要な情報変わるときって シェーダまわりどうしてる?
日本語でおk
こんな時こそえふぇくとふぁいる
情報が色々変わるときシェーダーまわりどうしてる?とか言われてもなw くくりが大きすぎるんだよw 「ゲームってどうやってつくるの?」と同レベルの質問だぞw
Xファイルで読み込んだメッシュなどの表示をやっていて思ったのですが、 何かしら 「これから描画するメッシュは、全て50%半透明にする」 ための命令はないものでしょうか? 2D系でありがちな graphics->setAlpha(128); みたいな命令に相当するものです。
そんなのシェーダ使えば一発
なるほど、シェーダの分野でしたか。 逆に言うとシェーダが出現する前(DirectX7の頃)はどうやってたんでしょうね。
directX アルファブレンド で検索すれば腐るほどでてくるだろ・・・
>>478 俺にもパッと見日本語が不自由な人にしか見えん・・・
やりたいことがよくわからんが
それぞれをテクニックにまとめといて
切り替えるだけじゃだめなのか?
2D系でありがちな graphics->setAlpha(128); まずこんな処理自体普通のエンジンにはありえないだろ・・・。 一括で全部半透明とかやりたきゃ別のバッファに書いてそれを半透明で書け。
fpsを計測しようと思ってタイマーをセットして測ってみたら、負荷を変えても60fps固定でした。 すごく重くすると60fpsを下回ります。 どうもディスプレイのリフレッシュレートに合わせているようなので、D3DPRESENT_PARAMETERSを いろいろいじってみましたが、改善されませんでした。 どのようにすればフレーム描画後、すぐに次のフレームを描画しにいくようにできるでしょうか?
どう色々いじったのかを説明しないということは、 ここに書いたのはあくまで独り言で、他人の協力などいるか馬鹿野郎という主張だよね?
491 :
489 :2008/03/13(木) 22:16:26
すみません、いろいろやったうちの PresentationIntervaメンバ変数をD3DPRESENT_INTERVAL_IMMEDIATEにする でできてました。 試したときはちょうど60fps付近になったので、変わってないと思ってしまいました。 (解像度を下げてFPSが大きくなるのを確認しました) 失礼しました!
>>487 想像力たんねーな
そんだけだったら疑問がでるわけねーだろ
αかけながらフォグかかってるとかよ
α+フォグが入ったシェーダ作んなきゃならねーじゃん
こうやって変化つけないでシェーダ作り続けると
ノーマル+フォグ
ノーマル+フォグ無し
α+フォグ
α+フォグ無し
ちょっと点滅したい+フォグ
ちょっと点滅したい+フォグ無し
メタルっぽくしたい+フォグ
メタルっぽくしたい+フォグ無し
屈折したい
反射したい
ライト2個
ライト3個
・
・
・
ってちょっとしたもん表示するのにすげー数のシェーダができるじゃねぇか
みんなどうしてんだマジで
>>488 ありえなくはないっしょ
別バッファ用意するよりは一括α指定の方がはるかに高速だし
>>492 何さまですかあなた?
想像力が足りないから、自分の質問が他人に理解不能な事もわからないんですよw
>>492 1パス目:Zバッファのみレンダリング
2パス目:ライト系のみレンダリング
3パス目:スキン系のみレンダリング
俺は、こんな感じに各シェーダをカテゴリに分けて
マルチパスでレンダリングしてるよ。
そうすれば、ピクセルライト、頂点ライト、反射、屈折などそれぞれ専用のShader1つで済む。
半透明に対応するには、それぞれのステージにグローバルなパラメータとして追加するしかないかな。
フォグは4パス目として追加でいけるか。
まあ俺の環境はShader2.0しか動かないんで、こうするしかないのが正直なところだが。
どうせこの馬鹿のことだから、こうやって教えてやっても そんなこときいてねーよとか言い出しそうだがね
>>496 まとめて描画する場合と比べてかなり遅くね?
シェーダのコピペで済むならやったほうがよくね?
>>496 Seleneとかいうライブラリは同じシェーダー数の問題で
すべてのパターンのシェーダーを用意してた。
用途と実行環境に応じて自分で決めろよ
501 :
485 :2008/03/14(金) 10:17:48
ちょっと質問の意図がうまく伝わっていなかったようなので再度。 例えば村人のモデルを、Xファイルから読み込んだとします。 10人描画するにはXファイル管理クラスのDrawを呼ぶだけですからは非常に楽なのですが、 とあるアイテムを使うと「全ての村人が透けて見える」ゲームになるとします。 そうなると、私の知識では「村人データの全てのマテリアルのα値を、半減させてから描画」という(そこそこ)手間のかかることをやることになります。 IDirect3DDeviceなりに設定として「これから描くポリゴンは全て、”本来のマテリアルのα値×設定したα値”で描画しろ」 とやることはできないのでしょうか?
>>501 だからそれはAPIに対して求めることじゃないだろ・・・。
そうしたいのであればそうなるように自分でエンジンを組め。
最初からXファイルのマテリアルのAlphaを0.5fにして、 普段は SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); 半透明にするとき SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); Xファイルじゃなくてただのプリミティブでこれやったことがあります。。。
>>502 いや、無いなら無いでよかったんです。
そこそこ使いそうなので、何か効率的な方法が(ネイティブで)用意されてたら嬉しいなと思った程度でして。
ゲームだと、無敵になったら半透明とか、キャラに近寄りすぎたら(視界を妨げないように)半透明とか
昔からそこそこ需要がありそうだったので、IDirect3DDevice自体にそんな機能があっても不思議じゃないなぁと思いまして。
(そもそも、マテリアルの値を書き換えると戻すのが面倒)
>>503 面白いアイデアですね
(当然状況限定ですが)とてもスマート
とりあえず、今ならシェーダの切り替えで上手くいくようですし、シェーダ勉強しながら頑張ります
俺もキャラの半透明化とかで欲しいなとDX7の頃に思ったことあるな
>>502 APIに求めても罰当たらないレベルだと思うが
俺の感覚ではXファイルの存在自体が既にAPIの範疇超えてるな
全てのポリゴンは、唯一のテクスチャーをテクスチャーステージの0に持つようにする んで、その唯一のテクスチャーを切り替えて、α値にしてみたらどうだ? 当然乗算設定でARGB(任意, 255, 255, 255)にしておく。
テクスチャなんかで切り替えるくらいなら、普通はTFACTORを使う。 っていうか、今なら頂点シェーダで処理するのが普通だと思うが。
TFACTORの存在をはじめて知った。 便利だなこれ
>>502 とか、知らないなら答えなけりゃいいのになんで偉そうに嘘回答してんだろ
テクスチャステージは8つまでDirectXで使える。とあるのですが 実際使える数はステージ数は、グラボによって減るとのこと いままでは1ステージしか使っていなかったのですがそろそろ2ステージくらいは使いたいところ 現状「5年前のPCでもXステージくらいは対応してるだろ…JK…」って下限のステージ数はいくつくらいでしょうか? 1つもなければテクスチャを張れないので、1ステージもないグラボってのはないとは思いますが…。
TFACTOR使う前提ならPSは使わないって事か
>>485 D3DRS_BLENDFACTORの方が
TFACTOR類を使うよりは、君の希望する形に近いと思う。
>>498 最初はそれにしてた。フラグメントシェーダも試してみたりした。
でも如何せん制限がきつすぎて断念した。
それに対しマルチパスは制限が少ない。
例えば、ライト数に上限がないし。
それにマルチパスって、そんなに重くないと思うんだよな。
毎度毎度無駄な頂点トランスフォームが発生するが、
そこはボトルネックじゃないと思うし。まあ想像だけど。
ライト数に・・・上限がない・・・?
GPUパワーの限りパス数を重ねられるってことじゃないか
そんな事したら頂点数に関係なくバッチ数の問題でCPUが死ぬだろ。
ワロタw
>>514 DrawPrimitive呼びまくるの?
質問するなら敬語つかえや小僧
助けてほしいなら日本語つかえや子猫
>>523 ぶち殺すぞヒューマン(`・ω・´) シャキーン
525 :
デフォルトの名無しさん :2008/03/16(日) 01:45:09
//この頂点で四角を作って、 vertices[] ={{ 0, 0, 0, COLOR }, { width, 0, 0, COLOR }, {-width, -height, 0, COLOR }, {width, -height, 0, COLOR }}; //以下のView変換をすると、 D3DXVECTOR3 vecEyePt( width/2, height/2, -300.0f ); //カメラ(視点)位置 D3DXVECTOR3 vecLookatPt( width/2, height/2, 0.0f );//注視位置 D3DXVECTOR3 vecUpVec( 0.0f, -1.0f, 0.0f ); //上方位置 D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vecEyePt, &vecLookatPt, &vecUpVec ); PDevice->SetTransform(D3DTS_VIEW, &matView ); 四角を斜め下から見てる感じになります。 verticesはZ=0平面上にあって、 カメラ位置のx,y座標と、注視位置のx,y座標が同じだから、 四角を正面から見る形になると思うんですが、 何か勘違いしてるのでしょうか? ちなみにWorld変換はしてません。
526 :
525 :2008/03/16(日) 01:54:00
すいません、四角を作ってませんでした。 なかったことで。
527 :
525 :2008/03/16(日) 02:01:16
いや、四角は作ってるんですが、 長方形を作ってるつもりが、斜めった四角を作ってました。
馬鹿がくだらん設定値弄ってないで まずは(0,0,0)でうまくいくことを確認しろよw いるよなw 「〜だから〜なはず」とか偉そうに言っててそうならない 調べてみたら結局ただの設定間違いしてるのw まず、はじめにやることってあるじゃない? って嫌味の一つでも言われないと人は学習すらしない オレモナー・・・orz
かなり眠かったんで、大目に見てやってください。
メッシュを拡大表示すると法線も大きくなってしまってメッシュが暗く表示されてしまうって話を聞いたことある人いる? どっかで聞いたんだがぐぐってもでてこないし勘違いだったかなぁと悩んでる
D3DRS_NORMALIZENORMALSか、シェーダでやる。 法線を正規化する必要があるのならやるべきというだけだが 高速化と称して正規化をサボって問題が出て何か喚いていた阿呆がいたのだろう。
532 :
デフォルトの名無しさん :2008/03/16(日) 17:28:40
インストールの時 内部システムエラーが発生しました Windowsフォルダ内にあるDXError.logとDirectX.logを参照し原因を分析してください とでるんですが、具体的に何をすればいいんでしょうか?
DXError.logとDirectX.logをテキストエディタで開き、エラーの原因を探る
エラーっぽい行をコピペしてググレば英語なり日本語なりで情報が得られる。
>>531 d
思い出した、そうだこれだわ
「負荷かかるならいいや〜」ってことでメッシュの極端な拡大縮小はしないようにすることにしてたの忘れてた
法線マップので作った凹凸が逆になってしまうところがあります。 左右対称のパーツで、それぞれの頂点が持つUV座標も対称的に同じです。 法線マップにより凹になるようにシェーダ処理をしたところ、片方はちゃんと凹に、もう一方は凸に なってしまいます。 どうすれば解消できるでしょうか?? モデル作成にはメタセコイアを使いました。 法線マップは白黒で高低を表した高さマップをD3DXComputeNormalMap関数に与えて作成しています。 ご助言、よろしくお願いします。
頂点相対座標を自動で作ってくれる3Dソフトってあるんですか?高額ソフトじゃないので
>>536 そのモデルのタンジェントスペースの行列式を求め
値が0以下なら法線に-1を掛ける
普通はbeginthreadexとかでループさせるもんですか? それともpeekmesseageとかでループさせますか? ゲーム内のオブジェクトとかどうやって管理しますか? クラスをvectorに叩き込んで適当に追加したり削除したりでいいんですか? ネタじゃないです マジレスお願いします
ゲ製作板で聞け
質問です。 現在Xファイルの読み込みや表示などをやっています。 階層メッシュの表示。 Xファイルスキンアニメーションの表示 などはとりあえずできたのですが、この段階でXファイルについて疑問がわきました。 Xファイルは1マテリアルに複数のテクスチャーをもてないのでしょうか? D3DXMATERIALを見てもテクスチャ名は1つしか入れるスペースがありませんし…。 バンプマッピングや、2枚以上のテクスチャーを張る表現などを、ツール側で設定済みにしてXファイルに吐き出したい(そして読みたい)のですが。 Xファイルの読み込みには D3DXLoadMeshHierarchyFromX などのDXUのヘルパ関数を使っています。 Xファイルは自由に拡張が可能なのはおいておいて、(LightWaveなどから普通に吐き出せる)一般的なフォーマットでの話です。
544 :
デフォルトの名無しさん :2008/03/19(水) 19:06:41
解像度変わっても2Dの画面上のサイズとか座標をそのまま表示出来るようにしたいんだけどどうすりゃいい?
そのままの意味がわからんけど 解像度に合わせてウィンドウを拡大縮小したいって事?
546 :
536 :2008/03/19(水) 22:46:42
>>539 ありがとうございます。
しかし、その方法でうまくいきませんでした。
いろいろいじっていると、
(接ベクトル)
(従法線ベクトル)
(法線ベクトル)
と並べて作っている頂点座標系変換行列のうち、
従法線ベクトルに-1をかけると凸凹が逆になることが分かりました。
このことをヒントにもう少し探ってみたいと思います。
教えていただいた、行列式の判別の意味を理解したいのですが、
その理論を知るのによい本やサイト、あるいは学術分野名など、
ご存知でしたら教えていただきたいです。
行列式は機械的な求め方を学んだことがあるだけで、それを
こういった判別処理にうまく利用するということに興味があります。
よろしくお願いします。
Xファイルを読み込み、表示できたのですが、 読み込んだXファイルを操作するにはどうすればいいのでしょうか? (回転や移動ではなく、たとえば腕を動かすようなモーション的なものです)
>>543 その前に使い方について質問
お前、XFileなんて可逆変換できると思ってんの?
多分一発XFileにした時点でそのモデルデータはもうゲーム専用なわけよ
つまり、モデリングソフトのフォーマットからXFileには一方通行なわけ
正直、XFileってのは扱いにくい
古いフォーマットだから色々足りないしね
なので必要なデータだけもぎ取ったらXFileは捨ててしまって
取得したデータを自作フォーマットに変換して使ったらどうか?と思うんだがどうだろうか?
Xファイルは拡張可能って何の幻? 最近のDirectX SDKを見ろよ。 Microsoft自身がXファイルの拡張なんか使わず、違うフォーマットを使ってるじゃないか
Xフォーマットはゲーム用のフォーマットじゃなくて書籍のサンプル用のフォーマットだぞ
質問には応えず、質問者をこきおろすその態度に絶望するわ
Xファイルの代わりにどのようなフォーマットのファイルを使えばいいのでしょうか?
>>548 アドバイスありがとうございます。
プログラム内で独自フォーマットに変換してしまうのは、難しくありませんし、有効だと思います。
ですがその前に「Xファイルは1マテリアルに複数のテクスチャーデータを持たせて出力できるのか」が問題です。
もしできないのであれば、Xファイルを使う価値は少ないので、別のフォーマットを使うことになるでしょう。
>>553 フォーマットそのものを自作します。
方法は自分で考えましょう。
つーかXファイルが持ってるのはテクスチャデータじゃなくて ただのファイル名、文字列なんだからXファイルフォーマット拡張しないで で複数のテクスチャ渡したいなら適当に二つの文字列渡してプログラム側で 分割すれば良いんじゃね? hoge.dds:bump.dds じゃいかんのん?
グラフィッカにどう説明するつもりだそれ
>>554 いや、その問題もズレてるでしょ?
君がターゲットにしているソフトがXFileに対応してるかどうか?が問題じゃない?
俺の経験だとXFileにも方言があって、そのすべてに対応しているローダなんてみたことない
たとえXFileのリファレンスに忠実であっても自分のターゲットのソフトが対応してなきゃなんの意味もない
そこを踏まえてXFileのどの方言に対応してどう扱いたいのか?ってのを
まず作る前に決めたほうがいい
一番いいのはXFileから必要なデータだけとってしまって
自作のフォーマットにして保存してしまうのが一番楽だ
>Xファイルは1マテリアルに複数のテクスチャーデータを持たせて出力できるのか ここだけ知ってる人間が答えてあげればいいだけのハナシじゃないの 残念ながら俺は答えられないけど、
いっそテクスチャファイル名の代わりにエフェクトファイル名を出力しちゃえ
>Xファイルは1マテリアルに複数のテクスチャーデータを持たせて出力できるのか マルチテクスチャが流行りだした頃からのFAQだけど不可能。 無理矢理拡張フォーマットを持たせて格納することも不可能じゃないけど 世のXファイル描画ライブラリはそんなのを面倒見てくれないしなぁ。 それでもやる意義があると思うならがんばって。
>>561 なるほど、残念です。
他のもっと汎用的な形式に乗り換えることを検討します。
>>560 おもしろいアイデアですね。
でも結局のところ「1枚目のテクスチャのUVと、2枚目のテクスチャのUV」が別個に必要ですから、
Xファイルが(基本的に)サポートしてないと意味が薄いんですよね
>>546 タンジェントスペースの作り方にもよるが、
普通、反転する可能性のある軸は従法線だった。
なのでその方法が正しいです。つーか俺のライブラリもそうなってたw
行列式の使用方法は、俺は、
ゲームプログラミングのための3Dグラフィックス数学という本で学んだ。
ここでも何度も紹介されているし、俺もお勧めです。
Gemsまではいらないと思うが、こいつは3Dプログラマ必読と思う。
564 :
536 :2008/03/20(木) 14:11:49
>>563 おお、すごくためになりそうな本です。
教えてくださってありがとうございました!
一回のDrawPrimitiveUPで10万頂点描画するのと1000頂点を100回描画するのはどっちが速いんでしょうか?
1画面分の頂点の移動も全て計算してから一回で描画しても速いんですか? 1000頂点を一回描画する間に次の1000頂点の移動を計算させておいた方がよくないですか?
最初の質問と前提が違うじゃん 並列処理した方が速いかどうかは移動に使う計算量によるだろっていうか自分で計測しろよ
なるほど仕組みがわかってきました。まじありがとうです
簡単に言うと
>>565 の状況だと頂点演算の処理やピクセル演算の処理は当然どっちも同じなんだが
DrawPrimitiveUP自体と其れに伴うステートの変更が相当重い処理になるのでCPUで差が出る。
でも大抵は画面に表示されない部分はクリッピングされることが多いので 分割したほうが大抵いい結果になる どうしても画面にすべて表示されてしまう場合のみまとめて描画が役に立つかも 2Dゲーのマップチップとか弾幕STGなんかを作るときに出る問題
当然状況にもよるけど ロボットものをパーツ1個1個をモデルにするよりも 1モデルにしてボーンで動かす方が軽かったりする。
HLSLでテクスチャーを渡す場合、 ID3DXEffect#SetTexture を使うしかないのでしょうか? 単に IDirect3DDevice9#SetTexture で設定されているテクスチャーを使いたいのです。
HLSLで〜という質問の仕方は変でした。 HLSLでPixelShaderを書いているのですが〜です。 固定のシェーダだとIDirect3DDevice9#SetTextureで情報を渡しているわけなので、気になりまして。 内部でm_pKoteiShader->SetTexture を呼び出しているのかもしれませんが。
HLSL内でsamplerに対して固定機能のテクスチャを拾ってくるという指定も出来る。
>>575 ありがとうございます。
どうやらsampler_stateの中の
Texture = <名前>;
を省略すれば固定機能のテクスチャを見てくれるようなのですが、これですと
SetTexture(0, 略); のものしか拾えそうにありません。
正しく(0以外のものも)拾うにはどうしたらいいのでしょうか?
MSDNあたりも調べてみたのですが見つけられませんでした。
(省略すれば〜というのもなんとかんく閃いただけです)
sampler Sampler0 : register( s0 ); sampler Sampler1 : register( s1 ); これの欠点は固定機能で対応していないとダメなこと。 つまり固定機能的には8ステージまでしかなかったら いくらシェーダーで16枚対応していて8までしか有効にならない。
ありがとうございます。 s0 とはHLSLではない、それ以前のシェーダアセンブラにおけるレジスタ値ですね。 sampler register の複合で検索をかけたら、いろいろでてきました。 これで「PixelShader未対応環境」での動作の統一(統一といって、省略になるものが多いでしょうが)が楽になりそうです
丁度やってるところが話題にあがってるなー 横槍で質問していいかな sampler SampNormal : register( s1 ) = samper_state { AddressU = Wrap; AddressV = Wrap; }; こんな感じで、固定シェーダのものを真似しつつも一部だけ変える。みたいなことできないかな?
>>579 俺はこれしか知らんなぁ
他にスマートな方法があったら誰か教えて
technique T
{
pass P
{
// Texture0
addressU[0] = clamp;
addressV[0] = clamp;
minFilter[0] = point;
magFilter[0] = point;
// Texture1
addressU[1] = clamp;
addressV[1] = clamp;
minFilter[1] = point;
magFilter[1] = point;
pixelshader = compile PIXELSHADER_TARGET FpMain();
}
}
2DでUP系と頂点バッファ使うのじゃどっちが早いのかは謎やね 俺は2Dも3DもDrawIndexedPrimitiveでまとめてやってるけど
ゲームを作っていて、なるべく沢山の人がプレイできるようにするには なるべく古いバージョンのVSやPSを使ったほうがいいですよね? でも、バンプマッピングをやったところどうしてもPS2.0が必要になってしまいました。 PS2.0ってどの程度普及してるもんでしょう? 対応グラボ一覧などを見ても「一般的なライトユーザーは、で、結局どのあたりのグラボを持ってるんだろう?」 となってしまって基準を決めかねてます みなさん自分でシェーダを利用したプログラムを書くとき どの程度のバージョンで決め打ちしてますか?
>なるべく古いバージョンのVSやPSを使ったほうがいいですよね? PSはまだまだ使えん メーカー製のPCだとPS非対応が多い
>>582 固定機能のみ、2.0対応、3.0対応でそれぞれシェーダーを用意する。
そのへん勝手にやってくれるライブラリもフリーであるし。
3DゲームならDirectX10対応もしておきたいところだと思う。
ライブラリ部分なんて1回作っちゃえばあとは使いまわしだし。
アイマスみたいなアニメ調。 つまり可愛いトゥーンレンダリング&輪郭線って、PSないと不可能だよな? PS未対応はかなりきついぜ
不可能じゃない パフォーマンスはおそらくシェーダを使った時より劣るだろうけど
テクスチャだけそれっぽいのにしてuvで調節する技があったよな
そうか、不可能じゃないか…。 そういえば、輪郭線は「キャラをほんのちょっと太らせて、ポリゴンの表裏を逆転。さらに輪郭線色に塗ったもの」 を用意して、キャラに重ねておけばできたなw トゥーンは何か方法あったっけ? ライトとの角度をUVに変換する方法は、固定機能には無かったと思う
>>590 せっかくだから、良かったら教えてくれ
プログラマブルシェーダで今やっちまってるけど、古い技術にも興味ありまくり
やっぱ今からやるならDirectX10なのかな 9とは別物なの?
10はVista以降じゃないと使えないけどそれでいいのなら
そしてVistaへの移行は恐ろしく緩やか
いつも切り替わりの時思うんだけどすごいゲームとかソフトが出たら一瞬で世界中が移行するよなw
一般にセルシェーダのゲームって、正直画面汚くね?
>>597 開発者のオナニーだよな
誰もいいと思ってねぇよなアレ
セル調なのはいいけど、アニメーターが使用する配色と甚だかけ離れてるからね 汚いというか違和感が強い
すごいな・・・よく作ったと思う。 にしてもドラゴンボールって今でも新規獲得できんのかね?
602 :
デフォルトの名無しさん :2008/03/21(金) 14:03:50
SDK付属のスキンメッシュのサンプルに余分なものがゴテゴテついててなかなか解読できないんですが、いい解説サイトないでしょうか? コンパイルすれば動かせる状態のソースと解説つきなものが理想なんですが、そういうサイトって大抵DX8世代で困っています。
>>602 ああ、俺もつい先週、まったく同じ境遇だったw
スキニングだけ見たいのに、シェーダだのなんだの邪魔なものが多いんだよなw(当時シェーダ使ったことなかったから混乱しまくった)
あのソース、
・CAllocateHierarchyを別のh/cppに持ってく
・m_SkinningMethodでの分岐をやめて、継承関係で分岐させるようにする(動的に描画方法をチェンジはできなくなるけどね)
とやると、恐ろしく短いソースになる。
その後は解説もいらないくらいわかりやすいから、やってみ。
605 :
デフォルトの名無しさん :2008/03/21(金) 15:31:52
>>565 そもそもDrawPrimitiveUPで一回で描画できる頂点の上限が
10万を超えているハードって普通にあるのかなぁ。
俺がいままで扱ったことあるGPUって高々10程度なので
あてになる情報ではないけど、少なくともこの経験の範囲では
65000ぐらい以上の頂点を描画させようとするとDrawPrimitiveUPが
失敗して描画しなかったような気がする。
Zバッファに輪郭抽出のフィルタかければいいんじゃない
上は604へのレスです
裏に回る境界のラインを上書き
>>604 一番簡単なのが、面を裏返しにして、法線方向に膨らませて描画。
ただし、メッシュに不連続な部分(隣接する面で法線が共有されていない)があると駄目。
あとは法線と深度をテクスチャに描画して、輪郭抽出フィルタを使うという方法もある。
>>605 >65000ぐらい以上の頂点を描画させようとするとDrawPrimitiveUPが
>失敗して描画しなかったような気がする。
あー、なんか俺も昔そんな覚えあんな
巨大マップを一つのモデルで描画しようとしたときにそうなったw
無駄だったから分割したけどw
そこでオクツリーってキーワードを知った勉強になったと思う
device->SetRenderState(D3DRENDERSTATETYPE,TRUE); ってやつを9.0でやりたいんですけど、どれがそれに当たるんでしょう? それともこれは廃止されて別のインターフェイスに同等のものがあるんでしょうか?
Xファイルとはもう決別して、他のモデルデータ形式を使いたいんだけどお勧めないですか
FBXは一応やってはいるのですが、モデルの描画まではFBXSDK見ながらやったのですが
スキニングアニメに必須なボーン関係で苦戦中
有名どころのこのサイトでも同じような場所で更新とまってるし…
ttp://marupeke296.com/FBX_main.html そもそも情報がSDK以外に少ない
サイトでも本でも良いので、モデルデータの読み込みの情報がある程度で揃ってる形式ないでしょうか。
↑書き忘れ Xファイル+マルチテクスチャーくらいでとりあえずゲームつくりには使えるかなと思ってます
>>612 IDirect3DDevice9::SetRenderStateは普通にあるけど?
616 :
デフォルトの名無しさん :2008/03/21(金) 18:21:04
IDirect3DDevice9::Resetで、ウィンドウフルスクリーンを切り替えようとすると、 D3DERR_INVALIDCALLが返され、失敗してしまいます。 ウィンドウ、フルスクリーン共に起動時の初回デバイス作成は上手くいきます。 デバイス作成のパラメータはこんな感じです。 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); if(fullScreen) {//フルスクリーンモード D3DDISPLAYMODE dispMode; Pd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dispMode); d3dpp.Windowed = FALSE; //ウィンドウモード d3dpp.BackBufferCount = 1; //バックバッファ数 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//フロント/バック切り替え方式 d3dpp.BackBufferFormat = dispMode.Format; //バックバッファ形式 d3dpp.BackBufferWidth = 800; d3dpp.BackBufferHeight = 600; d3dpp.EnableAutoDepthStencil = TRUE; //深度ステンシルバッファ d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //深度ステンシルバッファ形式 } else {//ウィンドウモード d3dpp.Windowed = TRUE; //ウィンドウモード d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //バックバッファ形式 d3dpp.BackBufferCount = 1; //バックバッファ数 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//フロント/バック切り替え方式 d3dpp.EnableAutoDepthStencil = TRUE; //深度ステンシルバッファ d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //深度ステンシルバッファ形式 } Pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &PDevice); ウィンドウフルスクリーン切替時は、作成したLPDIRECT3DTEXTURE9を解放して、 デバイス作成時と同じD3DPRESENT_PARAMETERSでResetしています。 なんで失敗してしまうのでしょうか?
617 :
612 :2008/03/21(金) 18:48:38
>>615 間違えた・・・
device->SetRenderState(D3DRS_COLORKEYENABLE,TRUE);
です。カラーキー
>>616 hDeviceWindow が NULL のようだけどそれでいいの?
>>617 カラーキーはDirect3Dには無い。
代わりにαブレンド(またはαテスト)を使う。
抜きたい部分と抜きたくない部分でα値を0.0/1.0に設定しておく。
D3DXCreateTextureFromFileExにはカラーキーを与えれば勝手に
α値を設定してくれる機能があるからそれを使えば簡単。
620 :
616 :2008/03/21(金) 19:28:10
LPD3DXSPRITEを解放していないせいでした。
>>618 どうもありがとうございます。
念のためhWndも設定しておきます。
621 :
612 :2008/03/21(金) 20:22:09
>>619 ありがとうございます!これで透明部分の向こう側も見えるようになりました!
ところで半透明を使う時ってレンダリングの順をうまくこちらで調整するしかないんでしょうか?
>>621 安心しろ
そんなもの気にならなくなるぐらい描画順に関しては弄り倒すハメになるからw
624 :
612 :2008/03/21(金) 21:40:54
>>622 ,623
アリガトウゴザイマス
ゲームで使うポリゴンモデルってメッシュで表示するの?よく動く場合はPrimitiveとかですか?
メッシュだよ。 ただ、メッシュ読み込もうにも色々ファイルに種類があってな・・・ どれを使ったものやら 教科書的にはXファイルでいいんだが、ゲーム作るとなると・・・
613でも話題にあがってるが、FBXの情報サイトは少ないなー SDKがあるとはいえ、まだまだ情報足りん…
627 :
612 :2008/03/21(金) 23:58:39
>>625 モデルの読み込みって自前で処理するしかないんでしょうか?(コピペも含めて)
メッシュってことは表示する時はSubSet()呼ぶ手な感じになるのかな・・・
ゲーム用途で言えばFBXはゴミデータが多くパージングにも 無駄が多くなりがちなのでウンコとしか言いようがない
全然関係無い話で恐縮なんだけどさ なんかいつの間にかfopenとfreadでテキストファイル読み込んだら 最後に ����ォォォォォォォォ・・ とか付くようになってんだけどなんで? VC++2008Exp OS:VISTA ただ、バグってるだけかな?w それともなんか変更あった?w
それ・・・ 呪いだよ・・・
自己レス 読み込んだサイズでメモリ確保するときに +1するの忘れてただけw 会社のお便利ライブラリに毒され過ぎたw
メモリの問題じゃなくて呪いだってば(w
フォ����ォォォォォォォォ・・
>>629 文字コードが SJIS じゃないんじゃない?
あるいはその逆?
天狗の仕業じゃ
フフフフフフフフフフ
って、自己解決してたのか・・・
639 :
デフォルトの名無しさん :2008/03/22(土) 03:39:21
IDirect3DDevice9::SetRenderState() はどのタイミングで実行すればいいんでしょうか。 変更しないものは最初に一度やるだけでいいのか、 それとも描画のたびに呼んだ方がいいんでしょうか?
なるべく呼ばないほうがいい
>>639 多分、DrawPrimitiveが実行されるまでステートの変更なんてグラボにアクセスしないだろうし
ちゃんと設定したいステータスが設定できるように組め
固定機能で出来る範囲のことは、シェーダより固定のほうが速いんすかね? 具体的には、単純な表示、トランスフォーム(固定で出来る単純なブレンドも含む)辺りなんですが
昨今のGPUはシェーダーで固定機能をエミュレートしているので実質違いはない。
GPUから固定機能シェーダが(しかしこれも最後まで、適当な呼び名がなかったな。なんとかならんのか) 非搭載になったのって、GeForce6xxxぐらい?
645 :
デフォルトの名無しさん :2008/03/22(土) 15:10:28
出来る限り呼び出し回数を減らすように描画を工夫するのが望ましいが 何度か呼んだ程度で重くなったりするようなものでもないからじゃんじゃん使ってOK
646 :
642 :2008/03/22(土) 16:25:43
>>643-644 ありがとでやんす。比べても差が無かったのは、テストの仕方が悪いだけかと思ってました。
シェーダ一本でいくっす。
草や木を植えるのに1本ずつDP呼んだりしなければ基本的にはOKだわね
648 :
602 :2008/03/22(土) 18:36:48
>>603 ありがとうございます、かなり短くなりました。
それでも結構ソース多い・・・
テクスチャにするファイルってなんか条件あるの? エロゲキャプったJPGだと読み込んでくれなかったぜ
シラベロウ
わかったぜ! 2の乗数で、縦横が同じ大きさの画像なら大体問題なさそうだな!
>>651 そこらへんの制約は色々複雑なのでD3DCAPSをちゃんと調べれ
ただ、出す分には楽だけど限界を調べようとすると面倒だな 必死に滲まない方法とか最大サイズをスレに聞きに来てた初心者に悪いことしたと思った たしかに面倒だ ものによってフィルタOFFにできない(これはあきらめるしかない)とか、 そんときのuvとか面倒だなーと思った 0.5ずらしとかやるよりもとりあえずクランプにしておいて 色々とあきらめるのが最善の方法だな ただ、マップチップ構成でフィルタOFFにできないってのは 結構悲惨な絵になるなw(ま、どうしようもねぇけどw)
固定シェーダでノーマルマップって使えますかね? バンプができてるようなので、できなくはないのでは・・?と思っているのですが
テクスチャ貼れたけどぐんにゃり曲がってるぜ、なんなんだこれ?
>>654 なくはないがクオリティを気にしないのが前提条件
oプラズマですo
658 :
デフォルトの名無しさん :2008/03/23(日) 10:49:26
現在、DirectMusicを使ってwavファイルを再生させてるけど、 何のエフェクトもかけていないのに変にエコーがかかったような音が出る。 どうにもらちがあかないのでここに来たけど、 なんか時間が短い単純なwavファイル再生ならDirectSoundがよさそうだね。 そんで質問ですけど、どっかにDirectSoundのいいサンプルないですか? SDKのサンプル見たけど、なんかいろんなことをやってて難しそう。(それが標準なのかもしれないけど)
MS特有のサンプルコードの読み辛さはあるかもしらんが、あんなもんだよ。 最新のSDKにはXAudio2っていうよりシンプルなオーディオAPIがあるからそっちもどうぞ。
654です 固定シェーダ(これの呼び方まちまちすぎ)のノーマルマップについて あるということでしたので調べているのですが、さっぱりひっかかりません どなたかよさげなページか、SDKの対応するサンプルなりを教えていただけませんでしょうか
>>660 DirectX7のコロのSDKにはサンプルがあったと思う。
ただ固定機能でも対応しているのってNVIDIAのGeForceととATIのRadeonだけだったはずだが。
「固定機能=全機能保障」と思ってるなら大間違いだぜ。
シェーダーのように最低ラインが定められていないから、
テクスチャステージが1つしか使えなくて減算合成が出来なくてもポリゴン1枚出るなら固定機能サポートを謳える。
>>661 あちゃー、固定機能=最低ライン保証のつもりでした
ゲームを作ってるんですが、どうしてもピクセルシェーダを避けたいなと思いまして。
どうしてもPSが必要なのはバンプ(ノーマル)マップだけなんですよ
他は普通のライティングくらいしか行なっていないので。
んー、PS1.1以上必須って条件はいれたくないなぁ・・
>>662 PS1.1は正規化が出来ないのでノーマルマップをやるなら2.0からであろう。
そういう場合は素直に2.,0対応なら其れを使い、未対応ならノーマルマップなしで描画するように
ライブラリ部分で自動的に切り替えるのが一番よろしいかと思う。
え、normalizeって1.1でできないでんですか? PixelShader = compile ps_1_1 PS_NORMA();
途中送信失礼しました。 え、normalizeって1.1でできないでんですか? PixelShader = compile ps_1_1 PS_NORMAL(); と1.1コンパイルを指示した上で、 float3 N = normalize(Normal); とやっても特にエラーでずにきちんと表示されてしまうのですが
normalize - HLSL -------------------------------------------------------------------------------- 正規化されたベクトル x / length(x) を返します。x の長さが 0 の場合、結果は無限となります。 構文 ret normalize(x) ここで 名前 In/Out テンプレートの型 成分の型 サイズ x in ベクトル float 任意 ret out 入力 x と同じ float 入力 x と同じ次元 最低限必要なシェーダのバージョン この組み込み関数は、次に示すバージョン以降のシェーダでサポートされています。 頂点シェーダ ピクセル シェーダ vs_1_1 ps_2_0
とても失礼しました。 normalizeはPS1.1で使っておらず、VS1.1で使ってました。 PSですと確かにダメでした。
質問 HLSLでcompiale ps_1_1 でコンパイルした場合と、ps_2_0でコンパイルした場合で見え方が違うのですが そんなことありえますか? バンプマップでマイクロソフトの古いサンプルを参考に float4 PS_BUMP(VS_BUMP_OUTPUT In) : COLOR { float3 N = 2 * tex2D(SampNormal, In.TexNormal) - 1; float3 L = 2 * In.Light - 1; In.Color.xyz *= tex2D(Samp, In.Tex).xyz * max(0, dot(N, L)); return In.Color; } という式なのですが、1_1だと黒っぽく。2_0だと全体的に白っぽくなります。
1.1は固定小数点で計算されているので内部的に丸められて-1〜+1より外の値は丸められる。 2.0は16/24/32Bitのfloatで計算されているのでちゃんとした結果になる。 固定は-2.0〜+2.0かもしれん。忘れた。 最近のDirectX9では1.x系は事実上破棄されているのでもHLSLでもコンパイルできん。
なるほど、1.1では丸めこみのせいか・・・ 互換性がないのもなんだかなぁ・・・
サーフェイス座標系に変換して、ライト方向をPSより前にノーマライズしておけば PSでライト方向をノーマライズする必要がなくなるから2.0より前でもバンプできね?
>>671 頂点で正規化してもラスタライズで線形補完されるから
PSにきたときには長さが変わってる。
さらに法線マップ自体もドットバイドットなんてフィルタリングありでは不可能なので
どっちもPSで正規化しないと完全に正しいライティングにはならなかったりする。
なるほど・・・ そこまで細かいのやったことないから気づかなかったわ
質問いいでしょうか HLSLでVSを書いた場合に受け取れるNORMALについてです この法線、normalizeせずに普段から使っていて特に問題が起きていないのですが、ノーマライズされているものなのでしょうか? 法線についていま勉強中で、勘違いでなければ拡大を行なえば法泉も変化が起こり 全体的に大きくするほど黒くなってしまうと予想しているのですがそうなりません pDev->SetRenderState(D3DRS_NORMALIZENORMALS, FALSE); を設定してあります 法線情報の入りXファイルからメッシュは作成しています pDev->SetTransform(D3DTS_WORLD, &matWorld);で1.0倍〜100倍にしてみましたが、変化は見られませんでした
SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);はシェーダーを使う場合には関係ない。 普通なら法線はデータ的に正規化されているのでそのままシェーダーで使っても 問題にならないがボーンの変形や拡大縮小をした場合に法線が1.0じゃなくなって ライティングがおかしくなるようなときはnormalizeしたほうがよい。 NVIDIAのGF6からならfp16使っているとnormlize()は1クロックで 終了するので実質まったくペナルティはなかったりする。
俺もいまだにどういう時にnormalizeするべきなのかが「やってみなけりゃ」わからん 法線関係って3Dでは絶対学ぶべきもののはずなのに、つっこんで説明してるサイトとかが見当たらないんだよな
ベクトルに計算施した後、向きベクトルだけ欲しい時に正規化するもんじゃないの? 他にするべきタイミングがあるって事?
多分俺の理解度がまずいんだと思うが、例えばライトとのディレクションライトとの角度が欲しいとき dot(PolyNormal, LightDirection)するだろ? この時、それぞれはNormalizeされてなきゃダメなのか?とか PolyNormal : NORMAL は正規化されてる保証があるのか?とかが曖昧で
基本的に頂点シェーダーの入力データは頂点バッファの中身そのまま。 頂点バッファに入ってるデータが正規化されているなら頂点シェーダーでも正規化されてる。 法線が正規化されてないと困る場合(主にライティング)に正規化する。 キューブマップとかは方向さえあればいいので正規化はいらん。
>>679 サンクス
ってことは、拡大縮小とかゆがみとかやっても頂点バッファのものがくるわけか・・・
モデルの法線は正規化済み&ライト方向も正規化済みなら、
XYZの倍率が全て同じな拡大・縮小を使ってる限りは、ライティング時も正規化はいらないわけね
>>676 ライティング処理等で予め正規化されていることを前提に計算が省略されている
場合に正規化しておく必要がある。
ベクトルの内積からcosを求める式のうち、分母の部分は正規化されていれば
必ず1になるから省略できて内積=cosになる。
法線は入力データの段階で正規化されているのが普通なので、この省略された
計算式で実行時の負荷を軽くするのが普通。
>>680 拡大縮小は頂点シェーダでやるんだから、頂点シェーダの入力は
拡大されてるわけないだろw
質問です pDevice->SetMaterialで与えられたアンビエント色やスペキュラー色を HLSL側で受け取るにはどういうふうに書けばいいのでしょうか?
SetMaterialを使わずにシェーダ定数で渡す
あら、シェーダ定数使うしかないんですか
上の方(
>>577 あたり)でうまく固定側からテクスチャ情報とかはもってこられるみたいなので
似た感じでいけるかと思ったのですが残念
HLSL内でシェーダー定数を固定機能にSetMaterialして、 頂点シェーダーではなく固定機能を呼び出すように指定すれば レンダリングの流れはシェーダーの有無に関係なく一本化できる。
そうなるとエフェクトファイルの範疇になるけどね。
スプライト描画で24ビットのビットマップファイルを描画してるんですが これを描画処理の実行時にグレイスケールで描画することはできますでしょうか
ピクセルシェーダ使えるならどうとでも。 固定機能ならテクスチャに高度抽出の係数入れて 合成演算にDOT3とか。他に方法あったっけ。
いやん。高度>輝度
きど
固定シェーダのやってることを理解しようと思って、HLSLで下記を書いてみたのですが どうしても固定シェーダの見え方と一致しません どこが間違ってるかわかりますでしょうか? スペキュラーはFALSEにしてあります。 まず、グローバル変数はこう設定されています。 I_a == D3DLIGHT9.Ambient; I_d == D3DLIGHT9.Diffuse; MaterialAmbient == D3DMATERIAL9.Ambient; MaterialDiffuse == D3DMATERIAL9.Diffuse VSは下の通りです。ライトはローカル座標系にしてあります VS_OUTPUT VS( float4 Pos : POSITION, float3 Normal : NORMAL0, float2 Tex : TEXCOORD0 ) { VS_OUTPUT Out = (VS_OUTPUT)0; Out.Pos = mul(Pos, mWVP); Out.Color = I_a * MaterialAmbient + I_d * MaterialDiffuse * max(0.0f, dot(Normal, LightDir)); Out.Tex = Tex; return Out; }
すいません。すごい速さで自己解決しました D3DRS_DIFFUSEMATERIALSOURCE などの設定がマテリアル指定になっていませんでした。 固定シェーダのライティングまわりの必要設定、サンプル系サイトからひっぱってくると D3DRS_DIFFUSEMATERIALSOURCEとか設定していないですね・・・ マニアック設定なのかなんなのか・・ MeshView(SDKについてくるXファイル閲覧ツール)でも設定はデフォのD3DMCS_COLOR1を見るみたいですね
正直固定機能の勉強をしても仕方ないと思うけどね。
DirectX10では完全に存在が抹消されているし、
今後も復活することはまずないだろうし・・・。
シェーダー関係は他の環境でも役に立つけど固定機能は・・・
>>689 DOT3はハードを選ぶよ
>>694 VS、PS使えない環境では必要!!
って言いたいところだが、VSはソフトウェア設定でやりゃそこそこの速さで動くんだよな。
PSはハードじゃないとどうにもならないがw
仕方ないってことはないと思うが。 固定機能にある機能のほとんどは、3DCGの基本そのものだし。 それを1つずつ自分でシェーダ書いてみるってのは、学習の仕方としては 理想的な方法だろう。
俺も気になって今ぐぐってみたが D3DRS_DIFFUSEMATERIALSOURCE でひっかかるページの少ないことw マテリアル使うようなところまでやってるなら、シェーダはプログラマブルだろう! って感じなのかね?
皆さんATiのR2VBという機能は知っていましたか? これを使えば俺のRadeon9600も、もう少し先にいけるかもしれねェ・・
>>698 そんなの使うより、ビデオカード買い換えてVTF使った方が…
9600つながりでGeForce9600GTがいいだろう。
>>699 VTFはATIのカードだとHD2000系からじゃないとサポートしてないぞ。
NVIDIAだとGF6からサポートしてるんだけどねぇ。
スマソ、9600ってGFの変なヤツの方か・・・
>>698 R2VBはATI的にはプッシュしたかったんだろうけど、
DirectX10ではStreamOutという名前で対応する全ハードウェアで利用できる。
古いの使いたがる人にDX10を勧めるのは嫌がらせか
R2VBなんてDX10以上にレアだろw
705 :
デフォルトの名無しさん :2008/03/24(月) 15:13:55
DirectX9で質問があります 3D空間にz比較を行いながら一定幅の線を引く方法について質問があります SetTransform(D3DTS_VIEW, SetTransform( D3DTS_PROJECTION, でビューマトリクスと射影マトリクスを設定して D3DXLINEのDrawTransformで設定するマトリクスに位置などに相当するマトリクスを設定してみたのですが、 ビューマトリクスと射影マトリクスが有効になりません、何か他に設定する箇所とかあるのでしょうか?
>>705 普通のモデルの表示はできてるの?
それと変わらないと思うんだけど・・・>設定
D3DXLINEは使ったことないから適当に言うが、たぶん描画するときに 行列初期化されてるだろう。 1つの行列にまとめてからDrawTransformに渡したらできないかな?
708 :
705 :2008/03/25(火) 03:22:51
>>706 普通のモデルは表示できています
>>707 ビュー射影マトリクスを位置マトリクスに掛けてDrawTransformに送ってみた所想定してる位置へ表示されました
D3DXLINEだと、SetTransform(D3DTS_VIEW等の影響が無いと言うことなのでしょうか?
単位マトリクスを
SetTransform(D3DTS_VIEW,
SetTransform( D3DTS_PROJECTION,
に設定しても同様でした
表示はできたのですが、zバッファの処理が行われていません
ビューの設定等が無効になってる影響なのでしょうか?D3DXLINEをググっても使ってる人自体が殆ど居ないのですが、
3D空間に線を引く処理は他で代替できたりするのでしょうか?
>>708 普通、DrawPrimitiveのD3DPT_LINESTRIPを使ったりする
すみません、質問です。 昔作ったゲームがDirectX9.0bで出来ていまして、再開発のため環境を同じにしたいのですが、DirectX 9.0b SDKって今ダウンロード出来ますかね? Microsoftのダウンロードページがリンク切れになっているみたいで・・。 やはりむりなんでしょうか?
>>710 まだダウンできるみたいだけど?
日本語サイトからじゃなくて英語サイトのダウンロードセンターからダウンすればよろし
質問です。 メタセコイアで書き出したXファイルのみアルファブレンドが適応されません・・・。 描画直前でマテリアルの値を直接指定してもなぜかメタセコイアで書き出したXファイルのみアルファがかかりません。 アドバイスお願いします・・・。
>>712 いっそ9.0cか10で手直しするか一から作り直したら?
趣味でやってるなら、古い規格にしがみついててもいい事無いよ。
SetRenderStateで、α値の参照を何にしてる?
Xファイルのやつはマテリアルにα値を持ってるんじゃない?
それ以外は頂点カラーにα値を持ってるんじゃない?
それで、α値の参照を(大抵のサンプルサイト同様)頂点カラーとテクスチャーからの乗算にしてると見た
参考になるのは
>>693
>712 正規のOS使ってるなら普通に落とせるだろ
717 :
102 :2008/03/26(水) 09:56:39
夜にクリックした時はリンク切れてたけど、今は繋がるね
718 :
612 :2008/03/26(水) 22:24:27
ジョイパッドからの入力をバッファで取得しているんですが POVで十字キーの入力を判定する時 DIDEVICEOBJECTDATA構造体のdwDataメンバにセットされるデータから どの方向キーが押されたかを判断することはできますが、離された時は常に-1しか 帰ってこないので判定がうまくできませんでした。この部分って既存のソフトたちは どうしているんでしょう?何かの方法で離されたキーを得られるのか それとも-1が来た時は十字キー全てを離した事にするのか
前の名前がついたまま・・・
まぁいいじゃまいか
DIJOYSTATEしか使ったこと無いからよくわからんけど… ヘルプにこんなことが書いてあったぞ↓ rgdwPOV 視点ハットなどの方向コントローラ。この位置は、北から (ユーザーの正面側) 時計回りの実角度の 100 倍で表される。中心位置は通常 ?1 と報告されるが、 「注意」を参照すること。5 つの位置しか持たないインジケータの場合、コントローラの 値は ?1、0、9,000、18,000、または 27,000 のいずれか 1 つの値をとる。 POV インジケータの中心位置を 65,535 と報告するドライバもある。 POV インジケータが中心位置にあるかどうかは、次のようにして確認する。 BOOL POVCentered = (LOWORD(dwPOV) == 0xFFFF);
文字化けしてる ?1 は -1
723 :
612 :2008/03/27(木) 08:50:12
ありがとうございます。となると、やはりDIJOYSTATEも組み合わせるしかなさそうですね。
なんでDIJOYSTATE? POVがセンタの時は-1の値をとるってだけだろ
何が問題なのかわからない俺
726 :
710 :2008/03/27(木) 22:26:17
>>716 >>717 あ、ほんとです。今ダウンロード出来ました。
お騒がせしましたm(_ _)m
>>714 ごもっともです。
再開発といっても画像表示の大きさを変えるくらいで、今回はコンパイルできるだけで良かったのですが。
やっぱ次のは10覚えて出直しますか。。
>>709 ありがとうございます。
問題なく実装することができました。
ダイレクトサウンドバッファで短い効果音を頻繁にStop()Play()としてるとたまに 0バイト目にポジションをあわせてるのに途中から再生されているように聞こえるんですが、 これはどういった現象がおきているんでしょうか?また、解決方法はありますでしょうか?
>>728 プライマリバッファに残ってるサウンドが再生されてしまう
無音のサウンドを無限ループで再生させておくと楽
730 :
612 :2008/03/28(金) 19:13:35
なるほど。でもプライマリバッファって実体あるんですか?なんか無いって書いてあった気が・・・
無音のデータを読み込んで、最初に無限ループで再生してみましたが やはり、音が中途半端でした。そういうことではないんですか?
732 :
デフォルトの名無しさん :2008/03/29(土) 01:43:55
DirectX9.0c SDKを使ってますが D3DXMATRIXA16 から D3DXVECTOR3 を算出する機能はありますか? XNAでいうところの Vector3.Transform に相当するものです
D3DXVec3Transform系
>>733 アリガトウゴザイマス、
D3DXVECTOR3TRANSFORMで探してました
通りでないわけです
C#+XNAから転向してきたものですが、
同じ機能探すのに地味に苦労するでつ
原点を中心にした球の表面上にまばらにポイントスプライトを位置させたいのですが、 x、y、zそれぞれの軸でランダムに回転させた行列を合成して行うと、密度に偏りが出てしまいます。 何か良い方法はないでしょうか??
D3DXMATRIXA16 から D3DXVECTOR3 を算出できるなら その逆もできますか先生?
無理じゃね?ベクトルから行列を導くってことでそ
739 :
デフォルトの名無しさん :2008/03/29(土) 12:27:30
部品が揃えば可能
不可能
いや、この質問のみなら不可能って回答であってるだろw 739のほうがベターだとはおもうけど
>736 D3DXVECTOR3 v; v.z = 2.0f * rand()/RAND_MAX - 1.0f; FLOAT r = 1.0f - v.z * v.z; FLOAT a = 2*D3DX_PI * rand()/RAND_MAX; r = sqrtf( r ); v.x = r * cosf( a ); v.y = r * sinf( a ); これでランダム単位ベクトルになるから、 好きな長さに拡縮するといいわよ。
744 :
736 :2008/03/29(土) 15:19:27
>>743 できました!
ありがとうございました!
この計算の仕方を解説したサイトや本ってありますか??
とても興味深いです!
見事の偏ってるなw XYZに成分分けしてランダムを行なってる時点でダメだと思うが
結局「極」になる部分に星が固まるよな?
>>743 でも。
748 :
736 :2008/03/29(土) 15:54:55
少なくとも、各軸でランダム回転させる行列をかけあわせるよりは遥かにまばらになってますよ。
>>749 でも、結局それでも上下(輪切りにされた皮の上下端)にかたまっちゃうよな
素直に四元数使ったほうがいいんじゃね?
だれか731お願いします
>>749 >スイカを等間隔に輪切りにすると、それぞれの皮の面積は同じになるのね。
ならんならん。
なるなる。
>>752 前提ちゃんと読んでやれ。
限りなく細ければほぼ一緒になると
ただ、無視できるほど細くはならなさそうだけどな
積分の授業はここですか
>>754 胴周りの輪の面積:極付近の輪の面積は、限りなく細くすると無限:1に近づくぞ。
簡単な積分だから計算してみれ。
一様分布な乱数を生成する関数があればいいの?
>>756 比率じゃなくて差を取れば0に近づく。
まあ見解の相違だね。
馬鹿でもわかるようにおしえてくれませんか
760 :
736 :2008/03/29(土) 17:55:17
それは輪切りじゃなくて、放射状に切っているんじゃないのか? 輪切りだと、中心では2πr*wだが両端ではπw^2になるぞ。
SHADEの神の人が教えてくれた技 最初は均等に配置する それをランダムに移動する これで解決 まさにSHADEの神
10と11だと1も差があるけど、1.1と1.0だと0.1しか差がない ってことなのね
解像度800*600でウインドウモード400*400の画面を作って そのあとに画面のサイズを変更したいのですが、 SetWindowPosで画面のサイズを変えて g_d3dpp.BackBufferWidth = x;//変更するxy代入 g_d3dpp.BackBufferHeight = y; g_lpD3DDEV->Reset(&g_d3dpp);でリセットしてここまではエラーは 出ないのですが g_lpD3DDEV->GetRenderTarget(&pBackbuffer)で強制終了してしまいます。 Resetでバックバッファをリセットしてると思いますが、 その後pBackbufferが使えなくなるようです。Reset後にバックバッファ を使えるようにするにはどうすれば良いでしょうか? それか根本的な他の間違いがありますか?
765 :
デフォルトの名無しさん :2008/03/30(日) 02:44:28
すんません。教えてください。 D3DPT_TRIANGLESTRIPで四角形のポリゴン作って、それにテクスチャを張った。 そうすると、テクスチャが中央当たりで斜めにずれて見えてしまいます。 よくよく見てみると、四角形ポリゴン作るときの三角形の境界でずれてるみたいなんです。 描画するときの座標もuvも確認したけど問題なさそう。 ずらさずに表示したいんですけど、どうすればいいんでしょう。
>>765 4頂点を演算して求めると誤差が出る可能性はあるけど
そういう現象は起きたことないから、正常に動作するサンプルを
ヒントにしたほうが解決早そう。
一枚の四角ポリゴンでは問題出たことないんだけど 複数の四角ポリゴンで床をタイル敷き詰めしたら繋ぎ目が 見えて困ったことがありますよ。数値を調整して やっつけ仕事で片付けましたが。 テクスチャを上手く貼るのって簡単なようで案外難しいような・・・。
もしかして2Dでやってるならrhwを1.fにしないとダメ
あと描画座標を-0.5fしないとだめ
ID3DXANIMATIONCONTROLLERを利用してXファイルのロードから単一アニメーションの再生まではなんとか漕ぎ着けたのですが、 人体モデルをアニメーションさせるとして、例えば歩行アニメーションをしながら、顔の向きだけ任意の方向を向くようにするにはどうしたらよいのでしょうか? 正面を向いたまま歩行するモーションと、直立したまま顔が上下左右を向くモーションを作り、 これをSetTrackEnableやSetTrackWeightを使って合成して再生するという感じでよいのでしょうか? もしくは、顔が含まれるボーンだけ顔が上下左右向くモーションを再生しつつ、それ以外のボーンでは歩行モーションを再生するという考え方でよいのでしょうか? またこの手の手法の呼び名は何というのでしょうか?
とりあえず君が問題ないとか思ってる糞ソースを公開しなさい その方が早い
実行結果も貼るぁ! ずれてるってのが パースペクティブコレクトとか アドレッシングモードのことを想像させるが 単に座標の設定間違ってるだけかもしれんし 正直、何がどうなってるのかよくわからん
ゲーム的に使うならボーンの階層は全てのモデルで決めうちで作っておいて、 胸、首、頭のボーンを直接拾ってきてプログラム的に任意の方向に向けるという方法のほうが便利
776 :
デフォルトの名無しさん :2008/03/30(日) 15:23:10
765です。
ソース公開しました。
ttp://www.hsjp.net/upload/ up14498.zipってのがそうです。
解凍すると、parm.bmpという絵があるのですが、
それの表示結果が同フォルダ内のexec.bmpです。
左下から右上にかけてななめにずれてしまいます。
778 :
デフォルトの名無しさん :2008/03/30(日) 17:37:49
765です。 rhwを1.0にして描画座標をスクリーン座標にするか、 描画座標を0.1みたいなきりのいい数字にするとうまくいくみたいです。 描画座標はスクリーン座標→ワールド座標に変換してるので結構半端な数字になるんですよね。 それだとうまくいかないみたい。 FLOATの丸めで変な数字になっているのかな。
三角形の頂点を結ぶ方向も関係あるとか聞いたことがあるな
>>777 ポジションを先頭に持ってく関数はないんですか?
>>780 ポジションというのはプライマリバッファのですか?
セカンダリだろ。 自分でシークしないと先頭位置には戻らないんじゃなかったか?
>>782 再生時にはSetCurrentPosition(0)を必ず呼び出してから再生してます。
再生直前にボリューム0%にして 再生直後にボリューム100%にしてみたら? ついでにセカンダリをLOCALSOFTWAREフラグで生成。
785 :
デフォルトの名無しさん :2008/03/31(月) 00:20:35
質問させて頂きます、 HLSLのtex2Dprojとかtex2Dとかでテクスチャの範囲外を指定したときって、 返ってくる値は黒で固定なんでしょうか? これを白にすることはできないのでしょうか。
基点と終点のVECTOR3があったとして 基点から終点を見たときのXYZ軸の角度を取得するのは どうすればいいでしょうか?
すみません勘違いしてました、785は無視してくださいorz
>>786 XYZ軸の角度ってのはXYZ軸をそれぞれ中心とする回転の角度???
だとすると
基点がA(Xa, Ya, Za)、終点がB(Xb, Yb, Zb)だとすると
X軸中心の回転角度を取るにはYZ平面に2つのベクトルを投影して
その2つの間の角度を取ると考えれ。
つまり(0, Ya, Za)と(0, Yb, Zb)の内積を出して、それの逆余弦を取る。
別にYとZの2次元ベクトルでやってもいいけど。
(内積→逆余弦の意味はわかるよね?)
>>788 三角関数でそれぞれの軸の角度は算出できるのですが
DirectX的にそういうマクロとか関数があるのかと思って
質問した所存であります
ありがとうございまつた
>>784 目から鱗です!ちゃんと再生できました。家のハードがダメということでしょうか?
なぜなのか分からない・・・ちなみに音量はコメントアウトしても大丈夫でした。
それと関係ないですがウィンドウを一回最小化してからまた呼び出すと
タスクマネージャーのメモリ使用量が10メガから3メガに減ります。
これって監視がうまくできてないだけなんでしょうか?リークじゃないですよね・・・?
>>790 基本的にサウンドのハードウェア処理は信用に値しない。
グラフィックのように眼に見えて比較されるわけでもなし、
DirectSoundなんて適当でいいっすよ。ってところだろう。
結局スピーカー次第ですよね、というオチもあるし。
音ゲー製作をしています。 PCによって再生開始時の個体差があるためか、どうしても音楽と画面とのずれが出てしまうのですが、何か良い方法はないでしょうか? なお、音楽再生にはDirectShowを使用していますが、他のライブラリに変更も可能です。 2倍速再生などが簡単にできるという理由でDirectShowを選んだのですが・・。 少し抽象的な質問な上、DirectShowはもはやDirectXではない(笑)ですが、音ゲーにとって致命的な問題に突き当たってしまったもので・・ よろしくお願いします。
個体差があるのはDirectShowだからとかじゃなくて? あれ別スレッドに投げて再生してるから遅延があるんだと思ってたけど。
あーあれ別スレッドだったんですか、、すみません無知で・・。 ということは、DirectMusicなどを使えばいいんでしょうか?
なぜそこでDirectMusicなんだ・・・DirectSound使え
DirectAudioじゃないのか?w
>> 795 あーすみません。昔読んだ本に音楽はDirectMusic、サウンドはDirectSoundを使うとの記述があったような気がしていたので・・。 たぶん、DirectSoundでストリーミング再生すればよいのですね。 助かりました。ありがとうございました。 >> 796 今はSoundとMusicが統合されてAudioになっているみたいですね。 将来的にはXBoxとライブラリを統合するだとかなんだとか、いつの間にかややこしいことになっていましたw
3Dのバンプマップについて質問なのです とりあえずテクスチャーステージを2つ使って「通常のテクスチャー」「法線情報テクスチャー」を使いバンプを行なっています で、気づいたのですが、私の作ってるゲームはディレクションライトの方向が固定です。 その場合「通常テクスチャー(ライティングを考慮して影をつけたもの)」をライティング計算済みポリゴンに適応すればまったく同じ結果が得られるような気がします。 この認識は正しいでしょうか? ・ライト方向の変化ができない ・スペキュラー反射を適用できない ・テクスチャーを一定方向でしか貼れない(影方向に矛盾がでてしまうので) とは思っていますが、広い土のフィールドを表現するには十分かなと思うのですが
あ、あと光の強さも変えられませんね。
>>798 地形のように、光源との位置関係がまったく変化しないのならば問題ない。
801 :
デフォルトの名無しさん :2008/03/31(月) 20:06:21
DirectInputで byte keys[256]; Device->GetDeviceState(sizeof(keys),&keys); でキーの状態を取得したあと if(keys[DIK_LEFT] & 0x80) とかでキーの判定をするコードを良く見ますが & 0x80 が何を表してるかわからんです if(keys[DIK_LEFT]) でも期待通りの挙動をするんでなおさら意味不明です & 0x80 が何なのかおしえてください
意味も何も、そういう仕様で作られているから、としか言いようがない。 最上位ビット以外が何か別の目的で使われる可能性もあるから、 一応マスクはしておいたほうがいいんじゃないかな。
>>804 pBackBufferってReset後に再取得してる?
前から保持してる奴ならResetかけた瞬間に死んでるから駄目じゃね?
って使ってんじゃなくて取得してんのか?w
>>805 はスルーしてくれ
スマンコ
>>806 再取得はどうやるんですか?ヒントだけでもお願いします。
>>807 そのレスは間違いだ
ところで
HRESULT GetRenderTarget(
DWORD RenderTargetIndex,
IDirect3DSurface9 **ppRenderTarget
);
単に引数の設定が間違ってるだけじゃね?
とかもうなんでもテキトーに言ってみるテスト
質問です、 128×128のARGB(255, 132, 130, 66)で塗り潰したBMPを用意しました(@) また、CreateTextureしLockRectしてARGB(255, 132, 130, 66)で塗り潰したテクスチャを用意しました(A) 前者と後者を同じ関数(ID3DXSprite::Draw)で塗り潰したのですが、何故かほんの少しだけ色味が違います。 これは何故なのでしょうか?
訂正、塗り潰したではなく表示したです。
>>801 はビットマスクとか知らない人なんじゃないかと予想
VS2008の後DirectX9SDK入れても新規プロジェクトにDirectXウィザードがないんですけどどうなってるんですか?
長く標準的に使われるものと、打ち捨てられ廃止されるものを見抜くスキルもなくては Microsoft製品を使っていられない
ちょwこの入門書オワタwww
>>810 それぞれのテクスチャの格納先は24ビット以上?
そして表示先も24ビット以上?
>815 確認してみると画面モードは16ビットになっていました(デバッグ時にテストの為に変更していたのを忘れていました) また、画像フォーマットはAはA8R8G8B、@はUNKNOWNだったので@をA8R8G8B8に修正しました。 ですが、それでもほんの少しだけ色味が違います。パラメータは同じなのですが………。
訂正です、@とAの画像フォーマットは逆でした。 そして、ほんの少し色味が違うとレスしましたが、 ふとビットマップのRGBを確認したところ16ビット→32ビットに解像度を変化させた為か、 RGB(128,128,64)となっており、Aの塗り潰す色を変えたところ色味が同じになりました! ありがとうございます、助かりました。
819 :
デフォルトの名無しさん :2008/04/02(水) 00:16:36
シェーダのことで質問なんですが 頂点シェーダからピクセルシェーダに渡すfloat4の位置というのは 射影変換後のx=-1〜1, y=-1〜1, z=?, w=z?の位置で ラスタライザでx, y, z, wがwで除算されて ピクセルシェーダに渡される、という認識で合っているんでしょうか? 射影変換後のzとwってどうなっているんでしょう z=0, w=1じゃだめなんでしょうか?
近頃のロボゲーで出てる3Dで直線状の、 透明感のあるレーザーを表現するにはどうしたらよいですか? バーチャロン1とか3D初期のころのゲームは 円柱をスケーリングしてるだけみたいでしたが 近頃のはビルボードでやってるんだかなんだか知りませんが 透明感があるけど芯の部分は色が濃くなってボリューム感があったりします 半透明の円柱を伸ばしてみてもイマイチな質感しか得られません
ポリライン
シェーダの使用前提にできるなら、 円柱にピクセルシェーダでグローかけるとよりボリューム感出せるね
823 :
819 :2008/04/02(水) 04:10:13
解決しました みなさんありがとうございました
VC++のヘルプとDirectXの日本語ヘルプを一つにしてF1キーで両方から探すよう設定することはできますか?
なんかうちのCreateTextureFromFileExしょっちゅうしくじるんだけど みんなのところもそうなのかなぁ・・・
自分の環境ではしくじらないですよ? 根本的なとこにミスがあるのでは?
>>825 その決して自分を疑わな(ry ry)かすべきでは?
「自分より中の人の方が頭がいい」が基本
>>826-828 う・・・分かっていても相手を疑いたくなる俺はクソグラマ・・・
マルチスレッドは関係ないよね?関数自体は常に専用のスレッドから呼ばれるし、
返り値が0x88760827なんだけどこれって引数おかしい!だっけ?
今調べてみたら Createxxx 呼び出しから D3DERR_DRIVERINTERNALERROR が返された場合、それは致命的エラーとは見なされない。 ドライバは、このエラーを D3DERR_UNSUPPORTED または D3DERR_OUTOFMEMORY エラーと同様に扱う。 とのこと、 ・・・・・どうしろってんだ。 このエラーで失敗した場合は成功するまで何回もチャレンジすればいいのかなぁ・・・
とりあえず、そういう風に作ったら、マルチスレッドでも動くようになりました。2回くらい連続で失敗したりもしてたので マルチだとタイミングによって具合が悪くなるのかも?
GPUが落ちかけてるか(電源容量不足) 熱で飛びかけてる(廃熱不足)
>>832 ?それは上に対してのレスですか?どういうことでしょう?
メモリー壊れてねーか? memtest走らせてみ 俺も昔、外的要因に左右されないプログラムなのに起動すると時々結果が違うってことがあって 調べたらメモリーがイカれてた。
>>833 CREATEを試みたが何かハード的なエラーが検出されたため
GPUが処理を中止させたのかなと
>>834 マルチスレッドの時しか起こらないんだけど、メモリー壊れてるのか・・・?
今再現コード作ってみるから試してみれ
しかとかよ まあいいけどね
>>837 すまん。
何言ってんのかよく分からなかったから再現コードでやってもらおうと思ったんだが、再現できん
相性問題ってやつも絡んでくるのだろうか・・・
は?824だよ聞くだけよっていってんだよ
あなたは
>>824 で? 「聞くだけよん(はあと」? ……って言ってんだよ???
ばかじゃん
>>843 「DirectInputDevice8作成に失敗」ってのが出るが実行・操作はできた
最初27回目まで出たけど、その後は3回ぐらいやってもスラッシュが増えるだけだった
操作は移動とジャンプだけか?
×「DirectInputDevice8作成に失敗」 ○「DirectInputDevice8オブジェクトの作成に失敗」
0回目:88760827 1回目:88760827 2回目:88760827 ・・・ 99回目:88760827 @loadImage(Image\kurew_000.bmp)imgerr=88760827 イメージファイル読み込み失敗ってエラーも出るし、なんか根本的に駄目だな この規模だったらまだなんも恥ずかしいことないから、ソース晒してみたらどうかね
たまに「0回目:88760827」が出るな DirectInputのエラーは毎回出るが普通に動く。
DirectInputの方はジョイパッドが刺さって無くても出るようになってました。多分そのせいでしょう。
>>844 操作はそんなもんです。強いて言うなら左右早押しでダッシュくらいです。
しかしこの結果にはショックを隠しきれない。ソース類27個あるけど見てくれますか?
基本的なこと聞くが、D3Dのデバッグランタイムはなんも言ってこんのか。
>>850 んーとな、、SDKユーティリティのDirectX Control PanelでRuntimeをDebugに選択、
Debug Output Levelを最大に設定。あとはVC++上でデバッグ実行しつつ出力ウィンドウに注目。
Direct3D APIがエラーコードを返してくるような時には、まともな詳細メッセージが期待できる。
BCCだけどなんとかできた。そして、おまいら知ってたか、マルチスレッドでやる時はな・・・ D3DCREATE_MULTITHREADEDって言うフラグを指定すればいいんだと! あばよ!!
そんなもん指定したことないけど、まともに動いてるよ俺の。 ところで基本中の基本だが、Direct3Dの初期化と利用は同一スレッドだけに限ってるだろうな? WinMainスレッドでD3Dを作成し、_beginthreadしたスレッドで利用とか勘弁だぞ。 一見まともに動くが、デバイスリセットは必ず失敗するわ、その際のエラーは「引数が異常」だわ、ほんと地雷だわ
854 :
853 :2008/04/03(木) 00:05:18
あ、わかった。 テクスチャーの読み込みを別スレッドでやってるだろ?
_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>852 マルチスレッドでやる時はな・・・D3DCREATE_MULTITHRE痛ッ
>>854 じゃあ、作成したスレッドでゲーム動かしてMainスレッドで画像取得と貸した方がいいのかな・・・
みんなはどうやってるんだろう。
あ?何叩いてんのさ。いてーだろ
_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>855
_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>856 _, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>856 _, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>856 _, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>856 _, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>856
次の話題お願いします
_, ,_ ,, パシッ ( ‘д‘) ノn ヽ(-_ - ) _, ,_ ∩(* ( )∩ ん… + + + ( `Д´) ハァハァ + ( つ _, ,_ + ),ィ⌒(;‘д‘) ああっ… + (_(__人__,つ 、つ
どーでもいいが これマルチスレッドにする必要ねーだろ スライスぐらい自己管理しろよ
>>856 画像取得が、画像のロードだとするなら、それは別スレッドでやっちゃいかんと…。
高性能CPUの時代にマルチスレッドとか旧時代の遺物だろ 処理の流れが複雑で予測できなくなるだけで百害あって一利なし
マルチコアやPS3Cell時代に何をいうてますのん?
つまりどういうこと?
つまりD3DCREATE_MULTITHREADEDをお忘れなくということ
>>863 処理の流れが予測できる部分で使えよ。
画像の読み込みとか。
マルチスレッドっていってもCPUたかが2つだろ? ゲーム画面とチャットウィンドウでも気持ちよくだしてもらおうとか 思ったらなにもしないほうがいいんでない?
何もしないほうがいいかどうかはゲームデザイン次第。 少なくともCPUが二つあるなら二つを効果的に使うほうが早い。 使えるかどうかは本人の技量次第。
CPUが二つあることを前提にしてプログラムを組むと 汎用性がなくなって、ハード制限が厳しくなるんだよな まあオプションで細かく設定させるようにすればいいわけだけど 結局別パターンの処理を用意しないといけないし、 ユーザー側にもそれなりの知識が要求される
>>870 CPU2つ使っちゃったらチャットウィンドウだせないじゃん
ヘルプも読みにくいし勝手なことすんなよって感じじゃね?
フルスクリーンのFPSとかそんなのしか使い道なさげじゃん?
共存せなあかんよ。共存。
何このアホなやりとり
>>871 二つあることを前提にしてもWindowsで作ってるならシングルコアPCでもそのまま動くだろ・・・。
>>872 じゃあシングルコアのPCでゲーム起動したら他は何もできなくなるのか?
MS−DOSの話は誰もしてないぞ?
うわ、まるでスレッドの数だけCPUを占拠して他のプロセスが動かなくなるとでも思っているかのようだ。
そりゃ実行中には占拠するだろ。 CPU二つなら同時実行できるけどそうでなければマルチの意味がないし。
>>871 CPUは1つでもマルチタスクを処理できます。
ですが、シングルスレッドで動いてるアプリをマルチコアで高速化はできません。
マルチスレッドにするとマルチコアCPUで高速化できます。
当然、シングルコアでもマトモに動くように開発を進めるでしょう。
まあ、マルチスレッドで組まれたプログラムは通常はシングルだと重くなるんだけどね マルチコアだからこそ意味があるのがマルチスレッド処理なわけで
他アプリとの同時実行を考えると、 1アプリで無駄にCPUをこき使うのはあまり好ましくないですね。
なんだかこのスレ読んでると単純なワーカースレッドまで全否定してるみたいで恐ろしくなる
CPUの割り当てはプロセス毎にユーザー側で設定可能で全く問題ないはずなんだが
そんな知識のあるユーザーがどれだけいるのかと
何スレッドに分けるか可変にして、CPUの数見て分ければいいだけやん
なんだか、判っていない連中が多いようだ。 CPUをこき使うプロセスだとて、実際にはOSなどの優先順位の高いプロセスにCPU時間を譲ることになるわけなんだが。
ファイルの裏読みとかシングルコアのPCつかっててもやるだろjk シングルコアだと総合的な速度は低下する可能性はあるが、 今後はマルチコアが主流になっていくんだし、 応答性をあげるためにはマルチスレッド化が必須な場合もある。
そろそろDirectXの話に戻ろうぜ
マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳 マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳マルチスレッド遣わない奴は低脳
じゃあちょっとDirectXと絡めて。 上でも出たように、マルチスレッドの場合はD3DCREATE_MULTITHREADEDを指定する必要がある。 ローディング画面(←アニメーションつき)でのテクスチャーの読み込み程度でしか使うつもりがない場合、全般的に性能が(どの程度かは不明だが)低下するこのオプションは指定したくないだろう。 どのように解決する?
画像のロードは別スレッドにて自前で行い、 テクスチャのロックだけDirect3D用のスレッドで行う。
マルチスレッド使わない奴は低脳
きめえw
とある行列を、Y軸回転成分、Z軸回転成分、X軸回転成分にわけることはできるでしょうか? つまり D3DXMatrixRotationYawPitchRoll の逆をやりたいのですが
>>892 何が言いたいのかよくわからんが
行列(D3DXMATRIX)のメンバはそれぞれ
_11,_12,_13 X軸の方向ベクトル
_21,_22,_23 Y軸の方向ベクトル
_31,_32,_33 Z軸の方向ベクトル
_41,_42,_43 位置座標
を意味してるんだぜ?
物体がどっち向いてるかなんて1発でわかると思うんだが
俺も知らんかった・・・ D3DXの便利関数に慣れすぎると基本がおろそかになるってのは本当だな… そういう基礎中の基礎を教えてくれるお勧めページないか?
昔からDXのヘルプに書いてあるだろうに いったいどの次元の人達なんだよ
DXのヘルプを熱心に読んでから入る人なんてほとんどいねーだろ 俺はどこで知ったんだったかなー
ちなみにDirectXのヘルプにんなことは書かれてないよw
ヘルプはたまに関数リファレンス調べるくらいだなぁ 俺はマルペケつくろーどっとコムで知った
>>900 昔ざっとヘルプ見回したことあるけど、そんなもん見たことないぞ
俺もなんとなーく知ってたが
他人を馬鹿にして悦に浸るのにこのスレはふさわしくないだろ
俺の見落としだったら謝るから、URLでもはっつけてやれ
>>901 >>893 のように学校の生徒に教えるような書き方じゃないよ
URLって言われてもヘルプにURLなんてないんじゃないの?
4×4のマトリクスについて説明してるところだよ
x'=(m11*x)+(m21*y)+(m31*z)+(m41*1) とか書いてあるところ
これ見て考えればわかるじゃん
ここはゲ製板じゃないから読み取れるものとして書き込んたんだが
やっぱり初心者スレだからスレ違いか
>>902 ありがとうございます。
とても分かりやすいですし、他のコラムも面白そうなので一通り読んでみます。
>>903 痛すぎる。
MSDNオンラインも知らないお前が初心者を脱却してるとは思えん。
まぁまぁ。 下を見て自分の位置を確認するのは結構だけど たまには上のほうも向いてみようぜ。
このスレに求められるもの ・正確な情報 ・的確な回答 求められないもの ・相手は自分よりも劣っているという思い込み ・「ヘルプに書いてあったはず」といった、不確かな情報
>>907 求められないもの
・自分は間違ってないと主張したがる人
ヘルプに書いてあるし、MSDNオンラインなんてものはありません!!
とりあず、基本に戻って >1を10回読み直してみるのはどうだろう?
というかマトリクスの中身を見続けてれば自然に発見できるもんじゃね? 要素が各軸の方向ベクトル示してるのなんて
ここは行列初心者のスレではありませんよ?
別に教えたくない人はスルーすればいいんだから、喧嘩すんなよ
914 :
デフォルトの名無しさん :2008/04/04(金) 22:13:51
ひょっとして荒れてる? Vector4 の W が何を表してるかわからないのでおしえてください
>>893 本当にそうなってるっけ?
XYZ3つのベクトルと位置座標からそれを作るときはよかったけど
マトリックスからベクトルに分解するときもそれでいけたっけ?
>>914 なんか同次座標とかいう奴
俺もよく知らないで使ってる
>>917 昔、散々ググッたけど見る説明見る説明尽く意味不明だった希ガス
なんか書き手もよくわかってないのが文面から透けて見える
>>919 悪い
意味がわかんない
何と比べてどういいの?ってのと
できれば(X、Y)から(X、Y、W)にしていいことってのを説明してほしい
128バイトになるからベクトル演算による高速化が行いやすいんだろう。
こういう一次変換を複数行いたい場合、 この変換行列の積を持っておきさえすれば、 一回の一次変換で変換できる。
同次座標がなんぞやとは説明出来ないが XYZのベクトルをW平面に射影したものだとイメージするとわかりやすい W=1の平面から観るXYZベクトルと W=100の平面から観るXYZベクトルは違ってみえるが 実際は同じものである、みたいな
まあ、その変換行列の積ってやつも下が0001だから 別に無理に保持する必要は無いんだがな。 同次ベクトルは数学的に優れたトリックではあるけど、 実用的には0とか1とかを実際にメモリ上に持っている必要は無い。
128バイト境界に揃う事で何か利点はありそうな気はする。
SIMD演算
>>893 41、42、43は使ってたけど
11〜33はワケワカランのでほっといたw
よくわからんがクォータニオンとか軸回転とはちがうんすか?
任意の方向を向いてる飛行機に”左に向け”っていう指示を出した時に クォータニオンなら直接処理できて、軸回転はややこしやってことじゃね?
932 :
914 :2008/04/05(土) 11:21:17
まだよくわからんです 結局Wって何なんでしょうか? Vector2 は XY 座標で2次元の座標を表し Vector3 は XYZ 座標で3次元の座標を表し Vector4 は XYZW で何を表すんでしょうか? というか主にどんなときに使うんですか?
だから w は並進を一次変換で表現するためのダミー変数だって言ってるじゃん。
グラボでどうやってるかは知らんが、 とりあえず CPU 側で計算する場合は SIMD 使えば 4 ワードになるから高速に計算できる。
まぁ計算しやすいからそうしてると思っとけばいいんじゃね
結局よくわからないんだよなw
マトリクスに座標値セットするときにWに1があらかじめはいってれば そのまんまコピーできる
普通のワールド変換だけで考えても ベクトルと4x4マトリックスの演算をするときに ベクトルが3要素しかない場合は移動が適用出来ない。 マトリックスの移動成分の計算を適用させるためにw=1.0という値が必要。 頂点シェーダーでもfloat3とfloat4x4のmulはエラーになるだろ。
普通に計算する分には 3x3 の部分をかけてから並進部分を足せばいいんだけどね。 だのに何で w をわざわざつける仕様になってるのかというところに疑問があるなじゃない?
普通に考えれば 1 とのかけ算をわざわざやる分計算量増えるんじゃないの? と思うだろう。 ベクトル演算で状況は変わるんだが、そこを説明しないとな。
確かに普通ならいちいち1.0をかけるのは計算の無駄と考えるな。 昨今のGPUのようなベクトル演算を行なう時の最適化については初心者スレの内容でもないきがするけど。
・平行移動つきの4x4行列を適用できる ・スクリーン変換に必要な割り算一回分を保留できる てのがメリットね。
計算量の問題なのか? 概念的にわかりやすいからそうしてるのか? そこがわからない
よくわからんけど 計算を早くしたいならV4 べつに早くなくてもいいならV3 ってことですか
同次座標って計算量が少なくなるってのが主旨なの?
>3x3 の部分をかけてから並進部分を足せば まあ固定画面ゲームならそれでもいいんじゃね?
x = vector3 dot vector4
ごめんミスった・・ x = vectorA.xyz dot vectorB.x.xyz + vectorB.x.w y = vectorA.xyz dot vectorB.y.xyz + vectorB.y.w z = vectorA.xyz dot vectorB.z.xyz + vectorB.z.w w = vectorA.xyz dot vectorB.w.xyz 1命令が1演算がFPU的にはこうするほうが速いんだけど x = vectorA.xyzw dot vectorB.x.xyzw ←ベクトルプロセッサだとこの計算が1命令1演算で出来る y = vectorA.xyzw dot vectorB.y.xyzw z = vectorA.xyzw dot vectorB.z.xyzw w = vectorA.xyzw dot vectorB.w.xyzw ようするにこういう事なんだが
つーかMMXとか自動的に使われるようになってんのかね
MMX は実は整数演算しかできない。 小数演算を担当しているのは SSE。 ただ、大量に変換するような場合は グラボ側で計算することも多いかと思う。
ねーよ
GPUで計算させるデータはCPU側に戻さないデータ。 CPUでやる計算はCPUで再利用するデータ。
グラボ側に置いとくデータを大量に変換することはあるんじゃね?
スタンバイモードから復帰したときにゲームの動作がやたら重くなる現象で 悩んでいたんだけどこれって Halo でも起きる現象なんですね。 >方法 4 : スタンバイまたはサスペンド モードの後にコンピュータを再起動する >スタンバイまたはサスペンド モードの後に、パフォーマンスが低下することがあります。 >ゲーム中に手動または自動でコンピュータをスタンバイまたはサスペンド モードにした >場合、コンピュータを復帰させ、ゲームを再開すると、パフォーマンスが低下することが >あります。音楽とサウンドが聞こえなくなったり、場面転換が途切れたり、ゲームが応答 >を停止 (ハング) したりする場合があります。この問題を解決するには、ゲームを再起動します。 天下のMS様も認めてる不具合なので仕様ということにしよう…。orz
そんなところまで面倒みようとしたらWindowsプログラマーなんてやってられないぜ
OSの再起動を要求してなこないだけマシじゃね? つーか、ゲーム起動したままスタンバイして、 戻ってこれるってのを「すごい」と思ってしまったw
根本的な原因はなんなんだろう
復帰後にデバイスが発見できないとかそんなんじゃね?
俺のゲームは100%オッケ なぜならスタンバイ復帰とかメッセージ拾ったら 一度ゲームを再起動させてるから (一瞬ちらつく程度)
>>959 テクスチャー読み込みとか早すぎだろJK
D3DPOOL_MANAGEDを使わず、自前で復帰処理かけるなら、そのやり方が一番いいよなー。
ウインドウのタイトルバーをドラッグしてウインドウを移動させると ゲームの音楽は流れたままですが処理や描画も停止しますよね? そうすると例えば音ゲーの場合は音ズレしちゃってマズいので、 ドラッグしても通常時と同じ様に動作してるようにしたいのですが、 そういうことってできるのでしょうか? もし可能ならば、ヒントでもいいのでアドバイスお願いします。
マルチスレッド フルスクリーン専用 タイトルバーを出さない
>>962 レスサンクスです。
マルチスレッド→要勉強
フルスクリーン専用→ウインドウモードでできねぇって苦情
タイトルバーを出さない→ドラッグできねぇって苦情
ってわけでマルチスレッド勉強してきます。
やり方としては、WM_MOVEメッセージが発行されたとき・・・
ってな感じのイメージだったんですが、マルチスレッドにすると
自動的にそう(
>>961 )なるのでしょうか?
タイトルバー出さなくても、自前でタイトルバーっぽいものを描いて ドラッグ処理を実装すればおkってことにならないかな・・・
>>964 マルチスレッド化するより遥かに面倒くさいと思うが
>>963 スレ違いだが、何かの縁なので。
ウインドウをドラッグ中に処理が進まなくなるのは、連続してWM_MOVEが発生しつづけるせいでそのメッセージ処理以外できなくなるから。
マルチスレッドはメッセージ処理とは関係なく、かつ並行で動作する。
メインスレッド(WinMainから始まるスレッド)はメッセージの処理だけやり、ゲームの処理は全てサブスレッド(CreateThreadしたスレッド)側でやるよろし
_beginthreadじゃね?
>>966 WM_MOVEが発生し続けるというのはちょっと違う。
ウィンドウの移動中やメニューを開いている間は、専用のメッセージループに
処理が移る。
簡易的な解決方法として、SetTimerでWM_TIMERメッセージを発生させて
そこからゲーム処理を呼ぶという方法がある。
そんなことするより、WM_ENTERSIZEMOVEが来たらポーズかけた方が
いいと思うけどね。
マルチスレッド化しないと結局ネットワークで通信するゲームで困る
>>964-969 遅くなりましたがレスサンクスです。
うーんそうなのか、だとするとDirectXじゃなくて
WindowsAPI関連の問題になってくるってことなのか。
DirectXで一杯一杯なのでマルチスレッドとなると難しそうですが
ドラッグされたときは音楽等と止める(ポーズ状態)ってのも
一つの手ですね・・・そちらまで頭が回らなかったw
とりあえず何とかアドバイス頂いた方法を参考にしつつ
ドラッグしても音ズレしないように一度試してみます。
最近のこのスレ見てて感じたんだけど やっぱマルチスレッドって必須の技術になりつつあるのな 昔挑戦したけどデッドロックが恐ろしくて放り投げたわww
相当に昔から必須の技術のはずでしたが
Windows2000の頃には必須技術だろ・・・
俺、通信部分だけクラス呼び出すだけでスレッド作って勝手によろしくやってくれる 外人のよくわからんライブラリ使ってるからマルチスレッド意識したことねーや この辺の部品って意外に探すとそろってるぞ
つーか、
>>961 の内容をクリアしたいんなら
タイマーで音楽のタイミングをカウントすりゃいいじゃん
そのカウントにあわせてアニメーション等の状態を管理すればいい
それで解決じゃね?
マルチスレッドとか別にどうでもいいと思う
いや、素直にマルチスレッドでやるのが楽だってw マルチスレッドは同期をとるのが難しいだけで メッセージスレッドとゲームスレッドは互いに(ほとんど)干渉しないんだから簡単だぞ。 ただ、DirectXはDirectXを初期化したスレッドでのみ使うのが基本。という制約を忘れないようにな。 メッセージスレッドで初期化して、ゲームスレッドで利用とかはダメだぜ。 上の方でほとんどと書いたが、実際 「WM_CLOSEがきたらゲームスレッド終了フラグをたてる」 「終了フラグを見て、ゲームスレッドは自身を終了させる」 って時しか干渉しないでしょ。
マルチスレッドボッコボッコだなw
> ただ、DirectXはDirectXを初期化したスレッドでのみ使うのが基本。という制約を忘れないようにな。 > メッセージスレッドで初期化して、ゲームスレッドで利用とかはダメだぜ。 ここが分からんのだが、どうやれと?
979 :
デフォルトの名無しさん :2008/04/08(火) 00:38:56
教えてくんですみません. いま,DirectXでフルスクリーンモードの高精細な画像を呈示して,観察者の反応をみる, という実験を計画中です. しかし実は私はいわゆるGUIベースのアプリ,「窓が開いてマウスでクリック,を書いた経験がなく, できれば,void main(void) で始まるC言語の範囲で,プログラムを書きたいのです. Direct X(具体的には DirectDrawを使って,さまざまな画像を作って見せて, 人間のいろいろな反応を記録する,という研究です・ に使う予定です. コマンドライ
どっちみち描画や操作のタイミングはタイマーでカウントしないと破綻すると思うんだが… マルチスレッドがどうとかいうのはあんまり関係ないだろ
>>979 C言語の範囲ではDirectXは利用できません。
C++を学ぶ気がないのでしたらお帰り下さい
マルチスレッドとか連呼しすぎるとIT革命みたいでかっこ悪いぞ
デバイス作成時にMULTITHREADフラグを指定すれば他のスレッドからでも普通に呼べるって話。 ドキュメントはプリントアウトして抱いて眠れ
ID3DXFont::DrawTextに渡すpSpriteは何に使うですか?
描画に使う
>>979 サンプルのシンプルサンプルかエンプティサンプルをベースに作るのはダメなん?
座標計算がうまくいかないんだが、どこがまずいかな // 変数宣言 D3DXMATRIX matTrans, matRoty, matWorld; // XとYに0を入れて、zに速度を入れる。 D3DXMatrixTranslation(&matTrans, 0.0f,0.0f,g_myChar.speed); // Y軸を中心に回転 D3DXMatrixRotationY(&matRoty, g_myChar.ry ); // 移動と回転を合成? matWorld = matTrans * matRoty; これで移動量を計算してみたんだけど、Y軸の回転が0の場合ちゃんと進行方向に進むのに、 90度(進行方向右)になると、なぜか右斜め前に進んでしまうんだ。 180度(進行方向後)になるとZ軸の移動量が0に。 パッと見でなんか間違ってるとこあるかな?
>>979 それは本当にDirectDrawが必要なのか?
ただ画像を表示するだけにDirectDrawなんて必要ないよ。
DirectDrawが必要なのはVSYNCと同期した画面の更新、
カラーキーを使った画像の描画で、それが必要ないなら
DirectDrawを使うメリットは無いし、デメリットの方が多い。
GDIの方が機能が豊富で便利だよ。
989 :
987 :2008/04/08(火) 02:07:28
>>987 は進行方向への移動量を求めてるの。
matWorldを現在の座標に加算すれば、
めでたく進行方向にカーソルキーで移動できるはずだったんだけど。。。。る
Z方向に移動してY軸回転しているだけのように見えるけど
>>991 NULLだと中でID3DXSprite作ってそれ使う。
キャッシュや描画タイミングの制御の問題なので
分からなければ気にしなくてもいいだろう。
分かるようになったら改めて見ればいい。
>>988 ハードウェア拡大縮小描画はかなりのメリットだよ。
GDIは補間方法が論外だし、GDI+は速度的に勝ち目殆どなし。
VGAに依っては、UYVYとかYUY2も変換無しで突っ込める。
ただ、
>>979 はフルスクリーン=DirectXと考えている節があるな。
それ以前に壊れている気もするけど。
994 :
987 :2008/04/08(火) 20:39:25
>>990 Z方向に移動してY軸回転したら、X軸Z軸への移動量が求められるかなーと思ったんですよ
ていうかそれだけなら自分で計算すればよくね? それとも本当は他の軸も回転させてんのか?
996 :
987 :2008/04/08(火) 21:45:39
他の軸も回転させる予定だけど 自分で計算する方法なんて忘れたっすよ! ついでに聞きたい、 Y軸とZ軸、もしくはY軸とX軸の2軸回転で全方位のベクトル?になるよね?
997 :
987 :2008/04/08(火) 23:10:33
ちょっと待て移動行列と回転行列を合成しても得られるのはある点を移動させて回転させる行列じゃないか? matTransをVECTOR3にしろ
999 :
987 :2008/04/09(水) 00:20:45
もにょ? 移動させて回転させた行列の中には 「ある方向へある距離移動した座標」 が入ってると思ったんだけど。。。。 まちがっとる?
ちょっと行列やり直して来いww そして1000Get!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。