【C++】 DirectX初心者質問スレ Part5 【C++】
1 :
デフォルトの名無しさん :
2005/07/22(金) 20:20:54 ※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する香具師 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
前スレ
【C++】 DirectX初心者質問スレ Part4【C++】
http://pc8.2ch.net/test/read.cgi/tech/1115484821
2 :
ピザ :2005/07/22(金) 20:40:46
早速ですが質問させていただきます。 DirectXはどこでダウンロードするんですか? 前にサイトに行って、ダウンロードしようと思ったんですが、 英語ばかりで、しかも、登録?みたいな事を進められたので、 ほかにダウンロードできる場所ありましたら、教えてください。
6 :
デフォルトの名無しさん :2005/07/23(土) 01:35:53
あたしのパパとママは本当のパパとママなの?
すみません、思春期の質問スレと間違えました
>>6 パパとママの定義は、現代では以下の種類がある。
遺伝子上のパパとママ
法律上のパパとママ
出産したママ
育てたパパとママ
お金をくれるパパ
どのことを言ってるのかね。
9 :
デフォルトの名無しさん :2005/07/23(土) 11:44:47
ひとつのXファイルを複数回ロードして 画面上に複数同時(別座標)に描画したいのですが。 やり方がよくわかりません。 モデル1個の描画に対して一個のメッシュポインタを用意して、 D3DXLoadMeshFromXで描画したい分ロードしDrawSubsetを呼んでいます。 それぞれのモデルが移動や回転をする為には、デバイスオブジェクトも 複数生成して、setTransformメソッドを呼ぶのでしょうか?
>>9 メッシュオブジェクトはひとつでいい
唯一のメッシュ作成
↓
1番目のトランスフォーム行列をD3DDeviceにセット
↓
DrawSubset
↓
2番目のトランスフォーム行列をD3DDeviceにセット
↓
DrawSubset
しかし何故それが思い浮かばないのか、一度
>>9 の思考ルーチンを覗いてみたい。
考え方は2Dと大差ない VRAMに読み込んだ画像(メッシュ)を異なる座標に描画すればいいだけなのに
13 :
デフォルトの名無しさん :2005/07/23(土) 13:00:22
FOVとアスペクトレートについてなんですけど 参考にしてた資料とDirectXでは定義が違ってたみたいで 作ったライブラリをDirectX側に合わせて修正したら 動作がおかしくなってしまった。 DirectXの定義って FOV = 垂直視野角(Y軸) AspectRate = ディスプレイの幅/ディスプレイの高さ で良かったんでしたっけ?
いいお
15 :
9 :2005/07/23(土) 13:14:32
レスありがとうございます。 D3DDeviceも複数作成する必要があるということですね? D3DDeviceは1画面に1つ作成するものだと勝手に思い込んでいました。
ぁぁぁぁ、その斜め上を逝く思考ルーチンを覗かせろ。
D3DDeviceは一個だヨ メッシュはスタンプみたいなもんだ。 DrawSubsetでぺったんぺったん。
18 :
デフォルトの名無しさん :2005/07/23(土) 13:22:54
>>14 ありがとうございます。
確認してみたころ
ヘルプD3DXMatrixPerspectiveFovXXの項が間違っていた為でした。
正しくはこうみたいです。
xScale = aspect ratio / yScale
↓
xScale = yScale / aspect ratio
19 :
9 :2005/07/23(土) 13:34:47
>17 ものすごく勘違いしていました。 トランスフォーム行列をD3DDeviceにセットしてから、 DrawSubsetを呼べば、セットした座標に描画されるということですね。
Surfaceについてなんですけど、 どうやったら指定した色を透過出来ますか?
確かにテンプレサイトが欲しいところですね。
誰かFAQ書きませんか俺はヤだよめんどくさいから。
>>20 Sufaceってなんのサーフェイスですか?
DirectDrawですか?
だったらカラーキーというものを設定する関数があるので透過したい色を指定ください。
それともDirect3Dのテクスチャですか?
だったらピクセルの透過具合を指定するアルファ値を操作してください。
具体的にはCreateTextureFromFileExなどでアルファ付フォーマットのテクスチャを作成します。
その際に引数のColorKeyで透過したい色を指定すれば勝手にやってくれます。
また、たとえアルファ値を指定してもレンダリングステートなどが間違っていると
うまく透過してくれないのでそのへんがよくわからない場合はいちいち聞きにこないでください。
DirectShowの質問です。 他のアプリケーションが使用しているフィルタグラフに勝手にフィルタを追加するにはどうすればいいですか? グラフマネージャのアドレスを取得できればなんとかなりそうだと思っています。
DirectPlayでいいサンプルどっかに転がってない?
DirectPlayはMSにいらない子の烙印を押されてしまったからなぁ。
某格ゲーのキャラクタースプライト画像を抜き出して覗いたところ、 画像の縦横サイズが2のn乗じゃなかったんですが、2のn乗じゃない 画像をテクスチャにするにはどうすればいいんでしょうか?
意味不明
別に画像ファイルが2のn乗である必要はないだろ。 そんな無駄なことしてる奴ほとんどいないぞ。 それに、2のn乗でしかテクスチャサーフェスが作れない ビデオカードなんて、今はi810あたりしか残ってないかと。
んなわけない。
29 :
25 :2005/07/23(土) 21:46:37
ttp://www.c3.club.kyutech.ac.jp/~sukiyaki/ こちらのサイトを見ながら勉強してるのですが、こちらの「テクスチャ」の項には
DirectXは2のn乗じゃないと画像を作れない、画像のサイズは全て256*256で統一した方がいい、
とあったのでそう思い込んでました。
テクスチャの読み込み方法をD3DXCreateTextureFromFileしか知らないのですが、
一般的にキャラクタースプライトを表示する手順というのはどのようなものなのですか?
30 :
969 :2005/07/23(土) 22:13:58
assertがスルーされた 一体どこから呼び出されてるのか 皆目検討がつかん・・・。
31 :
969 :2005/07/23(土) 22:33:48
vectorのerase使っても 中身残ってるのでしょうか、もしや とりあえず登録クラスのデストラクタで ReleaseせずClearを使った上に deleteやってeraseしてみた。 もうこれで完全に消えるっしょw
>>31 まだやってるのか
なんかvectorわかってなさそうだな
eraseの使い方大丈夫か
>>29 俺もその辺は困ったよ。
あちこちのサンプル見ても、2の累乗サイズのテクスチャを貼るものしかなかったもんなあ。
でも、画像は2の累乗サイズじゃないのが普通なんで、利便性を取ってがんばって対応した。
29もがんばれ。
>>25 の質問ってテンプレに入れるべきだな
D3DXCreateTextureFromFileExのフィルターオプション(DWORD Filter、DWORD MipFilter)
にD3DX_FILTER_NONEを入れれば解決
違う意味だったらスマソ
2乗じゃない画像が収まるだけの、2乗Bitmapなりをメモリ上に展開し、データをそこにコピー。 で、そこからD3DXCreateTextureFromFileInMemoryEx()するだけじゃないかな。 或いはD3DPOOL_DEFAULTがいらないなら、十分な広さの2乗テクスチャをCreateTextureで作成し、 それをLockRect()してデータを書き込むだけでいんでない?
DirectX8時代はsprite->drawで拡大縮小率とか回転率とか 設定できたんですがDirectX9.0cあたりから関数が4つの引数になり 回転とかはどう指定したらよいのか解らなくなってしまいました。 どう指定するか教えてくださると嬉しいのですが。 後、sprite->Beginの引数が要るようになったのでpSprite->Begin(D3DXSPRITE_ALPHABLEND); にして(これ以外だとカラーキーならない)宜しかったんでしょうか?
37 :
デフォルトの名無しさん :2005/07/24(日) 18:12:24
パソコンでフリーゲームをしようとしてインストールしようとしたら、DirectX Graphics Error 0x82000003 というエラーが出たのですがどうしたら解消できるのでしょうか?
>>37 何のゲームかも言わずにここで聞くな。
そのフリーゲームの作者とかサポ掲示板などで聞く。
ゲーム名でぐぐる。なり汁。
>>36 >DirectX8時代はsprite->drawで拡大縮小率とか回転率とか
トランスフォーム行列作ってSetTransformしてください。
>後、sprite->Beginの引数が要るようになったので
宜しいかどうかは君にしかわからない。想定通りの挙動をしてるのかね?
DirectPlay8のpeerでホストが死んでも移行させないようにするにはどうすればよいですか?
見捨てられた過去の遺物にしがみつくのを辞めて、 WinSockを使用し、自分で正しい実装をする。
42 :
25 :2005/07/25(月) 00:31:12
遅れましたがレスを下さった方々へ、ありがとうございました。
>>34 D3DX_FILTER_NONEを用いることで無事に出来ました。
2のn乗に足りない部分は自動的に透明な黒で補完されつつ
一番近い2のn乗のサイズでテクスチャを作ってくれる、
という理解をしましたが、合ってるかは不安です…
>>35 CreateCompatibleDCやCreateCompatibleBitmapなどを用いて作業用領域に画像を展開し、
メモリ上にあるDIBをテクスチャとして用いるという方法であってるでしょうか?
大きいサイズの背景画像をどうやって表示すればよいのか悩んでいたのですが、
512*512ぐらいのサイズの画像としてメモリ上に分割して、描画する際にまとめる
という方法で試しみようかと思います。
アドベンチャーゲームで立ち絵をαマスクとαブレンドさせたいんですが、 マスク画像とのαブレンドの方法がよくわかりません。 テクスチャの頂点フォーマットのカラー値のαを操作すれば 透明度の調整は出来ますが、ここら辺にヒントがあるのでしょうか… DDS形式に変換してからのαブレンドについては何件か検索で引っかかったのですが、 αマスクのビットマップ画像とのαブレンドについては見つかりませんでした。 何方か御教示願えれば幸いです。 # DIBでなら立ち絵・立ち絵マスク・背景のバッファを取得、 # それらをαブレンドの式で計算して出力してたんですが、 # DirectXでのやり方についてはお手上げですorz
α値を設定するだけ。
>>43 はじめからα値含められる画像フォーマット(tgaとか)にすればいいじゃない
まあどうしてもっていうならSetTextureStageStateを調べれば幸せになれるかな
DirectInputのジョイスティックについて教えて下さい ジョイスティックがついているかというのはどのように判別したらいいんでしょう CreateDeviceの戻り値で判定させようと思ったのですが GUID_SysKeyBoardとGUID_SysMouseしかないので・・・orz
>>44-45 なんか色々試行錯誤してたらできました。
SetTextureStageStateじゃなくSetRenderStateの設定を
しただけなんですが、こっちだとよくないんでしょうかね?
(共に抜き色は黒で)αマスクのビットマップは
デバイスポインタ->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
デバイスポインタ->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
と設定し、描画したいビットマップは
デバイスポインタ-->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
デバイスポインタ-->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
と設定したところ、ちゃんとαブレンドできました(ように思えます)。
と思ったらできてませんでしたorz 私の目が腐ってたようです… (描画したいビットマップ側の絵が黒で縁取られていれば綺麗になるのですが、 それ以外の場合だと周りが黒っぽく描画されてしまいます)
>>48 D3DBLEND_INVSRCALPHA→D3DBLEND_INVSRCCOLORでどう?
50 :
969 :2005/07/25(月) 18:34:48
やっと規制解けた ついでにちょいと謎が解ける vector<NODE> node; void Hoge() { for( int i = 0; i < node.size(); i++ ) { if( node[i].time > MAX_TIME ) RemoveAt( i ); else ++node[i].time; } } void RemoveAt( int Index ) { node.erase( node.begin() + Index ); } こんな使い方をしていたからさぁ大変w とりあえず修正して様子見中
イテレータ使わないのは論外として、上のコードは何か問題が起こりますか? 私はeraseされた次の要素の判定が飛ばされるような気がします。
52 :
969 :2005/07/25(月) 22:57:46
要素を5つ登録(push_back)したとして time = MAX_TIMEという条件で以下の流れ i = 0 でRemoveAtが動作、要素削除 node.size()が 4に i = 1 でRemoveAtが動作、要素削除 node.size()が 3に i = 2 でRemoveAtが動作、要素削除 node.size()が 2に i = 3 になり、node.size()が2なので終了 中身2つの要素が処理されず次回へ持ち越し と言った具合です。 ちなみに int end = node.size() for( int i = 0; i < end; i++ ) これは、エラーでうっ止まるので。
void Hoge() { vector<NODE>::iterator it = node.begin(); while (it != node.end()) { if (it->time > MAX_TIME) it = node.erease(it); else ++it; } }
while( it (略) はループされるたびにnode.end()は呼び出されないのかな? とりあえず試してみるか。 いまんとこ RemoveAtしたら i をデクリメントして対策してます。
56 :
デフォルトの名無しさん :2005/07/26(火) 01:51:28
すみませんageます
学生ならVisual Studio .net theSpoke Premium 2003が買える。 あとageんな
58 :
デフォルトの名無しさん :2005/07/26(火) 08:03:31
学生じゃないです
60 :
デフォルトの名無しさん :2005/07/26(火) 10:45:18
>>59 ニートじゃないけど見てみます
ありがとう
61 :
969 :2005/07/26(火) 10:49:04
>>53 今頃ですが、やってみました。
シンプルで感動した!コレでやってみます
ありがとう
イテレータはSTLの基本中の基本だからちゃんと勉強しようぜ
63 :
55 :2005/07/26(火) 14:59:25
>>57 学生じゃないです
>>59 ニートじゃないです
VC4を昔会社で使っていたので、VC環境でやりたいっす
Microsoft Visual C++ .NET 2003で問題無いということでしょうか?
エンタープライズなんちゃらじゃなくてもとりあえず問題は無し?
後はDirectX9って書いてあるIO辺りの本を買ってきてぴゃーってサンプルとか動いちゃう?
>>63 Standardは最適化なしのコンパイラしかついてこないので、
Toolkit2003の最適化ありのコンパイラに差し替えて使うように。
最後の一行は訳わかめだしふざけ過ぎ。
65 :
55 :2005/07/26(火) 15:42:57
ほんとは8万ぐらいのを買えば熱の入れようが違ってくるからいいんだけどな
学生でもニートでもないなら、自分で調べればいいのに。
学生でもニートでもないなら、自分で調べればいいのに。
学生でもニートでもないなら、自分で調べればいいのに。
学生でもニートでもないなら、自分で調べればいいのに。
DirectX9を使ってますが、meshファイルを描画した後に D3DPT_lineSTRIP でラインを描画しようとすると、 meshファイルの色の影響が出ているようなのですが、 どうしてなんでしょうか? また、回避するにはどうすればいいのでしょうか?
色ってなんだ?マテリアルカラーか? それともテクスチャ? 後者なら IDirect3DDevice9::SetTexture( 0, NULL )
>>71 ラインを描画する前にRenderStateとTextureStageStateを
ちゃんと設定しているか?
76 :
71 :2005/07/29(金) 03:05:09
>>73 SetTexture( 0, NULL )
これでラインがきちんと白色で描画されました
どうもありがとう
helpでこの関数を調べたら、後ろの引数がNULLだと
どうなるか記述されていませんでした
>>74 73でどういう症状になっていたのがわかりました
ようするにテクスチャを描画する状態が残っていたので、
その状態から脱出すればいいのですね?たぶん
SettextureStateState() に D3DTOP_DISABLE を
渡すのが正しい処理なのでしょうか?
実際に試してみたら、この方法でも白色で描画されました
これでいいのかな?
77 :
71 :2005/07/29(金) 03:07:13
>>75 あぁ、レスを書いているときに入れ違いになってしまいました
RenderState と TextureStageState のそれぞれの
何の項目を設定するのでしょうか?
>>77 出力色 = マテリアルディフューズ色
なら、
colorVertex = false;
colorOp[0]= selectArg1;
colorOp[1]= disable;
colorArg1[0]= current;
alphaOp[0]= selectArg1;
alphaOp[1]= disable;
alphaArg1[0]= current;
texture[0] = null;
79 :
デフォルトの名無しさん :2005/07/29(金) 16:28:53
うぜええ どうせまた隠し変更あるんだろお しっかしHLSLコンパイラのアップグレードがねえなあ たのむぜまったく
>>77 何の項目って、必要な項目に決まってるだろう。
何が必要かを自分で調べろ。
Direct3Dを使うならRenderStateとTextureStageStateは
全部把握しないと駄目。そのくらい重要で基本的なこと。
詳しい方教えてください。 DX9.0での内部動作についてです。 pd3dDevice->DrawPrimitive()って処理時間必要ないんですか? この関数が帰って来た時は、まだ描画が終了していない様な動きをしてしまうんですが。 具体的には、自前のレンダーターゲットに、ピクセルシェーダーを使って描画し、 その後、pd3dDevice->Present()でプライマリサーフェイスへ転送しています。 D3DPRESENT_PARAMETERS.PresentationInterval=D3DPRESENT_INTERVAL_ONEにしてても、 テアリングが発生してしまいます。 ピクセルシェーダー処理が軽い時は、テアリングは発生しないのですが、重いと書き換えラインが見えてしまいます。 そのラインの位置は一定なので、一応V-Blankは待っている様です。 もし、DrawPrimitiveが非同期ならば、何とか描画終了まで待ちたいのです。何か関数やオプションがあるんでしょうか? ・・・DX7時代には、DrawPrimitiveってフラグで同期・非同期を選択できましたよね。
83 :
82 :2005/07/29(金) 18:49:38
一部修正です。 具体的には、自前のレンダーターゲットに、ピクセルシェーダーを使って描画し、 ↓ 具体的には、規定のバックバッファにピクセルシェーダーを使って描画し、
84 :
82 :2005/07/29(金) 19:10:45
ageます
DrawXXX()どころかEndScene()やPresent()すら描画が終了している 保証はないみたいだよ。(SDKドキュメントに書いてある) 描画コマンドとの同期はIDirect3DQuery9で調べてみると幸せかも。 あとV-BlankはGetRasterState()で自前で検出できるみたいだからそっちも試してみたら?
86 :
82 :2005/07/29(金) 21:22:47
>>85 ありがとうございます!!無事同期を取る事ができました。
これで週末休めそうです。・゚・(ノД`)
お詳しい85さんにもう一つ、今回どうしても解らなかった事をお聞きしても宜しいでしょうか?
現在ウインドウモード限定のD3Dアプリを作ってるのですが、
バックバッファをスワップしたいのです。
具体的には、
バックバッファを2枚用意・・・
バックバッファ1にDrawPrimitive()
バックバッファ2をPresent()(フロントバッファにコピー)
1と2を(処理対象を)入れ替える
以上繰り返し・・・
をしたい(つまり、テアリングを見せずに速度アップを行いたいんですね)のですが、
D3DPRESENT_PARAMETERSで、
BackBufferCount=2
SwapEffect = D3DSWAPEFFECT_DISCARD;
PresentationInterval = D3DPRESENT_INTERVAL_ONE;
とする事でバックバッファは2枚確保できているんでしょうか?
バックバッファとは別に、ソースとなるダイナミックテクスチャを1枚作成しているのですが、
上の設定でデバイスを作成すると、なぜかLock時にエラーが出る様になってしまいました・・・
バックバッファを複数確保した時に何か注意点とかご存知ないですか?
87 :
デフォルトの名無しさん :2005/07/29(金) 23:30:55
88 :
71 :2005/07/29(金) 23:42:30
SetTexture( 0, NULL )
これだけど、
>>73 と
>>78 では「解法」といっていて
>>74 では「それはあやしい」といってるけど
どっちが正しいの?
>もう二時間近く それがどうした?
さんぷるください
>>87 >三角が回転してるようにしか見えません。
当たり前です。
表示したい物がカメラに対してどの位置に来るのか計算しなきゃ
「三次元上のカメラの動き」が再現できるわけないでしょう。
>もう2時間近く捜してます
だから何?
93 :
87 :2005/07/30(土) 00:21:44
もう見つかりませんよー 計算の仕方がわかりませんよ・・ ソースみたら多少はつかめると思うんです うざいかもなのでこれで最後 だめなら諦めます さ ん ぷ る く だ さ い みっからないんです、よろしくお願いします
>>88 あやしいという訳ではなく、足りないということ。
レンダーステートというのは明示的に変更しない限り保持される。
最初のDrawPrimitiveと次のDrawPrimitiveでエフェクトを描画効果を変えたいなら
当然ステートを変えなきゃならんでしょ。
テクスチャの影響を無くしたいのなら、テクスチャのサンプリング自体を止めるのが正道。
それが
>>78
95 :
71 :2005/07/30(土) 00:55:53
SetTexture( 0, NULL ) 後ろの引数を NULL にすること自体は 間違ってない、というのですね ところで、RenderStateとかTextureStageStateとか 現在のステートをどこかにプッシュして、 何かを行って、後からポップするようなことって できないのでしょうか? アセンブラでいうと、pushad/popad で、汎用レジスタの値を 全部まとめてスタックにセーブしたりロードしたりできたと 思うのですが、こんな感じのものが欲しい…
> RenderStateとかTextureStageStateとか 現在のステートをどこかにプッシュして、 > 何かを行って、後からポップするようなことって エフェクトを使えばできるよ。 あと、使ったことないけどステートブロックってのがそれっぽい。
>>93 ハイハイ
ここは釣堀じゃありませんよ
さっさと巣に帰れ
こいつらろくに調べもしないで聞きにきやがって・・ さっきNHKでやってたデンジロウ先生の蓄音機に感銘を受け 独力で作り上げた小学生の恥垢でも煎じて飲めやカス
どちらが正しいという話でもない。
DXの左手座標系はどう考えても嫌がらせだよな
嫌がらせも何も左右両方の関数がきちんと用意されているだろ。 自分で使わないだけなのに責任転嫁とは厨の考えることはさっぱり分からない。
俺は行優先、左手座標系でつ。 やっぱこれがベストだよね♪
いいや僕は断然列優先。
なぁDX9SDKのあたらしいUpdate、インストール中にとまるんだけど。 2005Aprさがそうとするぞ?
もう最新SDKなんかほっときゃいいじゃん。 仕事でも趣味でも、必要なやつなんてほとんどいないだろう。 Vistaたんまでもちつけ。
107 :
デフォルトの名無しさん :2005/07/31(日) 15:19:06
SDKに収録されているはずのDirectX+MFCのサンプル(ヘルプに書いてあるパスや、その他のフォルダも探しましたが) が見つかりません。2004年版と2005年版を両方探しました。 だれか居場所をご存じの方教えてください。
108 :
107 :2005/07/31(日) 15:20:02
>>107 Summer2004以降は削除された気がする。
Summer2003にならある。
MFCはもういらん
111 :
107 :2005/08/01(月) 00:03:49
>>109 情報ありがとう。
でも2003のMFCサンプル、今のVer.のSDKでコンパイル通らないの・・・
質問させてください カメラのnerとfarの間は出来るだけ小さいほうが言いと聞いたのですがそれは何故でしょうか? また、あるものを描画したい場合そのまま描画するよりもそのものやカメラの距離などを全てを例えば十分の一にしして描画結果は同じでもnerとfarを小さくしたほうがいいのでしょうか?
カメラ <O_______near____________far カメラ <O__________near_____far 描画対象が少ないから?
例えばZバッファが8bitだとすると、その解像度は256です。 nearからfarまでが10mだとすると、1bitで約0.04mになります。 nearからfarまでが1000mだとすると、1bitで約4mになります。 もしnearから2mの点と3mの点があった場合、 前者ではちゃんと違う深度になりますが、 後者では同じ深度になってしまいます。
<O____near____(´・ω・`)____far
<O__near__(・ω・)__far
これは意味ないわね。
>>113 もそうだし、nearとfarの比が大きい(nearが近すぎとか)と、
射影後のZ値の偏り(近くが密、遠くが疎)が大きくなるってのは一応あるわ。
>>116 そこらへんの理解が足りないんだけど、
射影変換後のZ値は
z' = z / ( far - near ) - near / ( far - near )
で0.0〜1.0でリニアに変換される。
これにw(z)で除算すると
z'' = z' / w
非線形分布になる。
前者がZバッファリング、後者がWバッファリングってことでいいのかな?
>>117 Zバッファ用の値は、後者みたいなw除算後の値だわ。
(前者の計算式はちょっと違うみたいだけど)
Wバッファ用の値は…たしか1/z をそのまま使うと思うわ(自信ないけど)
× 1/zをそのまま ○ zをそのまま
>>118 ごめんなさい間違えました。
前者は射影変換とは関係ない
Z値を0.0〜1.0にリニアに変換する式でした。
Wバッファリングは今思い出したんですが、
言われたそれで良かったと思います。
頭のもやもやがとれました。ありがとうございました。
頂点バッファに使ったLVERTEX配列をデストラクタでdelete[] しようとするとエラーが出てしまいます。 groundVer = new LVERTEX[NUM_MAPVERTEX] ←コレ pD3DDevice->CreateVertexBuffer(sizeof(LVERTEX) * NUM_MAPVERTEX,0,FVF_LVERTEX,D3DPOOL_MANAGED,&p_GroundBuf, NULL); p_GroundBuf->Lock(0,0,(void**)&argVer,0); memcpy(groundVer,mapVer[0], sizeof(LVERTEX) * NUM_MAPVERTEX); p_GroundBuf->Unlock(); 何ででしょう?
使われていないargVerの存在の意味が分からない。
123 :
デフォルトの名無しさん :2005/08/02(火) 00:05:14
COLLADAの日本語の仕様書ってありませんか?
>122 記述ミスでした。 argVerではなくgroundVerです。
だったらポインタの示すアドレスが入れ替わっているんだから、 根本的に解放できるわけがない。
ていうかなんではじめにメモリ確保してんの
バカだから
ふたなりだから
これでゲーム作れって課題でたけどさっぱりわかりません どうやって単位をもぎとればいいですか?
おねぇちゃんのおみせに先生つれてけ。それで交渉しろ。
131 :
デフォルトの名無しさん :2005/08/02(火) 20:49:41
すっげー、基本的な質問 C++でDirectXの基本的な解説やってるWebと本を教えて。 WinMainつかうのと AppWizardつかうのと そのほかのフレームワークやら、ライブラリやら使う奴を個別に教えて欲しい。 で、できれば、次スレ以降のテンプレに加えてくれ。 最初のここでつまづいているオレよりのお願いだ!
つ【ヒントというか答え:”C++ DirectX プログラミング”でぐぐる】
131は馬鹿そうなので教えても理解できないだろう。たぶん。
この世の全てを消し去る方法を教えてください。 グーグルで検索してもわかりませんでした。
FORMAT C:
自分が死ねば世界を消し去ったことになるだろう。
哲学的だな。
141 :
121 :2005/08/04(木) 00:01:35
>125 解放しないとメモリーリークしませんか? >126 どこのメモリを使っているのか自明でないと不安なんです。
>>141 p_GroundBuf->Lockの中の人がせっせとメモリを確保してくれるのだから、その前に自分でnewを書く必要はない。
143 :
121 :2005/08/04(木) 01:20:49
>142 あ、なるほど 愚問失礼致しました
質問です、DirectSoundにSetVolumeという関数がありますが これってDSBVOLUME_MAX(0)からDSBVOLUME_MIN(-10000)までしか値が指定できません。 という事は、音量を小さくする事しか出来ないのでしょうか? 例えば、ゲームのコンフィグ等にある音量調節を実装する場合、 一度下げてからまた上げたい場合等にはどうすればよいのでしょう?
追記です 要は、絶対的な音量指定は出来ないのでしょうか? 相対的(しかも下げる方向のみ)だけでなく………
ボリュームコントローラのスライダーの位置が最大になっている状態で、 それ以上上に移動させようとしているわけだが、頭が固いにもほどがある。
これが5000〜-5000とかだったら、絶対的な動作が全く一緒でも、 何の疑問も抱かず使うんだろうな。
>146 それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか? MSDNを参照すると >設定可能な値の範囲は、DSBVOLUME_MAX (減衰なし) から DSBVOLUME_MIN (無音) までである。 >これらの値は、Dsound.h 内ではそれぞれ 0 および ?10,000 と定義されている。 >値 DSBVOLUME_MAX は、ストリーム本来の未調整のボリュームを表す。 >値 DSBVOLUME_MIN は、オーディオのボリュームが 100 dB 減衰していることを表し、これは実際的には無音を意味する。 >DirectSound は増幅をサポートしていない。 と書いているのですが………
150 :
144 :2005/08/04(木) 17:55:44
144=149です
だからボリュームを上げたければ、初期状態を下げておけばいいんだけなんだよ。 頭固いなあ。
>それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか? >それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか? >それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか? >それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか? >それは、DSBVOLUME_MAXがボリュームコントロールのスライダーの位置最大ということでしょうか?
153 :
144 :2005/08/04(木) 18:10:09
………何と無くは分かりました、GetVolumeの方の説明も見とくべきでしたorz とりあえず、有難う御座いました。
154 :
デフォルトの名無しさん :2005/08/04(木) 18:23:31
ちんちんおっきおっき
155 :
デフォルトの名無しさん :2005/08/04(木) 21:40:09
SkinnedMeshのアニメーションのサンプルで、xファイルのアニメーションキーの 数取得できる方法ご存知ないでしょうか?
アルファ合成(乗算)について教えてください。 メッシュの輪郭線を描画するために、テクスチャに白地に黒の線を書いて、 それを最後に乗算描画しようとしているのですが、うまくいきません。 設定は pd3ddevice->SetRenderState(D3DRS_SRCBLEND , D3DBLEND_ZERO); pd3ddevice->SetRenderState(D3DRS_DESTBLEND , D3DBLEND_SRCALPHA); です。 テスト用に pd3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)); pd3ddevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)); と設定すれば、白地に黒の輪郭線のみが表示されますので、 テクスチャへの描画はうまく言っているはずです。 SetRenderStateの設定ミスでしょうか?
お前さんがやりたいのは、D3DBLEND_SRCCOLORじゃねぇのか?
158 :
デフォルトの名無しさん :2005/08/05(金) 15:07:49
DrawIndexedPrimitiveで描画したポリゴンにライトが当たりません。 描画すると真っ黒で、ライトをオフにするとテクスチャと同じ色で描画されます。 この前後でXファイルを描画させると、それに対しては問題なくライトの処理が行われています。 何か特殊な処理でも必要なのでしょうか?
160 :
デフォルトの名無しさん :2005/08/05(金) 16:35:28
固定機能パイプラインを使って テクスチャ座標を色として出力したいんですが 可能でしょうか? HLSLの場合こんな感じです。 float4 PixelShaderMain( const in float4 i_vTexCoord0 : TEXCOORD0) : COLOR0 { return i_vTexCoord0; }
161 :
158 :2005/08/05(金) 20:49:40
>>159 レスありがとうございます。
法線関係調べましたら座標と法線逆に指定してました(ノ∀`)
162 :
156 :2005/08/05(金) 23:58:22
>>157 ありがとうございます。
おかげさまでうまくいきました。
・・・なんで気がつかなかったんだろう。
163 :
デフォルトの名無しさん :2005/08/07(日) 20:24:43
DirectInputなんですが、接続しているジョイスティック一覧を取得するときに ジョイスティックの名前を取得できませんか? コントロールパネルのゲームコントローラーで出てくる名前を取得したいんです。
164 :
163 :2005/08/07(日) 21:01:37
解決しました。 DIDEVICEINSTANCE構造体から取得できるんですね。
Direct3Dを使用してフェードイン/フェードアウトを行いたいのですが、 普通の画面を描画したあとに、一番手前に大きなポリゴンをアルファブレンディングで 描画するする方法しか思いつきません。 これはすごく重くなりそうです、、一般的にはどのようにして実装するのがいいでしょうか?
重くなりそうとかグダグダ言う前に実際に作ってみろ。 何故簡単に試せることすらやろうとしない?
場合によっちゃフォグでも出来るかもね
>>166 レスありがとうございます。
一度作ってみます(ノ∀`) でも重そう…。
>>167 フォグですか。一度試してみます。
ご助言ありがとうございました。
正に、馬鹿の考え休むに似たり
>>169 ちんちんがむけてないと、たまにそういうこと言うよ。
172 :
デフォルトの名無しさん :2005/08/08(月) 22:42:15
ちんちんの皮だろ童貞
>>172 ちんちんがむけるってゆーたら、
皮のこと指すんだろがふつー。
わからないお前のが童貞。
つーか、俺のソープ初体験(1年前)聞きたいのかボケ。
何このスレ
アホな質問をする奴より 意気揚々とカスなレスで埋める お前らがウゼー ちょっと難しいことを聞くと、 だんまり決め込むチンカスども死んでね
>>175 よしよし、なんだい?
元ゲームプログラマー(現在業務系プログラマ)な俺が質問に答えてやろう。
ただし、解答に2桁以上の掛け算の入る質問は駄目だ。
先生ポータルってなんですか どうやって作るんすか
>>178 さっきググってみたけどポータルって窓口のことだってよ。
やっぱりアルミサッシ買ってくるんじゃね?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | |
| |( ´∀`)つ ミ |
| |/ ⊃ ノ | |
>>179 &アルミサッシ
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
馬鹿かてめーは
アルミサッシもつけてやるから
二度とこのスレ覘くな。
>>176 では質問、
View空間での方向ベクトルを
射影空間に変換するにはどうすればいいの?
普通に射影行列を掛けてW除算でいいのかな?
>>181 本当に「方向」ベクトルなら、変換前の座標はちゃんとW=0にして無限遠に向けようね。
それに射影行列をかけてW除算した結果が果たして何を意味するのかは、使う前によく考えましょう。
CreateDeviceでD3DERR_DRIVERINTERNALERRORが帰ってしまいます。 D3DDEVTYPE_REFでも,D3DDEVTYPE_HALでも同様です。 WinnXP Pro SP2 DirectxX9.0 Summer 2005 SDK VC++NET2003 MatroxG400 最新のドライバーを当てています。 いろいろ自分なりに調べてみましたが解決できません。 考えられる原因は何でしょうか?対象方はありますか?教えてください。
>>183 >MatroxG400
・・・・・・やっぱり、これかな(笑)
185 :
184 :2005/08/10(水) 01:32:42
>>184 たしかに古いボードですがorz
補足しますが、他のDirectXアプリやSDKのサンプルは重いなりに動いています。
186 :
デフォルトの名無しさん :2005/08/10(水) 10:56:29
質問するのなら最低限バックバッファくらい作ってからにしてくれ。 描画以前の問題。
>>186 VC++ Toolkit2003でコンパイルしてみました。
中に入っていたpngの正しい描画と同じ結果が得られました。
以上。
>>186 症状でねぇ
WinXP
Geforce256
DX9.0c
トランスフォーマーってなんですか?
私にいい考えがある
195 :
186 :2005/08/10(水) 17:16:58
>>187 元はあったのですが、症状の再現に関係なさそうだったので省略しました。
フレーム毎にブレークをかけてF5連打しても時々発生するので、
同期やら、バックバッファ云々では無いかと。
>>188-189 そうですか・・・
3Dゲームとかがおかしかった事は無いし、
ビデオカードのドライバを変えてみたりしたのですが変わらず。
症状が出ても、次のフレームが何事も無かったように描画されるのがなんとも不思議で。
>>185 D3DCREATE_HARDWARE_VERTEXPROCESSINGを指定してないか?
DX9で文字列表示はどうやればいいですか?
ttp://www.microsoft.com/japan/msdn/academic/Articles/DirectX/02/ ここの「2.3 文字列の表示」を読んでるんですが、
D3DXCreateFont(pD3DDevice, hFont, &pD3DXFont);
の時に関数が不正な 3 個の実引数
pD3DXFont->DrawText(psz, strlen(psz), &rc, DT_SINGLELINE, color); // 文字列を出力
の時に関数が不正な 5 個の実引数
になってしまいます。
BeginとEndも'ID3DXFont' のメンバではありませんと言われてしまいます。
いーからSDKのマミュマル嫁や もしくはヘッダの宣言みろや
こうコロコロとAPI仕様が変わるDX9時代、初心者はDirectXプログラム禁止ってことでFA?
自分が学習に使っているSDKのバージョンをを使い続ければOKなんでは
202 :
197 :2005/08/11(木) 22:38:06
返信ありがとうございます。 if( FAILED( D3DXCreateFont(lpD3DDEV,h, w, 0, 0,0,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH,"MS ゴシック", &m_lpFont ) ) ) { MessageBox( 0, "D3DXCreateFontIndirect FALSE", "ok", MB_OK); exit(0); } で駄目でした。 D3DXFONT_DESChFont={h, w, 0, 0,0, SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"MS ゴシック", }; if( FAILED( D3DXCreateFontIndirect( lpD3DDEV, &hFont, &m_lpFont ) ) ) { MessageBox( 0, "D3DXCreateFontIndirect FALSE", "ok", MB_OK); return; } も駄目でした。 両方コンパイラは通りますが、エラーになってるみたいです。 SDKは丁度、DirectX 9.0 SDK Update (Summer 2003)です。
> エラーになってるみたいです そしたら、 「どのようなエラー値が返っているのか?」 を調べるべし。
DirectXの前にC言語の勉強した方がいいかと… ヘッダとかエラーメッセージを見たら分かることなんだし。
205 :
197 :2005/08/12(金) 00:50:50
戻り値のHRESULTの DEC値が -2005530516 DXGetErrorDescription9で見てみると Invalid Call 呼び出し無効?引数が間違ってるって事でしょうか…?
206 :
デフォルトの名無しさん :2005/08/12(金) 00:51:58
DirectX 8.1のSDKって今でも手に入りますか?
207 :
206 :2005/08/12(金) 01:50:27
すいません、自己解決しました。ありがとうございました。
>>197 D3DXCreateFontのドキュメントを良く見るんだ。
戻り値について解説がある
209 :
197 :2005/08/12(金) 02:14:13
>>208 良く考えてみてできました!
lpD3DDEV初期化する前にCreateFontやろうとしてましたorz
boland c++ compilerでもDirectX使えますか?
BCもVCも動作にDirectXは使いません。
Direct Sex
213 :
デフォルトの名無しさん :2005/08/12(金) 22:49:51
今日からDirectXを始めた者です。 書籍片手に悪戦苦闘しています。 質問なんですが、参考にしている書籍ではD3DDeviceのポインタを 全ての描画関数に引数で渡してあるのですが、 これはグローバル(クラス)にひとつだけ持つようにしても問題ないものなのでしょうか? それとも今後D3DDeviceを2個生成して切り替えるようなテクニックを使うのでしょうか?
214 :
デフォルトの名無しさん :2005/08/12(金) 23:12:05
>>213 すべて引数で渡すのが正解。
グローバルで1つだけ生成したとして、
それをどこからも呼べるようにしておいて実際にそうやってくんじゃうと
バグったときに最悪。
これはグローバル変数が駄目といわれる理由。
なんで駄目なのかってのは自分で実際に痛い目をみなきゃ理解できないと思う。
引数で渡すようにするのはそれをどこが呼んでいてどこが変更を加えているのか
わかるようにするため。
決して面倒だからという理由でこれをおこたってはならない。(本当はねw)
いろんなページ見つつ、 Mesh読み込んで表示するクラス作ったんだけど、 自分で作ったxファイルが表示できない…。 なんで?
216 :
デフォルトの名無しさん :2005/08/12(金) 23:22:22
>>214 回答ありがとうございます。2,3質問があります。
バグった時ってのが具体的に分からないのですが、
変更する必要がなくて、1個だけでよければ
シングルトン(グローバルインスタンス)のメンバ変数で
問題がないように思えるのですが。
どこで呼んでいて、どこで変更ってのも参考にしている書籍では
メイン関数(WinMain)のローカル変数で生成して、それを全てで使いまわしています。
この構成ではシングルトンのメンバに持ったほうが、可読性が上がり、
バグの入り込む余地はないと思うのですが。
テクスチャのリソース管理なども今後シングルトンで管理しようと思っていますが、
D3DDeviceの取り扱いでちょっと悩んでいます。
また超能力者きぼんぬかよ。
>>214 DXUTGetD3DDeviceの立場はどうなるんだろう、とふと思った。
>>216 シングルトンで問題ないと思うよ。
いきなりグローバル変数の一般論を語り出す
>>214 は軽く聞き流しておけばいい。
220 :
デフォルトの名無しさん :2005/08/12(金) 23:54:14
>>216 じゃあ例えば、
gGlobalという変数を用意したとしてどうやらそこがバグの原因らしいと
でも
initGame();
frameGame();
endGame();
これ↑じゃ関数の中身をいちいちチェックしないとわからないでしょ?
initGame(&gGlobal);
frameGame();
endGame();
でも、これ↑ならバグの発生箇所がinitGameの中であることが確定されてるでしょ?
こういう細かいところをしっかりと管理することでバグが格段に減る。
また、別の視点として、自分ではない誰かにソースをみせたとき、
gGlobalをシングルトンにしてしまうとgGlobalの影響範囲が絞れない。
つまりでかいプロジェクトでこれをやってしまうと終了確定。
俺も新人の頃これをやって先輩(上司ね)にすげー怒られた。
( ´_ゝ`)フーン
222 :
デフォルトの名無しさん :2005/08/13(土) 00:19:01
>>221 まあ、1回痛い目にあわないとそんなもんだよw
俺もそうだったし。
ただ、C/C++ってインスタンスやクラスの影響範囲を絞るのって
ヘッダーファイルのインクルードか引数をみるしかないんだよね。
俺が最悪だと思うソースは2つ、
1つはグローバル変数がヘッダーファイルに1つにまとめて宣言してあって
そのヘッダーファイルがすべてのヘッダにインクルードされているソース。
もう1つは、ほとんどの引数がvoid*
223 :
デフォルトの名無しさん :2005/08/13(土) 00:19:50
>>219 回答ありがとうございます。参考になります。
>>220 解説ありがとうございます。
確かに一般論はそうなのですが、私の方では、ひとつしかないデバイスを扱う物は基本的にシングルトンにします。
各種マネージャー系、ハードデバイス系(コントローラー、サウンド、バックアップデバイス等)です。
それらを引数で渡していると、ある関数に渡す引数がそれこそ10や20では足りなくなります。
これらの広範囲で使うデバイスは、どこから呼ばれているかでバグの原因が
分からないというのが想定しにくいです。
ただ、この辺りは個別の問題に関することなので、
D3DDeviceに関してもそうだとは断言できません。
私の方で作成予定のソフトでは、D3DDeviceを引数に渡すのが恐らく最終的には、
クラスで100、関数で、数1000以上になると思われます。(一桁増える可能性もあります)
引数を渡す必要のある関数のネストは10ぐらいは平気で行くと思われます。
可読性を考慮して、シングルトンの方が良いと判断します。
ただ、一時的にあるいは動的にデバイスを生成削除するなら、引数で渡します。
で、一時的にデバイスを生成削除する必要があるのかなと思った次第です。
今まで扱ってきた3D環境では、D3DDeviceのような概念がなかったので、
ちょっと悩んでいます。
スレの趣旨と変わってきたので、後は自分で頑張ってみます。ありがとうございました。
BCCでDirectX扱おうと思ったのですが 初期化処理でD3d8.libをリンカに指定しなければ ならないらしく、ところがそのライブラリがない っぽいです。BCCでは無理なんでしょうか?
225 :
デフォルトの名無しさん :2005/08/13(土) 00:37:07
>>223 うぁ・・・俺が新人ときに先輩にいったことと全く同じこといっとるw
それじゃ、バグったときも1000以上あるクラスを
影響範囲も特定できない状態で調べるつもりなんだ。
つか、可読性を完全に履き違えてる。
ソースの見た目を綺麗にするのが可読性じゃないぞ。
クラスやインスタンスの影響範囲が限定できてこその可読性。
そのクラス(変数も)が関連するクラスはどのクラスとどのクラスなのか
これが綺麗に表現できていなければ、いくらソースの見た目が綺麗であっても
誰も読めない。
>それらを引数で渡していると、ある関数に渡す引数がそれこそ10や20では足りなくなります。
それでいいんだよ。
その関数はそれだけの複雑性を抱えてるってことなんだよ。
プログラムの腕が上がれば綺麗にまとめる方法が見えてくるよ。
しばらくは大量に引数をつけちゃってもかまわないから
ノーグローバル変数のスタイルを貫いてみてほしいなぁ・・・。
私の携わるプロジェクトの別チームが作ったプログラムは、 大小さまざまな構造体がグローバルに置かれていてその数なんと、50は下らない。 確かにそれだけの情報量が必要ではあるのだが、外部から変更される可能性のある 設定ファイルの内容までもそうして保持しているから一体いつ更新されているのか 最早誰にも理解できなくなっている。
228 :
デフォルトの名無しさん :2005/08/13(土) 01:09:32
>>225 はは、私も3年目ぐらいの時はその考えでした。
その考えで1本ゲームも作ったな。
これでも信念持ってやってますし。経験も長いので、ただ宗教論争になるので止めましょう。
長いって言ってもゲームなんで特殊かもしれませんが(笑
何をグローバルにして何をクラスメンバにして、何をローカルにするかは
常に考えていますよ。その上で、必要なところはシングルトンにします。
スレッドが絡んでくるとむしろシングルトンの方がまだ楽だし。
可読性云々も含めてこれ以上は宗教論争になるので止めときましょう。
>>228 嘘でしょう。
発言の薄さから、プログラムの設計について考えた形跡が全くみられない。
頭の固い2D親父に何言っても無駄ムダ。 Direct3Dの勉強、頑張って下さいね〜。
ただの変数ならともかくD3DDeviceで「グローバル変数の弊害」とは
>>225 の主張はこのケースにはまったく当てはまらないが
(その都度引数として渡そうが大域変数を使おうが中身は常に同じ)
まあスタイルとして統一するってことでいいんじゃないの?
あ た し の た め に 争 う の は や め て
でも、コピーして持っておくのは良くないよな。
教条主義にとらわれて思考停止に陥ってるお方は ぜひロガーもサウンドモジュールも引数渡しでがんばってくれればと切に願う。 ところでd3ddの中にはレンダリングステートとかがあるし、 それぞれd3ddを通して描画するモジュールが全員自分用のstateblockでも持ってて 毎回自分の都合のよいように全部設定してから描画するとかならいいけど、 ある状態になってることを前提にして描画処理を流したいということになってくると d3ddがどこからでも触れるようになっていて、モジュールが好き勝手なタイミングで 描画をやっているとなると、ある日前提がくずれて思ったような描画が されなくなったときにその原因追求は結構厄介なことになるのではなかろうか。 そのような問題に対処するための何らかの歯止めは必要だと思う。グローバル変数がどうとかじゃなくて。 それはたぶん結局は…ってことになるのだとは思うけど
アンチグローバル信者キモ。 偏執で頭固まりすぎ。 経験の浅い学生なんだろうけど、こんな協調性のない奴が 職場にいたらと思うとぞっとするな。 設計のなんたるかも分かってないみたいだし。 4人のギャングが怒ってくる罠。
>>236 だな。たかがpd3dDeviceの話なのに、必死に論点ずらしてて笑えるw
ここはDirectXのスレじゃないの? 変数の場所を決めるスレでつか?
>>236 そんなわけあるか。
グローバル変数を使うプログラムの設計が糞なのは
C言語のときから散々言われてきた。
そういう駄目な例を扱った本も何十冊と発売されてきたし、
禁じ手といったらグローバル変数は代表みたいなもんだ。
ここまでしてグローバル変数を回避する必要があったんだよ。
それをもっとよく考えるべきだと思う。
>>239 俺だってグローバル変数は「できるだけ」回避するようにしてるけどさあ。皆も同じじゃねーの?
そろそろ自分の言葉で語ってみたらどうよ。
>>241 そろそろもなにも自分の言葉だけどなにか?
#そういや、最近、リンクの紹介だけして逃げてくアホが増えたけど
#あーいうのに言ってやれよ。
あ た し の た め に 争 う の は や め てって言ってんだろがこのハゲどもがああああああああああああ
ハゲっていうなああああああああああああああ
おまえらにはラッパーを作るという考えはないのか・・・
ヨーチェケラ
>>239 > グローバル変数を使うプログラムの設計が糞なのは
> C言語のときから散々言われてきた。
> そういう駄目な例を扱った本も何十冊と発売されてきたし、
> 禁じ手といったらグローバル変数は代表みたいなもんだ。
そんなことはいちいち書かなくても誰でも知ってますよ。
もっとも、本書く人は大抵開発現場にいませんけどね。
>>247 じゃあ、なんでシングルトンとか使っちゃうアレな人が減らないわけ?
ヨーチェケチェケ チェケラッチYO!
デザパタスレの常連キチガイがこちらにも来たみたいだな
251 :
デフォルトの名無しさん :2005/08/13(土) 11:09:30
まだ固執してるか、キモすぎ。 まさに思考停止だな。 ほんと全て引数渡しでがんばってくれと切に願うね。 そして一人で誰にも迷惑かけずにやってくれと。
qAppもグローバルだな。
>>251 その言葉、そっくりそのままお前に送るます
もうやめてやれよ。 論点ずらしまくりのキチガイなんだから。
>>254 その言葉、そっくりそのままお前に送るます
>>250 デザパタなんか現場じゃ全く使ってないのにねw
いやデザパタスレの常連キチガイは
>>256 みたいな感じな人だよ
お前ら本当はプログラミングのプの字もできないんだろ? 俺知ってるぜ
>>257 とりあえず、ナムコ、カプコン、スクエニではデザパタは使ってないですw
・ゲーム製作現場が全てだと思っている ・デザインパターンを「使う物」だと思っている ・なんか子供っぽい権威を持ち出す(ナムコ、カプコン、スクエニ) なるほど痛いな
勝手に使ってないことにすんなよw
dinput.hはインクルードしてあって lpDevMouse->SetDataFormat( &c_dfDIMouse2 ); やっても error LNK2001: 外部シンボル "_c_dfDIMouse2" は未解決です になります。 他に何かやる事ありますか?
>262 dinput.libかdinput8.libがリンクされてないとか。
>>263 そんなことは……
当たりでした…orz。
すいません マウスの初期化はできたんですが、 マウスの軸移動の情報がウィンドウ外でしか入手できてないみたいなんです。 クリックはウィンドウ内でも受け付けてるんですが…。
すいません。自己解決…
clootie
271 :
267 :2005/08/13(土) 21:28:59
>>268 エキサイト一応やりましたが…意味不明で確信がもてません。
>>269-270 dです。でも書かれてる内容が分かりません。
ここからDLできるんですか?
>>271 あの程度わからないならBCCでDirectX使おうなんて
身の程違いもいいところだよ…。馬鹿は素直にVC買っとけ。
むしろ学校のお勉強が先だと思うな。。。
GPU Gems1 の 94ページに 「アルファブレンディングを使って描画呼び出しでz-テスト/書き込みを有効にすれば」 ~~~~ とあるのですが、無効の間違いでしょうか? (私は半透明なオブジェクトではどちらも無効にして最後に書いてました)
>>275 その本持ってないのでそれだけの情報では分からないな。
>>275 その本は知らないが、半透明を描画する際にZテストは
無効にしちゃ駄目だろう。無効にするのは書き込みだけ。
半透明オブジェクトを書く順番で、有効無効が違うだろ。
無知素人278発見
無知っていうかZバッファの比較と書込みの違いがわかってないんじゃないかな…
281 :
◆YlfFTVBogg :2005/08/16(火) 00:43:52
最近暇が出来まして、DirectXの勉強をC++.netで始めております。 現在、自動車教習所のシミュレータのパクりを作ろうと考えています。 半年前二輪免許取ったときのシミュレータが楽しくて、是非自分で実現しようと思いまして。 細かい仕様をだいたい決定して、さて次は具体的に技術を考えようと思った矢先に フィールドに関する事項で躓きました。 みなさんフィールドの実装はどのようにされていますか?高低差を含んだフィールド の実装方法を教えて下さい。 また、それを載せているサイトでも構いません。 現在考えている方法は、 ・2次元の高さ配列を作り、それをメッシュにする。 ・メタセコイアでがんがって作ってXファイル表示。 です。何か良い方法などありましたらサイト、書籍構わず教えて下さい。 当方VisualC++での開発経験はあります。(あくまで自分用の制御系ツールですが 英語の資料は無理なく読めます。よろしくお願い致します。
>>281 あー、「ナビゲーションメッシュ」とか「オクトツリー」で
ググるとそこ周辺の情報がついてくるよ。
英訳してググルとさらに当たると思われる。
普通にコースのメッシュを作ればよろしいと思うが。 そこそこ茨の道だと思うので覚悟するように。
>>283 多分、見た目用のモデルと、当たり用のモデルを用意するって手法(?)を知らないと思われる。
2次元の高さ配列なんていってっけど、それをどうやって作るのか考えてないと思われ。
>>282 なるほど。Game Programming Gemsが欲しくなるような検索結果でした。
しかし、結構な情報が手に入りました。また熟考してみたいと思います。
ありがとうございました。
>>283 単なるメッシュを作ることも考えましたが、後の拡張性を考えて、う〜ん
と悩んでいたところです。
>>284 当たり判定云々は知ってます。
二次元配列はDXF形式のデータを三次元加工用に三次元配列に変換する
プログラムを作ったことがあるので、その技術を流用しようかと考えています。
>>285 そんな面倒なことしなくても、メタセコでモデル作ったときに当たり用のモデルも作っちゃえばいいじゃん。
当たり用のモデルの名前だけ特定のものにしておけば楽じゃん。
3DCGツールで作ったアニメーションを再生させるのってどうしてる? 良いライブラリとか知らない? みんな自作してるの?
D3DXLoadMeshFromXで三つ以上メッシュ読み込むと、 ものすごく遅いんですが、どうにもなりませんか?
290 :
デフォルトの名無しさん :2005/08/16(火) 15:37:43
メッシュの頂点数を減らす 見えないときはDrawしない ハードウェアを良いものに買い換える
ロードが遅いのか描画が遅いのか
描画が遅いです。 やっぱ細かいとこつきつめてくしかなさそうですな。 ありがとうございました。
293 :
271 :2005/08/16(火) 20:40:37
おかげ様でライブラリらしきものを入手できました。 皆様ありがとうございました。 しかし、初期化処理にはd3d8.hヘッダファイルが 必要らしくそれもDLできないでしょうか?
>>293 物事自分で調べられない奴はプログラミングには向いてないと思うよ
295 :
271 :2005/08/16(火) 20:45:03
>>293 Microsoftのサイトから落としてこい。
ンヒヒヒヒヒ!すいません!
299 :
271 :2005/08/16(火) 21:59:26
>>296 キーワードが思い当たらないって意味です
>>297 すみません。どこにあるのか検索しても見つからないです
>>299 キーワード:DirectX SDK
てか君まず検索の練習から始めた方がいいよ・・
301 :
271 :2005/08/16(火) 22:15:19
>>300 d3d8.hを落とせないか調べたいのですが…
>>301 釣り?釣りじゃないなら
もう君プログラミングやめた方が良いよ。
303 :
271 :2005/08/16(火) 22:23:34
>>302 あ、そですか。論外ですか。
あとはどーにでもしますわ。
304 :
271 :2005/08/16(火) 22:31:50
>>303 偽物は出てこないで下さい。
d3d8.hがどこにあるかだけ分かればいいんです、おねがいしますorz
なんだ釣りか
306 :
271 :2005/08/16(火) 22:37:34
>>304 偽物うぜぇ。
もうお前らには要はねーよwww
糞野郎どもがw
まーめがほしいかそらやるよ
>>271 マジレスすると、
>>272 が書いてあることが一番的を射ている感じがする。
おそらく君はDirectX(SDK)がどういうものなのかも分かっていないし、
コンパイラがどういう仕組みで動いているのかも分かっていない。
(プログラミング経験も無いんじゃないか?)
つまり、何を調べれば動くようになるのかすら分からない状態なわけだ。
素直にVisualC++.NETとDirectXの入門書を買ってくることを薦めるよ。
309 :
271 :2005/08/17(水) 19:35:05
>>308 ありがとうございます。
改めて今日探して見ましたが
Microsoft DirectX 9.0 SDK Update (August 2005)
のソフトウェア開発キットというのに
ヘッダやライブラリがすべてありました。
どうもお騒がせしました。
310 :
デフォルトの名無しさん :2005/08/17(水) 20:11:13
Directx8で 頂点カラーとテクスチャカラーの合成をしたとき 頂点カラーが0.5のときに、テクスチャカラーがそのままでて 頂点カラーが0.5より上なら明るく、下なら暗く という感じの設定って無いでしょうか?
311 :
271 :2005/08/17(水) 21:00:18
たびたび申し訳ありませんが質問です。 初期化処理をしたところ >309でダウンロードした中のd3d8.libファイルにリンクしてもエラーが出てしまいます。 >270さんに紹介してもらったclootieというサイトで DLしたライブラリだとなぜか上手くいきました。 前者のファイルでおこったエラーは以下の通りです。 Error: 'C:\BORLAND\DIRECTX\LIB\X86\D3D8.LIB' contains invalid OMF record, type 0x21 (possibly COFF) どういう事でしょうか。教えてください。お願いします。
312 :
271 :2005/08/17(水) 21:02:21
自己解決しました。すいません。
313 :
271 :2005/08/17(水) 21:17:54
????
>>310 固定機能なら D3DTOP_MODULATE2X でいけるんじゃない?
>>311 LIBファイルの変換が必要
詳しいことはBorland C++スレで聞け
317 :
デフォルトの名無しさん :2005/08/17(水) 22:40:35
>>315 SetTextureStageですね、MDULATE2XかADDSIGNEDがそれっぽい感じがします
他にも色々なことができるみたいですね、ありがとうございました
318 :
311 :2005/08/17(水) 22:54:54
319 :
デフォルトの名無しさん :2005/08/17(水) 23:03:24
>>313 少しも自分で調べようとしないで人に片っ端から聞きまくって恥ずかしくないの?
Directx8で質問です ライティングを有効にすると頂点カラーは使えないのでしょうか?
質問する前にまずステートのヘルプを読め。
323 :
321 :2005/08/18(木) 12:09:43
ライティングを無効にするとDIFFUSEに頂点カラーが入って 有効にするとライティング計算済みの色がDIFFUSEに入るということでしょうか?
ヘルプを読め。
325 :
321 :2005/08/18(木) 12:29:46
ってことはできるということなのでしょうか? 読んでも見つからないっす COLORARG1にD3DTA_TEXTURE COLORARG2にD3DTA_DIFUSE を設定して COLOROPにD3DTOP_MODULAT を設定してるのですが これだとD3DTA_DIFUSEはどちらかになりますよね? 他になにか設定必要なのですか D3DA_TEMPって一般的には使って良いのでしょうか? 例えば、例えばフェードアウトとか半透明表示する場合のアルファレートなどに 後、レジスタの値をどこで設定するかわかりません、デフォルトは0.0.0としか書いてない
俺からも言おう。ヘルプを読め。 TextureStageStateだけでなく、RenderStateのところも読め。 D3DA_TEMPはテクスチャステージの途中の段で値を一時的に 保存しておくためのもの。D3DTSS_RESULTARGで書き込む。 確認してないが、シェーダ使えるチップならみんな使えるんじゃない? 逆に言うと、シェーダが使えないチップではまず無理。
全然無理じゃないが。
はい
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。 「ググれ」「SDK見れ」以外の回答でおながいします。 お前ら天麩羅嫁
ここに限らず2ch全体が、ググれ、ヘルプ読めで停滞しているからな
>>329 取り扱い説明書見れば書いてあることを
わざわざ文章書いて説明しろってのも変な話だ
取り説のこの文章の意味がわからん
なら話は違ってくるがな
つーかお前が教えてやれよ
ねテンプレに従えないならレスするなよ こなんのためのテンプレだ 大アホか 好 き
質問があるのですが、 よくテクスチャサイズは2のべき乗にしなさいと言われますが、 これは縦と横のサイズも同じじゃないとだめでしょうか? (例)256x256はOK, 256x128はNG
256x128でもOK
338 :
321 :2005/08/18(木) 18:50:02
SetRenderStateの所読みました D3DRS_COLORVERTEXって何ですか? これをFALSEにしても頂点カラーが有効のままなのですが これはなにか根本的に設定が間違ってたりするのでしょうか?
339 :
337 :2005/08/18(木) 18:52:18
('A`)ハァ…
340 :
321 :2005/08/18(木) 18:56:21
即レスであきれるような事書いて申し訳ないです でもわからんのです
341 :
デフォルトの名無しさん :2005/08/18(木) 18:56:39
バトルフィールド2のような細かい起伏の地形を作ろうと頑張っていますがどうにも上手くいきません。 現在碁盤の目のようにプリミティブを配置し、頂点のy座標に高さを持たせて起伏を表現しています。 細かくすると視野内(〜FogEnd)だけでも数千になり、DrawIndexedPrimitiveで一括描画してもかなり重いです。 荒くすると大雑把なマップになりますし思ったような地形を組むことができません。 xファイル1つでマップ1つを表示させるのは作るのも表示させるのも無謀ですよね。 クォータービューの2Dっぽいゲームなら碁盤の目のようにプリミティブ(頂点)を置いても問題ないですが、 3Dのゲームだとこのやり方は適さないのでしょうか? 地形の作成・描画方法について何か参考になるようなことをご存知の方がいればアドバイスをお願いします。 DirectXで作っていますがアルゴリズムの質問なので聞くところ間違えてたらすみません。
>>340 だから、SetRenderStateじゃなくて
>>337 の「Render States」のページは読んだのか?
「Per-Vertex Color State」の説明でわからないなら俺にはお手上げだ。
正方形じゃなきゃ駄目というビデオカードはないだろ DirectXにそんなCaps項目ないし
>>344 はたぶん2のn乗にしろってことの意味を理解してないのだろう
347 :
345 :2005/08/18(木) 20:36:00
ちと調べてみた。D3DCAPSのMaxTextureAspectRatioだな。
348 :
321 :2005/08/18(木) 20:42:50
長々と申し訳ありません、 なんとか出来たような気がします アンビエントライト、ディフューズライトの設定で 頂点カラーの色を飛ばしてしまっていました これの計算式は、 ディフューズライトx頂点カラー+アンビエントライト になるのでしょうか? ディフューズライトが当たっていない部分は頂点カラーの色が無くなってしまうのですが
349 :
345 :2005/08/18(木) 20:44:08
>>341 そういうのはLODの考え方を採用するべし。
遠いものは荒いメッシュで、近くのものは細かく描画。
具体的なアルゴリズムに関しては長くなるので…
LODで調べれば何かヒットするでしょ。
>>345 >>347 指摘サンクス
dxinfoで調べてみたら、S3 ProSavageがMaxTextureAspectRatio=1だった
こんな環境も存在するのね・・・
>>346 もちろん理解してるよん
351 :
デフォルトの名無しさん :2005/08/18(木) 20:54:26
>>348 頂点カラーの色を無条件にそのまま加算したければ、
D3DRS_EMISSIVEMATERIALSOURCEでEMISSIVEに
頂点カラーを使用する指定を行う。
アンビエントカラーの影響を考えたいなら
D3DRS_AMBIENTMATERIALSOURCEに頂点カラーを設定。
他の部分のマテリアルソースもちゃんと調整すること。
352 :
351 :2005/08/18(木) 21:04:34
×アンビエントカラー 〇アンビエント光
353 :
341 :2005/08/18(木) 21:19:47
>>349 ありがとうございます。早速調べてみたいと思います。
新しい単語が出るとなぜかワクワクしてしまう(ノ∀`)
>>354 終了ボタンってなんだよバカ
そもそもBCCを疑うぐらいならVCTK使え
512x512などの大きいテクスチャを用意しておいて 読み込むときに256x256に縮小することってできますか?
>>356 D3DXCreateTextureFromFileExでWidthとHeightを指定しる
描画処理の負荷を計測したいのですが、 描画前にtimeGetTime()を実行し Presentメソッドを呼び出した直後に再度timeGetTime()を実行すると その差分が描画にかかった時間になるのでしょうか?
ならない
ではどうすれば良いでしょうか?
もの凄いアホな質問で申し訳ないのですが、 描画負荷を大きくするとPCからノイズのような音が聞こえてきます こいつはなんなのでしょうか? もう1台のPCの方では特に変化はありません ノイズが鳴る方のPC アスロン64 3200+ Radeon9600 ファンレス ノイズが鳴らないPC P4 1.8G GeforceMX440 ファンレス SpeedFanでファンの回転数を見ても変化していません(つД`)
>>361 音響系の配線の引き回しに注意。ボードやましてチップが原因ならお手上げだけど、
大抵は筐体内の配線を見直すだけで改善する(かも知れない)。
>>363 怪現象などではなくて、普通にありえる問題ということでしょうか?
スピーカーは繋いでません、サウンドはオンボードで近くのPCIスロットを使用しているとかではないです
CPUだけに負荷をかけても影響ないので、ビデオカードに負荷をかけると
干渉?してノイズが出るという感じでしょうか?
とりあえず壊れるような問題でなければこのまま使うことにします
ありがとうございました
>361 それはマザボが死にかけてるよ。自作PC板参照。
>>365 マジですか、買ってから1ヶ月・・・orz
自作板逝って来ます
ちなみにDOSパラのショップブランド・・・
ビデオカードは3年ぐらい前に買ったものですが
何で俺と同じような人をココで見かけるんだ… うちもノイズが入って仕方が無い。 Radeon9600 Athlon 1.2GHz SW1000XG というカードからノイズが混入している模様。 気温が高いと特に乗りやすく、ウィンドウをスクロールしただけで出たりする。 とりあえずスレ違いsage
うちもGPUの高負荷時にノイズが聞こえたことがあったけど、 そのときは電源が原因で、別の電源に交換したら鳴らなくなった。 スイッチング回路のコイルが物理的に振動していたらしい。 マザボのコイルが鳴るってのもあるみたいだね。
CPUの動作ノイズをラジオに拾わせて音楽を奏でていた時代もあったらしい パソコンどころかマイコンという言葉すらメジャーではなかった時代の話
VCToolkit落としたんですが、DirectX開発環境にしたいのです。 どうすればいいでしょうか?
そういう質問をする人間には向かない開発環境なので、 知識がなければお金を出して開発環境を買ってください。
コンデンサも振動するぞ。 よくある話なのでそれほど気にしなくてもいい。
自作からの誤爆の上、すでにスレが流れているところに今頃レスとは…。
>>374 スレを汚してすみません
Directxで負荷が大きい描画やPresent命令を短期間で何度も呼び出したりしてると
なんか変な音が聞こえてきて、気になったので書き込みしました
普段使ってるときはそんな音全然聞こえなかったので・・・
レンダリングステート設定のD3DSHADE_GOURAUD指定の グローシェーディングは、RadeonやGeForce等のビデオボードが 無いと補間されないのでしょうか?
すみません。
BCCでDirectXを動かそうとしているのですが、
ttp://www.kohgakusha.co.jp/books/detail/4-7775-1112-X この書籍の2Dプログラムのサンプルコードをビルドすると
Error: 外部シンボル 'DXTraceA' が未解決(D:\MYPROG\JUNK\TEST4\DEBUG\DXGSAMPLE04.OBJ が参照)
Error: 外部シンボル 'Direct3DCreate9' が未解決(D:\MYPROG\JUNK\TEST4\DEBUG\DXGSAMPLE04.OBJ が参照)
とエラーコードが出てしまいます。ライブラリはclootieのです。
原因を教えてください。お願いします。
>>377 bcc32.cfg、ilink32.cfg のDirectXライブラリのパスを
-L○○○○;×××× ←尻にではなく、
↓頭に追加
-L××××;○○○○
>>378 ありがとうございます。
しかし、上手くいきませんでしたが、
リンクするライブラリを本書のp26の通りに変えて
リリースと上手くいきました。
ですが、コンパイルが上手くいっても
白紙のウィンドウで全く動きません。
エラーは全くないのですが、どういう原因が考えられる
でしょうか?
その本は持ってないから分からんが、 2D ならテクスチャが読み込めてないとか?
上の人と同じくBCCでDirectXを使いたいのですが 下のエラーが出てコンパイルできません。 コンパイルできるようにするにはどうすればいいんでしょうか? エラー E2268 C:\Program Files\Microsoft DirectX 9.0 SDK (August 2005)\Include\d3dx9math.inl 1578: 未定義の関数 'sqrtf' を呼び出した(関数 D3DXVec2Length(const D3DXVECTOR2 *) )
DX9c(2004December)にしたら、文字列表示関数を使ったら、 悉くコンパイラーにはじかれるようになったorz エラーが出るのは仕様変更されたみたいだけど、意味が分からないorz (省略) //フォントの設定 LOGFONTLogFont ; LogFont.lfHeight = 16 ;//高さ( 0 で標準) LogFont.lfWidth = 0 ;//横幅( 0 で自動 ) LogFont.lfWeight = 1000 ;//太さ( 0 〜 1000 の範囲 : 100 刻み ) LogFont.lfItalic = FALSE ;//斜体 LogFont.lfUnderline = FALSE ;//下線 LogFont.lfStrikeOut = FALSE ;//打ち消し線 LogFont.lfCharSet = SHIFTJIS_CHARSET ;//文字コード lstrcpy(LogFont.lfFaceName, FONT_NAME1);//フォント設定( "" で標準 ) D3DXCreateFontIndirect(lpD3DDevice, &LogFont, &lpFont);//フォントを初期化 lpFont->OnResetDevice(); (省略) //文字描画 lpFont->Begin(); RECT rc = {0, 100, 200, 200}; lpFont->DrawTextA(NULL ,"文字表示", -1, &rc, DT_LEFT | DT_NOCLIP, D3DCOLOR_ARGB( 255, 255, 255, 255)); lpFont->End(); (省略)
>>381 #define sqrtf(f) (float)sqrt(f)
>>382 2004Octの日本語ヘルプを落とすとよろし。
385 :
デフォルトの名無しさん :2005/08/22(月) 17:27:14
ポイントスプライトなんですが D3DRS_POINTSPRITEENABLEのヘルプの説明がよくわかりません。 これがTRUEになっている時は ビルボード表示の為に、4スミのテクスチャ座標が生成されるというのはわかるんですが FALSEの場合、どのような動作をするのかわかりません。 ヘルプでは、 >FALSE の場合、頂点テクスチャ座標はポイント全体で使われます。 >D3DRS_POINTSPRITEENABLE が FALSE に設定されている場合は、頂点テクスチャ座標は頂点それぞれで複製されます。 とあります。どういう意味でしょうか?
386 :
デフォルトの名無しさん :2005/08/22(月) 19:53:24
本の付録についてるDirectX SDKについて質問ですが、 これがあればspy++使えますか?
Spy++はVisualStudioに付いてくるツールだが。
388 :
379 :2005/08/22(月) 20:08:25
アニメーション付きのxファイルを再生するプログラムのサンプル、 もしくはサンプルを公開しているサイトを教えてください もの凄いくアホで申し訳ないです とっかかりがまったくわかりません
ウインドウモードでカーソルのちらつきを抑えるのってどうやるんですか? 一応SetCursorPropertiesでのソフトウェアエミュレーションは試してみたんですが何も効果なし… ご存知の方いらしたら教えてください。
392 :
391 :2005/08/22(月) 23:50:17
追記です。 描画したクライアント画面そのものはまったくちらつかないんですがマウスカーソルだけがちらつく状態です。
マウスカーソルは表示させないでおき、 独自にマウスカーソルを描画するとかどう? いや、テキトーなこと言ってるけど。
>>385 「頂点テクスチャ座標は」を「(元の)頂点のテクスチャ座標が」に変えれば少しは意味が通るかと。
「頂点それぞれ」ってのはスプライト生成後の四隅の各頂点のことね。
マイクロソフトの手抜き翻訳は何とかならないもんかねぇ・・・。
D3DXMatrixShadow() を使って平面にキャラを投影してシャドウを描こうとしているのですが、 この関数で得られた行列をワールド行列としてモデルを描画すると Zテストが正しく行われていないかのような描画結果になってしまいます。 まずキャラを描画し、次に地面の近くの平面に投影しているのですが、 ぺったんこになったキャラが、最初に描いたキャラで隠面消去されずに描画されてしまいます。 この問題はどういった原因が考えられますでしょうか?
プログラム通りの正しい結果が得られているので、何も問題はない。
質問です。 pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME ) でワイヤーフレームの描画を試みていますが、ポイントスプライトがワイヤーフレームではなく、 元のテクスチャが表示されてしまいます。何か他にステートを変更する必要があるのでしょうか? 開発環境: SDK:9.0(June) グラフィックボード:RADEON9000Pro
398 :
395 :2005/08/23(火) 10:09:06
>>396 シャドウのポリゴンが隠面消去されずに描画されてしまうという状態が起こっているのですが、
これは問題ではないということでしょうか。
なにかレンダーステートで足らない設定があるのでしょうか?
399 :
379 :2005/08/23(火) 13:10:46
>>380 49uperの73429です。
画像が特殊なのかddxという形式でよく分かりません。
エラーの原因を教えてください。
400 :
385 :2005/08/23(火) 16:10:44
>>394 今わかったんですが
D3DRS_POINTSPRITEENABLEがFALSEの時って
ポイントスプライトを使わない普通のポリゴン表示モードなんですよね。
ヘルプの意味はわかりませんでしたが、単にポイントスプライトのフラグとだけ
覚えておけばいいみたいですね。
お答えありがとうございました。
>>395 ワールド行列には、投影行列をそのままじゃなくて、
(キャラクタ自体のワールド行列)×(投影行列)を設定しているかしら。
402 :
395 :2005/08/23(火) 17:11:19
>>401 はい、行列は (キャラクタ自体の回転行列)×(平行移動行列)×(投影行列)×(カメラ行列)
という順番で設定しています。
先程気が付いたのですが、光源の位置を、
light(0.0f, 1000.0f, 0.0f, 1.0f);
というように、Y軸上に置いた場合だけは問題が起こらないみたいです。
よろしくお願いします(´・ω・)
ピクセルフォーマットが24bitのbmpを16bitのサーフェスに読み込もうとした場合、 bmpのピクセルフォーマットはは自動で16bitに変換されるのでしょうか。 それとも、自分で処理したいと駄目なんでしょうか。
最近、2次元でしか抜けなくなってきたのですがDirectXの力で何とかならないでしょうか
>>404 おまいに必要なのはDirectseXだ。
>>393 うーん、それだとタスクバーとクライアント領域の中間でカーソルが表示されない空白地帯ができないですか?
>>402 とりあえず、おかしくなるときのキャラクタ座標、ライト、平面の
数値を例で挙げてみて。
あと、まさかWバッファは使ってないわね。
408 :
395 :2005/08/23(火) 21:34:27
>>407 レスありがとうございます。
キャラクタは、XZ平面上に立っている人型モデルです。
高さはY座標で20.0f程度です。XZ平面上のどの場所にいても起こります。
ライトは、
D3DXVECTOR4 light(100.0f, 100.0f, 100.0f, 1.0f);
D3DXVec4Normalize(&light, &light);
という感じに設定しました。正規化をしないとシャドウが消えてしまうみたいです。
平面は、
D3DXVECTOR3 point = D3DXVECTOR3( 0.0f, 0.01f, 0.0f ); //平面上の一点
D3DXVECTOR3 normal = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); //法線
という感じです。
Wバッファは使っていません。Zバッファは16ビットです。
カメラのZNearとZFarを色々と変えてみたのですが、変わりありませんでした。
>>408 ライト座標の正規化は不要(しても意味がない)のはずだけど、
それで結果が変わるのはおかしいわね。
リファレンスラスタライザで試してみて。
410 :
395 :2005/08/24(水) 00:32:45
>>409 ライトは正規化しても意味がないのですか、怪しいですね。。
リファレンスラスタライザで試してみましたが、結果は同じでした。
うーん。。
D3DXMatrixShadowに渡すpLightってのは 位置座標だろ、正規化しちゃ駄目だろ。 隠面消去されないってのもおかしい。 Zバッファリングが有効になっていれば必ずされます。(当然その他もろもろの設定が正しいとして) どうなるべきのものがどう違っているのか、もっと詳しく述べるべき。 俺はD3DXMatrixShadowを使ったことないから正確じゃないけど これはZバイアスがいるんじゃねーの?
>>411 pLightは同次座標だから定数倍しても位置は不変なんだけど・・・
413 :
395 :2005/08/24(水) 02:50:08
>>411 Zバッファは有効になってますし、シャドウ以外のモデルは正しく隠面消去が行われてますです。
Zバイアスというのは知らなかったので、先程使ってみたのですが、
Value値を16にしても何も変わりませんでした(つД`)
http://gamdev.org/up/img/3062.jpg これが症状です。シャドウは床スレスレに存在しているのですが、なぜか兵士の上側に
描画されてしまっています。
415 :
395 :2005/08/24(水) 13:07:10
どうも、解決しました!
>>414 のリンク先が参考になりました。
これまでシェーダーに以下のように記述してました。
float3 position;
position = mul(float4(vertex.pos, 1), (float4x3)matWorld);
position = mul(float4(position, 1), (float4x3)matView);
ret.pos = mul(float4(position, 1), matProjection);
これを以下のように修正しました。
float4 position;
position = mul(float4(vertex.pos, 1), matWorld);
position = mul(position, matView);
ret.pos = mul(position, matProjection);
これまでワールドビュー変換では、W成分を使わなかったのですが
平面投影行列を使うとW成分を使うことになるので、射影変換の結果がおかしくなっていた
ということでしょうか。どうも皆さんありがとうございました!
いえいえ、僕は何もしてませんので
417 :
379 :2005/08/24(水) 15:39:32
>>417 >>399 と
>>417 のreleaseのEXEを実行すると、どちらも、
青い背景に、「DirectX graphics サンプル」と言う文字がフェードイン、フェードアウトを繰り返してるけど・・
>>415 D3DXMatrixShadowの行列は一般に4×4のすべての成分が非ゼロになるからね。
この機会に、同次座標や射影幾何学について理解を深めてみると面白いと思うよ。
とりあえずは、pLightやpPlaneの4次元ベクトルを適当に定数倍しても影が動かないことや、
pLightのw成分だけを0に近づけていくと光源が遠ざかっていくことなどを観察してみましょう。
420 :
379 :2005/08/24(水) 16:40:23
>>418 そうです。それを自分でコンパイルするとエラーは出ないのですが、
白地のウィンドウで止まってしまうんです。なぜでしょうか?
421 :
395 :2005/08/24(水) 17:21:49
>>419 同時座標などは考慮せずにやってきましたので、、勉強してみようと思います。
射影幾何学ですか、面白そうですね。
>>420 おまいのPCのグラフィックカードが酷くオンボロ
nVidiaのサンプルソースコンパイルしようとすると、 incorrect version of Direct3D というエラーが出ます。 d:\bld_sdk7.pl\devtools\sdk\9.5\sdk\libs\src\dxut\dxut.cpp(494): D3DXCheckVersion hr=Unknown (0x80040909) という出力がでており、うまくバージョンが取得できていないようですがなにが問題なんでしょうか? 環境は VS.NET 2003 C++. DirectX 2005 Aug. VideoCard GF6600GT です。 他の自作プログラムやらなんやらは普通に動きます。
>>379 ヒント:戻り値
ヒント:DirectX コントロールパネル
425 :
379 :2005/08/25(木) 13:06:00
>>422 >>424 アドバイスありがとうございます。今から模索してみます。
それから情報の小出しスマソ。
DirectXランタイムというのを使うとエラーらしきものが出ました。
Direct3D9: (ERROR) :HAL Disabled: Device doesn't support texturing
上手くいかない原因に関係あるでしょうか?
428 :
デフォルトの名無しさん :2005/08/25(木) 15:47:48
そういえばMilleniumでゲームやると、 テクスチャが張られなくて全部真っ白(影はある)だった事があったなぁ。 いまどきテクスチャに対応してないカードってなんだろ・・・
429 :
379 :2005/08/25(木) 16:44:39
>>426 >>427 ありがとうございます。
グラフィックボードは
ATI RAGE Mobility P/M PCI (A21/2)
というらしいんですが、
動作はできても、作成する事ができない
ことってあるんですか?
ATI RAGE って DirectX 6 くらいの世代? ちょっと古いね。 本にはコンパイルずみのバイナリーは付いてないの?
431 :
379 :2005/08/25(木) 19:56:57
>>430 すみません。バイナリーの意味が分からないので
もう吊ってきます。
つまり、すでにできあがって exe になっているやつ。
てかGF2MXですらHALでの初期化に失敗するんだからそんな ノーパソのオンボのグラボじゃ無理でしょ・・・
DirectX 9.0c SDK August 2005使ってます。 なぜかピクセルシェーダがセットされません。 シェーダはコンパイルもセットも成功しているようなのですが、 まったく反映されないのです。 どうもデフォルトのシェーダみたいなものがセットされているみたいで、 SetPixelShaderをすっとばしても描画はされます。(意図したものではない) 問題がどこにあるか、お分かりになる方はいらっしゃいますか?
435 :
434 :2005/08/26(金) 07:04:33
書き忘れました。 使用ハードはパナのR3Eで、チップセットが855GME(GPUは82855?)です。
>>434-435 ピクセルシェーダを使いたい場合には、デバイス作成時に必ず
IDirect3DDevice9::GetDeviceCaps で PixelShaderVersion をチェックしなさい。
437 :
434 :2005/08/26(金) 08:57:30
>>436 どうもです。
DeviceCapsはDirectX Caps Viewerで確認することはできませんか?
今はps_2_0でコンパイルしていますが、
非対応の場合はコンパイルエラーになりませんか?
>>437 で、Caps Viewerで確認したらどうだったんだ?
なぜ非対応だとコンパイル時にエラーが出ると思うんだ?
>>437 >非対応の場合はコンパイルエラーになりませんか?
そのコンパイラくれ。
directx8で質問があります 方向ライトを当てたときの光が当たったときの明るさを制御したいです ちょっと説明しにくいのですが、 光に対し面の傾きが 角度0 = 100% 角度45 = 50% 角度90 = 0% のときは、こんな感じだと思うのですが、これを 角度0 = 100% 角度45 = 25% 角度90 = 0% のように2乗にするとかで、光の当たりを極端にすることはできるのでしょうか?
>>438 Caps Viewer上のどこを見てよいのか分かりません。
PS20Capsという項目があるので対応しているのではないかと思いましたが、
そう判断していいのかが分かりません。
ps_2_0非対応のデバイス使用時にD3DXCompileShaderでエラーになるのではないかと。
>>439 そちらの環境ではD3DXCompileShaderは使えませんか?
>>441 [D3D Device Type]->[HAL]->[Caps]のPixelShaderVersion。
あと、コンパイルの段階ではビデオカードが非対応でもエラーは出なくて、
その後でD3DXCreatePixelShaderを呼んだときにエラーになるはずだわ。
D3DXAssembleShader じゃなくて D3DXCompileShader を使ってるみたいだけど、
アセンブラじゃなくHLSLなのかしら、それならエフェクトの方が
楽じゃないかしら。
443 :
434 :2005/08/26(金) 11:32:21
前回名前入れ忘れたorz
>>442 PixelShaderVersion確認できました。ありがとうございますです。
CreatePixelShaderのエラーコードを華麗にスルーしてましたorz
どうもお騒がせしました。
なお、PixelShaderVersionが2.0のPCでは問題なく表示できました。
CF-R3Eはこれが0.0・・・、って一切対応していないのか。
>アセンブラじゃなくHLSLなのかしら、それならエフェクトの方が
>楽じゃないかしら。
エフェクトの効果をよく理解していないのではずしているかもしれませんが、
テクスチャの重ね合わせ処理にピクセルシェーダを使ってます。
重ね重ね、どうもありがとうございました。
444 :
デフォルトの名無しさん :2005/08/27(土) 03:03:31
質問です。 バンプマップのときのtangentとbinormalって、頂点ごとに1つなのでしょうか? 三角形ABCと三角形CDEと三角形CFGとあったとき、 頂点Cのtangentとbinormalは1つと考えてもいいのでしょうか?
446 :
デフォルトの名無しさん :2005/08/27(土) 03:12:07
>>445 レスありがとうございます。
足して、正規化しちゃっていいということでしょうか?
447 :
デフォルトの名無しさん :2005/08/27(土) 04:20:51
これからDirectXを始めようと思うのですが、手元にDirectX 5の本があります。 最近API仕様がけっこう変わってると聞くのですが、DirectX 5で勉強しといても問題ありませんか? 最近の仕様のほうが分かりやすいインターフェースだとすればそちらを勉強したほうがいいのかな、とも思います。 アドバイスお願いしますです。必要なら新しい本を買おうと思ってます。
448 :
447 :2005/08/27(土) 04:22:13
書き忘れたのですが、基本的に使う機能は2Dのみで、新しい機能を使うつもりはないです。
せめてDirectX7にしなさい
そして8以降を使おうとするとあまりの変わりっぷりに愕然とする罠
>>447 基本的に2Dっつってもポリゴンで2Dっぽく描画するか、
ほんとに2D描画なのかってところでわかれるんだけど
DirectX8,9ぐらいになるとDirectDrawが削除されてるから、
ポリゴンで2Dっぽく描画するしかなくなってる。
もう、プログラマとしての発展はのぞまねーよ。ただ、2Dゲーム(ショボイ)をつくれりゃいいんだよ。
っていうなら、多分、DirectDrawでほんとに2D描画したほうが手っ取り速い。
でも、プログラマとしてもスキルアップしていきたいな。もし、できるなら将来3Dも触ってみたい。
っていうなら、DirectX9推奨。
452 :
451 :2005/08/27(土) 11:56:58
ただ、ホントにショボイ機能しかないから気をつけて。 AVGのキャラのまわりの淵を市販のゲームみたいに綺麗にしたいとかDirectDrawでやろうとすると yaneSDKとかに頼ったりした方がいいかも。 もう、こういう小細工とかやろうとするとすげー知識いるからそのつもりで。 誰かのライブラリにたよることでなんとかなるかも? じゃあDirectX8,9ではその辺楽になってるのかというと、そうでもなくてだな。 今度はアルファ云々の3Dまわりの知識が必用になる。
2Dのライブラリだったら、DXLIBがいいと思うよ。
>>449-453 ありがとうございます。
ドット絵の貼り合わせでゲームを作るつもりなので
DirectDrawで十分かな、と思いましたが、新しいバージョンだと使えないんですね…
ビットマップ描画するにも、テクスチャにして、ポリゴンの表面に貼り付ける、
って形になるのでしょうか。(基本的な概念もよく分かってないので変な言葉使ってたらごめんなさい)
3D機能は後々使っていきたいので、DirectX9にチャレンジしようと思います。
いろいろ新しいこと勉強する覚悟で。(3D周りの理論?とか)
DXLIBも検討してみます。
ありがとうございました。
D3DXSPRITEは無かったことにされてるんだなw
自分は
>>451 氏の言うショボイゲームでも作りたいのですが、
どうすればいいですか?
前バージョンの開発キットのようなものは残ってないですか?
ようなものってアンタ…
461 :
460 :2005/08/27(土) 21:07:46
っていくら過去の記事を溯っても、それらしい物が見当たらないのですが…
よくわからんがDirectXが特集されてる号のCD-ROMに入ってんじゃないの?
>>456 #define DIRECTDRAW_VERSION 0x0500
#include <ddraw.h>
上のほうで無かったことにされてるD3DXSpriteを使ってるんだけど、 それで描画したドット絵を拡大してみると ふちがアンチエイリアスぽくなってる。 バイリニアフィルタ?のせいらしいんだけど、 これをかからなくする方法を教えてください。
467 :
460 :2005/08/28(日) 00:27:04
>>462-465 皆さんありがとうございます。
>>464 氏のこれってまさか
最新のバージョンのDirectXでもDirectDrawが使えるってことですか?
すみません。勘違いだったら…
開発キットとかぬかして、お手間取らせて
>>463 氏ごめんなさい皆さんごめんなさ(ry吊ってきます。
>>468 私は466ではありませんが、フィルタがかかっているのが常に嬉しいとは限りませんよ。
ドット絵とかだったら、そのまま拡大したいときもあると思います。
私は別の理由でしばしばMAGFILTER切ったりしますよ。
って、あれ?MAGFILTERならSetSamplerStateだよな。
466氏の要望はどっちだべ?
フィルタが必要かどうかは、好みや、実現したい表示によるわな。 フィルタをかけるのが綺麗とは限らない。
472 :
466 :2005/08/28(日) 01:34:22
私はドット絵の細い線がにじんだりするのがイヤです。 拡大縮小しないでそのまま描こうとしてもにじむのを何とかしたい。 ds.d3ddev->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); ds.d3ddev->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_POINT ); ds.d3ddev->SetSamplerState( i, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); とりあえずこれやってみたけど効果なかったorz どうするんでしょう?
みんな人が悪いな。縁の滲みが気になるんだから
clampの設定がマズいんでしょ。
>>472 D3DSAMP_ADDRESSU
D3DSAMP_ADDRESSV
この設定だと思われ。
>ところでなんでOFFにしたいんでしょうか? 2chではこういう返しをする奴多いけど なんでだろ?
2chだからってわけじゃないだろ
>>473 俺も始めそれかと思ったんだけど、
細い線がどうとかいってるから違うと思われ。
理由を聞くのは要求仕様策定の基本だろ?
>>474 もしかしたら、フィルタを消したいわけじゃなくて、
>>473 の問題で悩んでるんじゃなかろうか?と考えた。
なんつーかね。
質問する側が
「作ってるもんの現状がどんな状態で、こういう風にしたい。」
ってのがなくて、ただ、
「アンチエイリアスっぽくなってる、バイリニアフィルタじゃなかろうか?」
っていってるから、
「それってバイリニアフィルタが問題じゃねーんじゃねーの?
そもそもなんでフィルタ消したいの?」
って疑問が回答者から消えない。
だから、
「どうしてそれがやりたくて、結果どうなってほしいのか?」
ってのがこっちから聞かなきゃならない。
で、結局、バイリニアフィルタをOFFにしても問題は解決していない(かもしれない)わけだ。
とりあえず、
>>472 はそのコードでバイリニアフィルタのON・OFFが効いてるのかどうか
もっとわかりやすい画像で試してくれって感じだな。
>>473 で解決するなら、質問者の言う"ふち"というのは、
テクスチャそのものの"ふち"ということになるけど、
そうなのかな?
>>466 どの
>>470 >拡大するならなおさら、かかってた方が綺麗な気がするけど。
>具体的にどういう場合なの?
質問者のケースはドット絵、例えば32x32のアイコンを
拡大して見せたいような場合はフィルタ切りますな。
あとは、ビデオのインタレースをそのまま表示したい場合とか。
>>472 サンプラステ−ジインデックス合ってる?
>>472 > 拡大縮小しないでそのまま描こうとしてもにじむのを何とかしたい。
テクスチャの幅が 2の累乗じゃないのでは?
最近は該当部分のコードやスクリーンショット、開発環境も教えないで質問者を試すような事をするのが流行りなのか?
483 :
464 :2005/08/28(日) 02:55:32
>>467 そゆこと。これを使えば最新のSDKだけで過去の資産も生かせる。
ほかにもDIRECT3D_VERSIONとかいろいろあるよ。
ちなみに、DX8以降ではDirectDrawの更新が凍結されたので、
DIRECTDRAW_VERSIONはデフォルトで0x0700になる。
だから、DX7のDirectDrawは最新のSDKでそのまま使えるはず。
484 :
466 :2005/08/28(日) 03:10:43
>>478 その通りです。
現状は、絵をそのままの大きさで描画するときに、
細い線や絵がアンチエイリアスがかかったように滲むので
それを滲まないようにしたいです。
バイリニアと書いたのは一番症状が近いかなと思ったもので、
確信があるわけではないです。
>>479 サンプラステージ
たぶんあってます。
デフォルトは0ですよね?一応不安になって0から7までforで回してみたんでiになってますけど。
>>480 テクスチャの幅
64*512 スプライトで表示するときは64*64
一応512*512にしてみたけど変化ないです。
今のところ、SetRenderStateもSetSamplerStateも、いじってみても変化がない。
なんだか根本から間違ってるような気がしてきた。
ゲ製作にDirectX7使ったゲームのソース転がってるじゃん
位置座標を-0.5ピクセルずらすとか。
>>484 ステートの変更はBegin-End間でやってるか?
ID3DXSpriteはブラックボックスだから何ともいえないが。
488 :
466 :2005/08/28(日) 12:23:38
解決しました。
根本的な原因はバックバッファとウィンドウのサイズが微妙に違うということでした。
そりゃぁにじむに決まってる。
で、それを直した後もにじんでたのは
>>487 でした。
Begin-End間でもやってみたことはあったんですが、ウィンドウのサイズを直す前だったので、
場所は関係ないのかと思って別の場所においたのが原因みたいです。
>>486 -0.5ピクセルずらす
念のため-0.5ピクセルずらしてますが影響はないようです。
Begin End間で
ds.d3ddev->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
を行えば同サイズでの描画の際に、にじみはなくなるようです。
数々の助言ありがとうございました。
489 :
473 :2005/08/28(日) 16:14:06
漏れが読み違えてたか。 まぁ、解決してヨカタね。
Directx8での描画の最適化で質問があります、 ヘルプに載ってるパースペクティブ補正は必要なときだけとありますが、 これはどの命令で変更するのでしょうか?それっぽいのが見当たりません またSetRenderStateのD3DRS_NORMALIZENOMARLSはどういう意味があるのでしょうか? パフォーマンスに影響無いように思えるのですが
>>490 DX7以前はD3DRENDERSTATE_TEXTUREPERSPECTIVEで手動でオンオフできましたが、8から消えました。
デバイスのD3DPTEXTURECAPS_PERSPECTIVEが有効になっている限り、自動的に補正がかかります。
現在のグラフィックスハードウェアはパースペクティブ補正を前提に設計されていますので、
たとえ無効にできたとしても、速度の向上はほとんど見込めないと思います。
>>492 win2k対応は(December 2004)まで
日本語ヘルプが出てるのは(October 2004)まで
495 :
492 :2005/08/29(月) 18:54:07
なるほど。 解決しました。 dxguid.lib(dxguid.obj) : fatal error LNK1103 というリンクエラーが出たのでファイルが壊れてるのかと 入れ直そうといろいろ調べていた所だったのです。 上のエラーが無くなったのは October 2004 のでした。 ググってみると VisualStudio6 との問題らしいです。 ありがとうございました。
DirectDrawの質問で、フルスクリーンではなく 通常のウィンドウを初期設定したいのですがどうすればいいですか?
497 :
デフォルトの名無しさん :2005/08/30(火) 23:38:39
( ゚Д゚)y─┛~~ さて、この馬鹿をどうしてくれようか
∧¶∧ ( ・∀・) 市中引き回しの上火あぶり ( ∪ ∪ と__)__)
殿!!
Direct3D 9でGetRenderTargetData()を連発して呼ぶと、数秒後にシステム 全体がフリーズしてしまい、リセットボタンを押す羽目になります。 GetRenderTargetData()を呼び出す間隔をある一定以上にすると 問題はありません。他の方はどうですか? うちは、Athlon64 3200+ Geforce6800(ドライバ77.76)を使用しています。
>>496 の馬鹿ですが、
SetCooperativeLevelでDDSCL_NORMALを設定すると
思うのですが、サーフェイスを作成するところで躓いてしまいます。
DirectDrawの初期化については
ttp://www.cnet-try.ne.jp/akiji/directx.htm こちらのサイトのソースを参考に拝借させてもらってます。
フルスクリーンから通常のウィンドウモードにするには何か他に手順が必要なのでしょうか?
低脳な質問ですが教えてください。おながいします。
502 :
デフォルトの名無しさん :2005/08/31(水) 18:03:35
DirectInputでキーボードのAが押されたらA、Bが押されたらBと表示させるには switchやテーブル変換等を使って表示させるしか方法ないですか?
503 :
デフォルトの名無しさん :2005/08/31(水) 19:19:17
>>502 ヘルプのDirectInputのチュートリアルは読んだかな?
アレは中々上手い方法でやっているので一度は読んでみることをオススメする。
>>503 ありがとうございます。早速読んでみました。
これのことですよね?
#define KEYDOWN(name, key) (name[key] & 0x80)
g_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if (KEYDOWN(buffer, DIK_RIGHT));
// Turn right.
マクロについて勉強してきますorz
あー、name[key]がマクロの特殊な構文なのかと勘違いしました。 直接入力の場合の構文ですね。ボケてたorz
506 :
501 :2005/09/01(木) 19:27:08
すみません。情報不足だったでしょうか。 ひとつ訂正があるのですが、 ×フルスクリーンから通常のウィンドウモードにするには ○ウィンドウモードにするには ここではDirectDrawの質問は受け付けてないんですか? せめて何がいけないのか教えてください。
508 :
デフォルトの名無しさん :2005/09/01(木) 20:03:26
「躓いてしまいました」から何を察しろというのか。ホームラン級の馬鹿だな。
509 :
501 :2005/09/01(木) 20:32:35
すみません。
ttp://www.cnet-try.ne.jp/akiji/directx05.htm ソースはこちらと同じで
hRes = lpDD->SetCooperativeLevel(hWnd,DDSCL_NORMAL);
と修正しただけです。
躓くというのは
・・・
hRes = lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if(hRes != DD_OK)
{
lpDD = NULL;
lpDDSPrimary = NULL;
MessageBox(hWnd,"Step4","Error",MB_OK);
return hRes;
}
ここでエラーになるという事です。
また同じこと言うが SDKのサンプルに答えがあるのに なぜ見ない?
あの、 pTexture->LockRect(0, &LockedRect, &rect, 0); ↑みたいなLock関数について伺いたいのですが、 Lock関数の引数で、ロックフラグ(↑のLockRectの場合は第四引数)が 0の場合はどのような意味を持つことになるのでしょうか? DirectXのヘルプには、 D3DLOCK_DISCARD D3DLOCK_NO_DIRTY_UPDATE D3DLOCK_NOSYSLOCK D3DLOCK_READONLY D3DLOCK_NOOVERWRITE のいずれかを使えと書いてあり、内容も理解できます。 しかし、いろいろサイトを見てきましたが このフラグに0を指定してるソースが多々見受けられます。 解説が見つからなかったのでここで質問させていただきます。 どうかよろしくお願いします。
512 :
501 :2005/09/01(木) 22:21:52
>>510 サンプルとは現在のSDKにも入ってるんでしょうか?
Direct3Dのサンプルなどならあったのですが…
513 :
デフォルトの名無しさん :2005/09/01(木) 22:22:08
>>510 初心者スレでそうガーガーわめいたところで解決などしない。
それにあのSDKのサンプル郡は初心者には触り難いイメージがある。
アレは普通はみないよ。
俺も初心者の頃、DirectXの初心者本買いまくった方だから、
初心者の役に立たないサンプルソースの匂いってわかるんだ。
>>511 日本語ヘルプはファビョってるから、英語のヘルプを読め。
誰か「猫でもわかるDirectX」書いてくれ
516 :
501 :2005/09/01(木) 22:54:26
>>513 役に立たないソースでも構いません。詳細きぼんです。
>>512 DirectDrawなんて使ってると、わからないことがあるたびにそうやって
生き字引を探さなきゃならないわけだが・・・
それでもDirectDrawを使い続けるのか?
正直、旧バージョンのサポートなんて無いといっていい。
あくまで実行ファイルが動くってだけだ。
なんかさ、どうでもいいところで躓くのって嫌じゃない?
特に理由がないなら、DirectX9を奨めたいけどね。
DirectX5と7の本ならまだAmazonに売ってる 近所の書店でも見かけた
>>519 > I/O別冊第1編集部 (編さん)
「編纂」なのは分かっているが、ひらがななもんで一瞬「編さん(影さん・つぐ美ちゃん)」が書いたのかと
DirectXの日本語ドキュメントって2002以降 作られてないの??
(October 2004)が最後
スレのログは一応見たのですが、 D3DのDLLを個別に配布しないですむDirectX9は Dec2004が最新ってことで良いのでしょうか?
>>525 d3dx9_24x.dll〜d3dx9_27.dllの事ならそうだ
>>501 サイトの方は見てないが
おそらくバックバッファとプライマリバッファのピクセルフォーマットが
異なっているんじゃないだろうか。
俺はバックバッファはOFFSCREENPLAINで作って、
ウィンドウモードのときはGDIでウィンドウに転送してる。
それとI/Oの本は持ってるけどその辺のことは全然書いてないし、
フルスクリーンで何も考えないでとりあえずDirectX使うところまでも
たどり着けないようなやつが買う本。たぶん参考にならない。
同じメッシュを幾つも描画する時どうしてますか? 位置情報を元に一つのメッシュを幾つも描画してますか。 それとも vector<Mesh*> array; 初期化部 Mesh* pmesh = new Mesh; array.push_back( pmesh ); 描画部 for( int i = 0; i < 10000; i++ ) array.Draw() こんなんやってますか? というのは 今までメモリを気にして前者のやり方でやってたのですが 本をみると(Spriteですが) listに放りこんでるではないですかっ!! そこで試しに10000回push_backやってみたんですが GlobalMemoryStatusで dwAvailPhysを見てみたんですが 殆どメモリが減ってない。 vector<Mesh*>は Meshサイズ分のメモリを食ってないのでしょうか??
530 :
529 :2005/09/02(金) 22:19:02
おっと付け足して文を構成したせいで 描画部がわけわかんなくなっちゃったぜ
VRAMに乗ってたりして
VRAMの消費調べてみ
VRAMの○×だよ!
534 :
529 :2005/09/02(金) 23:05:24
ぐはっ 見当違いのメモリを調べていたのかw
>>529 共通の描画用メッシュの参照ポインタを持てばいい。
そのためのAddRefだろー。
現実はあまり使わないけどなw
536 :
529 :2005/09/02(金) 23:17:53
VRAMを調べてくれる関数がわからん・・・ フリーソフトはあるのだから 調べる方法は必ずあるんだろうなぁ VRAM sprintf でググっても出てこんw 同じ物を描画する時はどうやってますかい?
だからVRAMに保持させとく描画用メッシュは1つだけでいいだろ。
538 :
529 :2005/09/02(金) 23:43:41
と、なると前者の方法で 位置情報を元に 一つのメッシュを 再利用すべきなのですな 1000回のチェックに下げて VRAMチェッカー(フリーソフト)で調べると 2Mちょっと食われてた。
ドラクエとかのマップだって、そうだろ? 同じマップチップを何度も使いまわしている。 それが3Dになっただけだ
質問です。XP、Visual C++ .NET です。 MFC スレかどうか迷ったのですが、ここで質問させていただきます。 プロジェクトは MFC を用いて組んでいます。 DirectInput に関してです。 (プロジェクト名).rc(85): error RC2104 : undefined keyword or key name: DIK_BACK というエラーが出て、rc ファイルを見てみると、次のようなコードがありました。 ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE BEGIN "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT "V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT DIK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT DIK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT DIK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT DIK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT DIK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT DIK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT "X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT END (続く)
541 :
540 :2005/09/03(土) 00:08:33
実は rc ファイルをいじったこと今まではなく、そもそも rc ファイルが何者なのかも理解できていません。 また、DirectX 関連のライブラリとのリンクなどはずっと以前から行っており、プロジェクトのビルドもできていましたが、 今日、突然このようなエラーが現れました。 このかん、DirectX に関連する部分をいじってはないつもりです。(いじったからエラーが出たと思うんですが・・・) 上の部分のコードはいつ生成され、エラーの原因は何なのでしょうか・・・。 よろしくお願いします。
542 :
529 :2005/09/03(土) 00:12:48
そんな風に思ってた時期が(ry
ロールプレイングゲームプログラミング
という書籍に
CChipという関数に画像データを1個ずつ入れて
それを
list<CCharacter>にぶっこんでるわけですよ
↑(Image(画像を取り扱うクラス)を継承している。)
マップに存在する分だけ
そこで、オレもぶっこんでみようかなと
頭こんがらがったワケデスヨ。
>>540 .rcはResourceファイルでメニューバーやら
ショートカットキー(Accelarator)などを保存?みたいな
しているファイルで、それは
resource.hファイルというのに定義されている。
#include "resource.h"てのが抜けてるのだろうか?
>>540 とりあえず "DIK_"ってのを"VK_"にすればいいんじゃないかしら。
間違って置換しちゃったとか。
544 :
540 :2005/09/03(土) 00:29:36
>>543 置換・・・
orz やっちまったようです。こんな質問に対してエスパー解答本当にありがとうございました。
DirectInputにてバッファーからキー入力を取得しているのですが SHIFTが同時に押されているかどうかはどう判断するのでしょうか? 今はシフトが押されたらbool isShift=true; 離されたらisShift=false:として 場合分けをしています。
VC6.0で->とか関数で引数とかを表示してくれヘルプみたいなのを 使えるようにするにはどうしたらいいでしょうか?
549 :
C初心者です :2005/09/03(土) 21:01:05
質問です。 NT系のOSってノートパッドに書き込める容量は制限されて無いみたいなんですけど、 Meってノートパッドに書き込みすぎるとメモリ不足って言う表示がでてしまい、それ以上書けなくなってしまいます。 そこで、Meで動作する容量の制限されないノートパッドをC言語で作ってるんですけど、イマイチ作れません。 だれか作り方教えてください。お願いします。
551 :
C初心者です :2005/09/03(土) 21:17:31
>>550 早とちりしてました。ほかのスレに行きます
552 :
546 :2005/09/03(土) 21:31:25
自己解決しました。
よく考えたらバッファーからは押されたキーの情報を時系列順にしか取り出せないのだから
この場合はフラグでしか無理ですね…。
>>547 チェックした時点でSHIFTが押されているかではなく、あるキーが押された時点で
同時にSHIFTが押されているかどうかを調べたいので
やはりバッファーからの情報を元にフラグを立てることにします。
スレ汚しすみません。
>>552 キーはな。
まず関数を作るんだ。
作る関数は
GetOnTrgKey関数 キーが押された瞬間をとる
GetOffTrgKey関数 キーが放された瞬間をとる
GetOnKey関数 キーが現在押されているかどうかをとる
の3つだ。
引数はスペースだとかリターンだとか上とか下とかキーの種類な。戻り値はboolな。
この関数ができれば、
if(GetOnKey(SHIFT)){
if(GetOnTrgKey(ENTER)){
}
}
って簡単だろ?
もちろん、前回のフレームのキー状態をとっておく必要はあるからね。
上の3つができたら、キーの長押しなんかも判断できる関数作ってみ。
長押しってのはRPGのステータス画面なんかで十字キーしばらく押してると
ピッピッピッピピピピピピピって連続で押されているみたいな動作するじゃん。それ。
GetOnTrgKey実現するには スッドレとイベントが必要だったり
>>552 答えようとしてる人達が、バッファリングデータのことを
知らない人ばかりですまないな。
>>555 >GetOnTrgKey関数 キーが押された瞬間をとる
戻り値がboolで、キーが押された瞬間を捉えるとすると同期オブジェクト使うしかないやん。
スピンロックは却下な。
>>557 フレーム単位であわせりゃいいじゃん。
つーか、フレーム単位でしかとらないほうがいいだろ。
質問です。XP、.NET です。
MFC を利用してコードを組んでいます。
DirectX9 の勉強中です。
DirectInput によりキーボードの入力状態をチェックしてるのですが、上手く行きません。
コンパイルエラーは出なく、原因が全くつかめないため、
冗長かも分かりませんがソースの必要と思われる部分をUPします。
http://www.geocities.co.jp/CollegeLife-Club/7442/ts.txt 自作 CDirectInput8 クラスの InitDInput() を、MainFrame の OnCreate() 内で呼び出して
DirectInput の初期化を行い、OnTimer() 内でキー状態をチェックしています。
道中メッセージボックスでのエラーは出ません。
が、キー入力を行っても "成功" のボックスが出ません。
調べたところ、OnTimer() 自体は確実に呼ばれているようです。
お手上げ状態です。
かなり面倒な質問ですが、お時間のある方、ご協力をお願いします。
>>559 hr = mpDInputDevice->Poll();
hr = mpDInputDevice->GetDeviceState(256,diKeyState);
if(hr != DI_OK){
hr = mpDInputDevice->Acquire();
while(hr == DIERR_INPUTLOST)
hr = mpDInputDevice->Acquire();
return 0;
}
その部分、俺のソースではこんなことになっていた・・・orz
なんか支離滅裂なコードなのであんまり気にしないでくれw
君のは多分Poll関数が呼ばれてないだけじゃないのかな?(違ったら素マンコ)
561 :
559 :2005/09/04(日) 12:39:48
>>560 Poll() に関して調べてみました。
内容はまだ理解できていませんが、キーボードやマウスの場合は必要ないようです・・・。
申し訳ありません。
>>559 SDKだとこんな風にしてるわよ。
//if (hr == DIERR_INPUTLOST){
//m_directinput.m_pDIDevice->Acquire();
//}
if( FAILED(hr) )
{
hr = m_directinput.m_pDIDevice->Acquire();
while( hr == DIERR_INPUTLOST )
hr = m_directinput.m_pDIDevice->Acquire();
return;
}
>>561 ほんとだ。
いい加減なこといってすまん。
じゃ、やっぱ
while(hr == DIERR_INPUTLOST)
hr = mpDInputDevice->Acquire();
なのか?ちがうか・・・orz
GetDeviceStateの戻り値は調べたのか? DI_OKならm_diKeyStateを直接表示してみては
566 :
559 :2005/09/04(日) 13:01:03
しまった・・・ GetDeviceState() で SUCCEED していないようです。戻り値調べてみます。 ありがとうございます。
やっぱ、ソースみると解決早いな。
568 :
559 :2005/09/04(日) 13:06:24
GetDeviceState() の戻り値: DIERR_NOTACQUIRED The operation cannot be performed unless the device is acquired. orz
569 :
559 :2005/09/04(日) 13:10:02
ひとまず、指摘いただいたとおり FAILED の時に Acquire() 呼び出すように改良してみます。 お付き合いありがとうございました。一旦失礼します。
570 :
559 :2005/09/04(日) 13:16:49
動いたあああああ!!!!!! ありがとうございました。ようやく次の作業にいけます! 長々とお世話になりました。それではー。
すいません、ベクトルの回転について困っています。 ベクトルを任意軸で回転させ新しいベクトルを取得したいのですが、計算結果にわずかな誤差がでてしまうのです。 例えば (0, 0, 1) というベクトルを (1, 0, 0) という軸で90度回転させるとします。 +Zに向いているベクトルを-Yに向けたいのです。 ところが、計算してみると (0, -0.999998, 0) などコンピュータらしい誤差が生まれます。 この問題、なんとかならないでしょうか? ベクトルの回転方法としては、ベクトルを行列に格納し、回転行列を作って掛け合わせ、その行列から _41, _42, _43 を取り出して新しいベクトルとしています。 関数はD3DXMatrixRotationAxis() や D3DXQuaternionRotationAxis() と D3DXMatrixRotationQuaternion() などを使いましたが、 誤差をなくせません・・・。 よろしくお願いします。
回避は『ほぼ』不可能です。 演算の手法や順番の工夫、遅くなるのを覚悟で倍精度や拡張精度の 浮動小数点演算を行うといった方法である程度軽減は可能ですが、 離散値しか扱えない以上は丸め誤差や打切り誤差は不可避です。
マジか
>>571 つーか、何がしたいの?
こういうの無理そうだって感覚的に理解できるっしょ普通w
また、こういう微妙な数字をゲームの判定なんかにつかっちゃ駄目だよ。マジで。
1ぴったりであることとか、0ぴったりであることとか。
マジか
576 :
デフォルトの名無しさん :2005/09/04(日) 18:04:08
誤差前提でプログラムを組むしかない。
>>574 ん〜…
ある平面があって、その平面は指定したベクトルの先に展開したいので、
まず回転のない平面の4頂点を作り、指定したベクトルに応じた回転を与えることで、
4頂点の座標を求める・・・・ということをやっています。傘なんかを思い描いてもらえればいいかと思います。
傘の柄が指定したいベクトル。柄の先に有るビニールが展開したい平面。
そして、その平面と当たり判定をするのですが・・・その平面に対しつっこんできた点の、
反射ベクトルを求めようとしているのですが、なにか微妙な誤差がありまして。平面との反射角は、
法線と角度をとった場合、平面の表なら90以下、平面の裏なら90ど以上じゃないとおかしいじゃないですか。
それが、裏なのに89.9999...など「微妙に数値がずれてる」場合がありまして、うまく計算できないときがあるのです。
先ほどの例で(0,0,1)を(1,0,0)などで90度回転させた平面の座標を見たところ、しっかり90度で回転させているのに
頂点が綺麗な数字にならず14.9999...など回転させた際に誤差が生まれたようで。それが反射角が微妙に
おかしくなる原因かと思ったのです。
>>572 不可能・・・ですか。マジですか・・・。
まぁ、反射角の求め方もまだ怪しいので、もうちょっと調べてみます。
ありがとうございました。長文ですみません。
浮動小数点を使っている限り数値誤差は避けられない。
スパコンで行う大規模数値計算ですらそれを前提に行う。
ゲームみたいなテキトーなものはテキトーでよい。
>>577 DirectXのヘルプのHLSLのreflect関数に公式が出てるよ。
説明はt-potに良いのがあった記憶が。
>>579 わw
センスなさそーだなお前w
誤差がでることを前提に作るしかねぇってわかるだろ。
それとも何か解決策でもあったか?
くっだらねぇ本紹介する前にテメェがその本で獲た結論から言えや。
>>580 この本は誤差がでることを前提に作れっていってるんだよ。
誤差があっても落ちない破綻しないようにする作り方を示してる。
でも他により良い資料があるなら是非紹介して欲しい。
>>580 自分で自分をDQNだって明言することが趣味なのか?
アカデミックな本に関してアレルギーでも持ってるのかな?
自分の本が売れないからって必死ですね
585 :
579 :2005/09/05(月) 00:02:52
>>580 んーやはりちょっと気になるなぁ。
いったい何をもってくだらないと断じているのか知りたい。
ちなみに自分自身は、学歴ないし頭悪いし計算幾何学に通じてる訳でもないし
その本は半分ぐらい読んで放置中だw
でもいずれそれに沿った実装はしたいと思っている。
誤差は本当に頭が痛い問題だ、もっと簡単で使える技術があるなら本気で知りたい。
アカデミックな本wwwキタwwwキタコレwwwww
>>582 >この本は誤差がでることを前提に作れっていってるんだよ。
読んでも読まなくても俺と結論がいっしょじゃねぇかよw
質問です。XP、.NET です。 DirectInput の勉強中です。 class CDirectInput8 { public: BOOL CALLBACK EnumDevicesBySemanticsCallback( LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef); } BOOL CALLBACK CDirectInput8::EnumDevicesBySemanticsCallback( LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef) { //(中略) } 自作 CDirectInput8 クラス内で上記コールバック関数を定義し、 CDirectInput8::InitDInput() (初期化用のメソッド) 内で以下のように EnumDevicesBySemantics() を使っています。 (続く)
590 :
589 :2005/09/05(月) 01:29:52
// デバイスへのアクションマッピング hr = m_pDInput->EnumDevicesBySemantics( NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, NULL, DIEDBSFL_ATTACHEDONLY); if (FAILED(hr)) { AfxMessageBox("デバイスへのアクションマッピングに失敗"); return false; } すると、上記コードでコンパイルエラーが出ます。 〜\DirectInput8.cpp(44): error C2664: 'IDirectInput8A::EnumDevicesBySemantics' : 3 番目の引数を 'BOOL (LPCDIDEVICEINSTANCE,LPDIRECTINPUTDEVICE8,DWORD,DWORD,LPVOID)' から 'LPDIENUMDEVICESBYSEMANTICSCBA' に変換できません。 型変換ができないと言われましたが、 他の色々なサンプルを見ても、同じコードが書かれており、コンパイルが通ります。 原因分からなくて困っています。 よろしくお願いします。
591 :
デフォルトの名無しさん :2005/09/05(月) 01:47:43
>>589 メンバ関数をコールバックに渡してっからだろ。
594 :
デフォルトの名無しさん :2005/09/05(月) 02:22:02
directx 9.0bってどこでインストール出来るんですか?
>>594 なんで検索して自力で調べようとしないんですか?
9.0bランタイムほんとに無いなw デバッグするときどうするんだろ
>>595 ケチ臭い事言ってんなよ
いちいち調べろとかわざわざ書き込むな
調べてもわからないから聞いてんだろコラ
>>597 なら正しい検索の仕方から学んだ方が良いと思いますよ
>>598 ほほう
ではその検索とやらの仕方はどーすんのよ?
ここは初心者スレだろ?
>>599 スレタイ読めますか?日本語の勉強からしたほうが良いかもしれませんよ。
そうやって逃げるような書き込みしか出来ないのですね。 まぁこの程度の事すら自力で調べられないようならプログラミングなんぞ無理でしょうけど。
こんな夜中によく(r
>>600 それSDKw
日本語サイトにもSDKやシンボルはあるよ
サイト内検索でランタイムも見つかる。 ただ検索も満足に出来ない人に見つけられるかは知りませんが。
ランタイムはダウンロードできない 試してみ?
9.0cのランタイム入れれば9.0bも動くんじゃないの? 良くわかんないわね。
そら動かなかったら大変なことになっとるがな
香ばしい展開乙
ランタイムは最新版だけ落とせるようにしてるんじゃないの?(よく知らないけど) んで、仮にわざわざ9.0bの環境にしてデバッグしたいってことなら、 とりあえず初心者では無いわねw
>>611 初心者ではないならなおさら見苦しいなwww
614 :
589 :2005/09/05(月) 07:27:44
たびたび失礼します。XP、.NET です。
>>592 を参考に、コールバック関数を static で宣言しました。
class CDirectInput8
{
public:
// (中略)
static BOOL CALLBACK EnumDevicesBySemanticsCallback(
LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid,
DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef);
};
BOOL CALLBACK CDirectInput8::EnumDevicesBySemanticsCallback(
LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid,
DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
{
// (中略)
}
bool CDirectInput8::InitDInput(HWND hwndApp)
{
// (中略)
// デバイスへのアクションマッピング
hr = m_pDInput->EnumDevicesBySemantics(
NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, (LPVOID)this, DIEDBSFL_ATTACHEDONLY);
}
615 :
589 :2005/09/05(月) 07:28:37
こうしたところ、EnumDevicesBySemantics に失敗し、hr に E_INVALIDARG が返って来ました。 >DIERR_INVALIDPARAM >無効なパラメータが、戻ってくる関数に渡されたか、オブジェクトがその関数を呼び出せる状態になかった。 どっちのエラーかも分からないのでなかなか解決しません。 お手を貸していただけないでしょうか。
>>615 m_DIActionFormatが怪しいような。
アクションマッピング使ったことないから分からんけど。
617 :
589 :2005/09/05(月) 07:56:43
>>616 // アクションマップの定義
int number_of_actions = sizeof(g_GameAction) / sizeof(g_GameAction[0]);
m_DIActionFormat.dwSize = sizeof(DIACTIONFORMAT);
m_DIActionFormat.dwActionSize = sizeof(DIACTION);
m_DIActionFormat.dwDataSize = number_of_actions * sizeof(DWORD);
m_DIActionFormat.dwNumActions = number_of_actions;
m_DIActionFormat.guidActionMap = g_AppGuid;
m_DIActionFormat.dwGenre = NULL;
m_DIActionFormat.rgoAction = g_GameAction;
m_DIActionFormat.dwBufferSize = 100;
m_DIActionFormat.lAxisMin = -1000;
m_DIActionFormat.lAxisMax = 1000;
lstrcpy(m_DIActionFormat.tszActionMap, "hoge");
こんな感じでした。
ZeroMemoryでフィールドの初期化はしてある? フィールドはそれ以外にもあるからそういうのが関係してるとか。 (あんまり関係ない気はするが一応やってみるのがいい) ユーザー関数が呼ばれているかどうかはブレークポイントを関数内に設定してみ。 ブレークポイントで止まる前に落ちるなら、関数への設定パラメータのミスと考えるのが妥当かと。 まあINVALIDPARAMだし恐らくそうなんだろうけれど…
619 :
589 :2005/09/05(月) 08:36:38
>>618 ZeroMemory を行っていなかったのでやってみました。
また、コールバック関数内にブレークポイントを設定してみましたが、そこは通らず、
// (中略)
// デバイスへのアクションマッピング
hr = m_pDInput->EnumDevicesBySemantics(
NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, (LPVOID)this, DIEDBSFL_ATTACHEDONLY);
if (FAILED(hr)) {
/* ※ */
}
※の行に設定してあるブレークポイントでストップしました。
つーことは設定パラメータがおかしいんでは。 とりあえずリファレンスとかサンプル参考にしながら見てこう。 サンプルがあるなら、それと自分のコードの違いを見比べて、 怪しいと思ったところを修正するのが楽かな。 仕事行くのでこの辺で。
だーめーだーわからん
スプライトを左右反転させて表示するにはどうすればいいんんですか?
>>622 [-1,0,0,0]
[0,1,0,0]
[0,0,1,0]
[0,0,0,1]
最初にこの行列をかける
>>617 >>m_DIActionFormat.dwGenre = NULL;
NULLはだめみたいよ。他のを適当に代入。
あと、アクションマップは Program Files/Common Files/DirectX に
勝手に設定ファイル作ったりするので、個人的にお勧めできないわ。
>>624 適当なものが無かったので、サンプルにあった DIVIRTUAL_SPACESIM を入れてみました。
が、ダメでした・・・。
マジですか
アクションマップだめですか。うーん。作り変えてみます。ありがとうございます。
>>625 例えばDIBUTTON_FIGHTINGH_KICKを使うには
dwGenre = DIVIRTUAL_FIGHTING_HAND2HAND; になってる必要があるみたいね。
結局ややこしいからお勧めでき(ry
よその質問スレッドで明快な答えをいただけなかったので 技術者の多いこちらで再度質問させてください。 なぜDirectXを使用したゲームはCPU使用率が100%(HTでは50%)になるのでしょう? 処理の重さに関係なく必ずCPU使用率が100%になります。 理由がわかるかたいませんでしょうか?
技術者が多いかどうかは知らんが、別にすべてのソフトでCPU100%使うわけじゃないぞ。 PCのスペックが十分でFPSを固定してれば100にはならんし、 キーフレームアニメーション使ってて常時再描写してるんだったら100になるってだけだ。 例えばRigidChipsでもFPS固定して軽いモデル使えば50〜80くらいにはなる。
そういえば同期待ちでCPU持っていくグラフィックボードがあったな
>>627 CPUを100%使ってるからだろ。っていうか質問の前提がおかしい。ウザス
>>627 CPUが100%になることを確認したソフトのリストと
PCのスペックを詳しく
またビジーループ叩きかw 熱心なこった
MSがあれだけ派手にビジーループ作るなって宣伝したらそりゃ叩かれるよ プレゼン資料みただろ?w
イニシャルDタイピングとかエロゲとか100%になりそうだよな。 ま、偏見だけど
627です 叩いているとかいう以前に、なぜそうなのか疑問に思っただけです。 具体的なゲームタイトルとしては、RagnarokOnline Lineage2 Pangya ハンゲの3Dビリヤードなどなど Direct3Dを使用するゲームは全般的にCPU使用率が100%になるようです これというのはDirectXの仕様なのでしょうか? それとも各ゲームのプログラム上の都合なのでしょうか? >CPUを100%使ってるからだろ。っていうか質問の前提がおかしい。ウザス 画面を大幅に書き換えている状態でCPU使用率が100%になることはあり得るとしても 画面にほぼ動きがなく、処理もたいしたことをしていない状態でも 安定して100%状態を維持してます ※質問の要点は、なぜ軽い処理をしているときもCPU使用率が100%なのですか?という点です わかりにくくてすみません
>RagnarokOnline Lineage2 Pangya ハンゲの3Dビリヤード チョソが書いた糞プログラムだけみて「全般的」とか言っちゃうのって 脳みそ腐ってんじゃないの?wwwww
>画面にほぼ動きがなく、処理もたいしたことをしていない状態でも お前プログラムしたことないだろ? メッセージループ回してるだけでも、CPU100%食うんだよ。
>>635 ちゃんとPresent( NULL, NULL, NULL, NULL )使ってるか?
あとSDKのサンプルも見て見ろ。
俺の環境だとSDKのサンプルを起動して更新をINTERVAL_DEFAULTにするとCPU使用率は100%にならない。
>メッセージループ回してるだけでも、CPU100%食うんだよ。 食わねえだろボケ おまえのInternetExplorerはアイドル中にもCPU100%食うのかよ
>>639 アイドル中はGetMessage()で止まってるからループは回ってないぞ。
逆をいえば、GetMessage()ではなくPeekMessage()で溜まり具合をみつつ
ゲームのメインループを回してるとCPU100%になる。
大雑把に言うと、 一般アプリはGetMessage関数でSleepされているが、 Direct3D系のアプリはPresentでSleepされている。 しかしドライバによってはPresentがSleepを使わず無限ループの場合があるらしい。 INTERVAL_DEFAULT(っつーかINTERVAL_ONE)でも100%になる原因みたい。
>>641 >しかしドライバによってはPresentがSleepを使わず無限ループの場合があるらしい。
>INTERVAL_DEFAULT(っつーかINTERVAL_ONE)でも100%になる原因みたい。
ホントにその処理ってドライバ依存なのかぁ?
俺はSDKのサンプル以上のサポートはいらんと勝手に自分に結論付けたからどうでもいいけど。
テメエでタイマーとGetRasterState見つつPresentで良いじゃない。
>>627 DirectXを使っているかどうかは全く関係ない。
一般アプリケーションとゲームでは処理の仕方が違うだけ。
一般アプリケーションはユーザの入力に対して何か処理をするのが
中心だから、入力がないときは何もしていない。だからCPU使用率は低い。
ゲームの場合は、何も入力がないときでも常に進行していくのが普通なので、
CPU負荷は常に高め。
それでも大抵のゲームではCPU時間が余るが、余った時間を解放するか
どうかはプログラマーの考え方次第。
ただ、最近はノートPCの人も多いし、デスクトップでも消費電力が無視できなく
なってきたから、ベンチマーク目的以外では解放した方がいいが。
>>644 CPU解放型のアプリってショボイの多いな。
結局、することなくて解放してるだけでさ。
ノベルゲームとかが多いかな。 ファルコムなんかは100%だね。
>>646 アリスソフトも100%だけど動作がいいぞ。
次のフレームまでの時間見て Sleep使えば基本的にはいけるんだが Sleepって実際はその時間で戻ってくるって保障されないんだっけ? マイクロソフトがSetTimerとかSleepをもっとちゃんと作ってくれればなんとかなるのだがな
Sleep(1)でも1tickくらいは平気で待たされている気がする。
651 :
デフォルトの名無しさん :2005/09/06(火) 00:13:18
こないだのCEDECではQueryPerformanceCounter使えって話でてたな。 でもコスト高いから、たまに使う程度にしろとか。どーしろってんだ。 結局timeGetTimeかよ。
>>651 それ、インテルのデュアルコアプロセッサでのマルチスレッド
の話の奴なら、意味が違うかと…
GetRasterStateで状態監視するのって重くない?
>>651 QueryPerformanceCounter使うと動かないっていう奴まだいるんだよなぁ
>>651 最近は省電力とかでクロック数が動的に変化するCPU結構あるから
細かくフリーケンシー計らないと使い物にならない。 案外微妙。
クロック変わったのを検地する方法(メッセージが飛んでくるとか)はないの?
QueryPerformanceCounter=RDTSCなのか?
>>654 え、マジで?
どういう環境で動かないんだろう。
QueryPerformanceCounterってコスト高いんか。 CEDECでって、MSのセッション?
PC97で高精度タイマの標準を提案していればこんなことにはならなかったのに。
60fps で動かすときも SetTimer(0, 1, NULL) で呼んで 毎回 timeGetTime() でフレームを進めるかどうかをチェックしてる・・・ ダメなのかな?
WM_TIMERの精度って50msとかじゃなかったっけ・・・
WM_TIMERほど信用出来ないものはないな
WM_TIMER は優先度が低いメッセージだから ガンガン遅れるんじゃなかったっけか
メッセージキューが空っぽに近い状態で IDLE に入ったら思い出したように出してくれる程度の精度 マウスで窓サイズの変更の真っ只中かだと、ぜんぜんやってこん
>>660 普通に使う分には1msの精度で十分だから、あまり必要ないんじゃない?
時間に厳しい処理なんかは、WindowsXPはリアルタイムOSではない
という理由で実装されてないし。
QueryPerformanceCounterの精度なんて普通はプロファイリングにしか
必要ないよ。fpsの制御に使うのはオーバースペック。
リフレッシュレート75Hzや85Hzのモニタで60fpsの動画を再生したときの
最大の誤差を計算してみれば、1msの精度で十分だと分かるはず。
進歩のない考え方だねえ
もっと高精度のSleepがあればなぁ
667は久多良木健
670 :
デフォルトの名無しさん :2005/09/06(火) 19:43:17
ポリゴンを表示させると物体と背景との境界線のジャギが目立つのですが、 アンチエイリアス機能はDirectXにはないのでしょうか?
低スペック志向をウリにする人が多いので 普通はアンチエリアスを無視しますよね。 全ハードで使える保障がないので先輩が怒りますし。
673 :
670 :2005/09/06(火) 20:15:39
レスありがとうございます。 検索しても答えになるようなことが全く出てこないのでないものだと思っていましたが、 あるのならと思いあれこれ調べてたらやっとたどり着きましたorz あまり実用的ではないからあえて触れていないのですね。
>>674 SetRenderStateで設定する。(たしか)
676 :
デフォルトの名無しさん :2005/09/06(火) 20:27:05
D3DXMatrixMultiply関数の中身ってどうなっているのでしょうか? 調べても見つけられませんでした。
677 :
670 :2005/09/06(火) 20:29:49
SetRenderStateはD3DRS_EDGEANTIALIASをTRUE MultiSampleTypeはD3DMULTISAMPLE_9_SAMPLESを指定でフルシーンアンチエイリアス
>>672 >全ハードで使える保障がないので先輩が怒りますし。
普通は使えるのかどうか調べるのだが
その先輩とやらは脳無しだから明日から下っ端扱いで構わない
>先輩が怒りますし この小学生みたいな台詞もどうかと思うぞ。
>>677 ショックだと思うが、こころして聞いてくれ
D3DRS_EDGEANTIALIASはもうここにはいないんだ!!!
あれこれ試してみましたが期待通りというか、実際に効果が出てるのか分からないうえに処理がクソ重くなりました。 ゲフォ5950Uだから問題は無いはずなんですが(´・ω・`)
>>681 ちなみにRadeon9600Proね。
んじゃよくFPSとかであるアンチエイリアス×○ とかは何なんだろ。
>>684 いや、確実に効果はある。
たしかに淵は滑らかになってるけど、
ここまで速度を犠牲にしてまで、それにふさわしい効果があるかっていうと、
無いと言いきれる。そんなレベル。
こんなもんのスイッチいれるぐらいなら画面の更新頻度が多い方が絶対にうれしい。
ごめん、間違えた ×アンチエイリアス×○ とかは何なんだろ。 ○アンチエイリアス×○ とかはどうやってるんだろ。
○×○×ややこしいな
>>686 そんなのSetRenderStateに値を設定すればいいだろ!ウンコ!
何が聞きたいのかさっぱりわからないよ!ウンコ!
689 :
676 :2005/09/07(水) 00:01:11
float *out = (float*)aOut; float *mat0 = (float*)aMat0; float *mat1 = (float*)aMat1; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ for(int k=0;k<4;k++){ out[i*4 + j] = mat0[k*4 + j] * mat1[i*4 + k]; } } } こんな感じで頑張ってみました・・・ あってるでしょうか?
液晶で解像度が同じだとかなり綺麗に感じると思うよ 解像度低くてスムージングかかってたり CRTじゃあまり感じられないかもね
>D3DXMatrixMultiply関数の中身ってどうなっているのでしょうか? マトリックスの乗算公式をそのままコード化してるだけだろ
D3DXはSSEとか使ってるから
>>689 より速いよ
>>691 いや、それがどうだったけかなぁ・・・と。
なーんか、昔、DirectX5とか6の頃はヘルプにコードが載ってたような気がするんですけど
なーんだっけかなぁ・・・と、まあ、そんなところでした。
ところで・・・
まちがえますた・・・orz
float *out = (float*)aOut;
float *mat0 = (float*)aMat0;
float *mat1 = (float*)aMat1;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
out[i*4 + j] += mat0[k*4 + j] * mat1[i*4 + k];
}
}
}
>>692 いえ、それを使えない場面にあたっちまいまして・・・
>>693 DX6のサンプルのd3dutils.cppより:
D3DMATRIX
MatrixMult(const D3DMATRIX & a, const D3DMATRIX & b)
{
D3DMATRIX ret = ZeroMatrix();
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
for (int k=0; k<4; k++) {
ret(i, j) += a(k, j) * b(i, k);
}
}
}
return ret;
} // end MatrixMult
最初に出力行列を初期化しようね。
DirectXはVC以外の開発環境でできますか? 希望する環境はEclipse+CDTですが可能でしょうか?
Geforce256は1500万ポリゴン/秒ってあるのですが 12ポリゴンで構成されたメッシュを 900体以上表示させるとFPSの速度が落ちるのは オレのプログラムが悪いからでしょうか?
うn
>>698 1回のDrawPrimitiveで1000頂点くらい描画しないと
その性能はでないよ。
>>699 化ッ
>>700 なるほど そういうことですか。
for文が900回繰り返してるからかな?
単純にDraw〜のみをループも使わず連続こぴぺで描画した場合だったりして
パイプライン処理ってのを理解すればわかるよ
704 :
698 :2005/09/07(水) 13:37:57
試しに28ポリゴンを900体 25200ポリゴン描画してみたら問題なしでした が 熱でPCフリーズw 色々と、レス有難うございました。
705 :
デフォルトの名無しさん :2005/09/07(水) 21:16:11
706 :
デフォルトの名無しさん :2005/09/07(水) 21:22:28
テクスチャについて2つ質問があります。 1つ目は四角形(三角2枚)のプリミティブに張るテクスチャを画像データの一部分を切り取っている場合、同一の画像を繰り返し描画することは可能かどうかです。 赤青 これで1枚の画像としたとき、 緑白 赤と青の部分だけ切り取って四角形のプリミティブに複数の縞模様をつける。 1枚の画像を全て使用するならアドレシングモードで設定できますが、DrawIndexedPrimitiveで200枚近く一括描画していますので、それぞれに専用のテクスチャを用意して設定していくのは非常に効率が悪いです。 2つ目はポリゴンに張るテクスチャの作り方です。 地球のテクスチャ1つでも極の部分は赤道直下部分より伸びていて、球体に貼り付けると奇麗な地球に見えます。 こういうテクスチャを作るには、 適当にテクスチャを描く→ポリゴンに貼り付ける←<繰り返し>→テクスチャの描き直し と言う風にしているのでしょうか。 それともポリゴンに直接模様等を描いてそれを画像データにするようなソフトでもあるのですか? (長々と読みにくい文章ですみません)
>>706 1.
その三角二枚のポリゴン頂点のUV値に、描画したいUV値を割り当てる方法でダメ?
仮に
赤青
緑白
で、赤と青を取り出したいなら、左上の頂点から時計回りにUV値(uv(n))は以下のようになる。
uv0 = {0.0f, 0.0f};
uv1 = {0.5f, 0.0f};
uv2 = {0.5f, 0.5f};
uv3 = {0.0f, 0.5f};
これを描画したい三角二枚のポリゴンの四隅の頂点に対して行えば良い。
いちいちuv値を計算するのがメンドクサイなら、あらかじめ表示したいテクスチャの区画を計算した
テーブルから値を引っ張ってくる。
2.
UVマッピング 球面
で検索をかけるといいかも。
DirectX とは直接関係無いのですが、timeGetTime() の精度が 10ms しかないのは僕の環境だけでしょうか(´・ω・`) う〜ん…… QueryPerformanceCounter を使うしかないのかなぁ……
つtimeBeginPeriod(1);
対にtimeEndPeriod(1);
うぉ。即レスthx。さっそく試してみます orz
712 :
706 :2005/09/07(水) 22:13:35
>>707 これだと赤しか表示されないような・・。
赤青
緑白 から赤と青を取り出し
赤青赤青赤青
赤青赤青赤青
赤青赤青赤青
赤青赤青赤青 と表現したいのです。
赤青 のみの画像であれば、同じく
uv0 = {0.0f, 0.0f};
uv1 = {3.0f, 0.0f}; (V値は何でも問題ないですね)
uv2 = {3.0f, 4.0f}; にし、D3DTADDRESS_WARP等を
uv3 = {0.0f, 4.0f}; 指定すれば複数の縞模様ができますが。
2番については検索の仕方が悪かったのか球体マッピングのやり方ばっかり出てきます。
実際球体ではなく白黒パトカーのテクスチャを作りたいのですが、
ボンネットの「く」の字の部分やドアの線が合ったテクスチャが作れなくて困っています。
uv0 = {0.0f, 0.0f}; uv1 = {1.0f〜, 0.0f}; uv2 = {0.0f, 0.5f}; uv3 = {1.0f〜, 0.5f}; コレじゃだめなの?
714 :
707 :2005/09/07(水) 22:27:52
>赤しか すまんかった・・・OTL >赤青 のみ 赤青で描画した四角形ポリゴンを目的の大きさになるまで複数並べるんじゃだめなんすか?
715 :
706 :2005/09/07(水) 22:41:58
>>713 同一の色なら問題ないのですが、模様が描かれているので縦長に表示されてしまいます。
>>714 単純に縦横4倍ずつにすると16倍のプリミティブを描画しないといけないことになり、
試した結果かなり重くなりました。
1枚1枚テクスチャをセットしてラップテクスチャで描画をしたほうが若干ではありますが軽かったです。
>>715 例題は何とか可能か知れないが
汎用ではないので、出来ないとするべきだろう。
>>715 一括描画って、
for(******) {
dev->DrawIndexedPrimitiveUP(****);
}
って感じ?
これだと激しく遅い。
718 :
698 :2005/09/07(水) 23:07:07
なんつーか無理だと思ふ…
720 :
706 :2005/09/07(水) 23:12:42
>>716 そうですか(´・ω・`)
>>717 dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, (表示したい四角形の数)*4, 0, (表示したい四角形の数)*2);
だけです。
721 :
706 :2005/09/07(水) 23:44:47
色々とレスありがとうございました。
1つ目の質問のほうは出来ないという結論で閉めておきます。
残る2つ目の質問なのですが皆さんはどういう風にテクスチャを作っているのでしょうか。
非常に単純なポリゴン+テクスチャを作ってみましたが、
ttp://vipquality.orz.hm/imageup/file/3946.jpg 見るも無残な姿に・・。
パトカーのように白黒ハッキリしているなら色に合わせて面を作っていけば出来なくもないですが、
ドアの枠線(境界線)などのように細かな模様を付けたい位置に調整するのが非常に困難です。
地球にしろ車にしろ人の顔にしろ1枚のテクスチャ画像に収まっていますが、
こういうのを作るにはどうすればいいのでしょうか?
>>721 もしかして、テクスチャってどうやって作るの?って話してる?
ならこの本がオススメ。
http://www.amazon.co.jp/exec/obidos/ASIN/4881663488/ まあ、俺等の範囲じゃないけど。
知っておかないとカッコつかないしね。と思うなら買い。
まあ、掻い摘んでいうと、3Dモデル(左右対称だとする)を作ったら、
真正面から見た図、真横から見た図をウィンドウズのプリントスクリーンキーでとる。
で、とった図に色を塗ってそれをテクスチャにする。
で、モデリングソフトのUVマップの設定に平行投影っていう設定あるべ?
それで色をぬったテクスチャを真正面、真横からそれぞれ平行投影で貼り付ける。
って作業工程らしい・・・。
え?もしかして、そんなことが知りたいんじゃない?(笑)
てかスレ違いだろ・・・
724 :
706 :2005/09/08(木) 01:37:44
>>722 ありがとうございます。
そういうのが知りたかったのです。
>>706 3Dモデルに直接描画できるソフトもあることにはある。
今どき直接描画できないソフトはないと思うけど
質問です。DirectX9のエフェクトファイルで作った頂点シェーダって GeForceの3や4でハードウェアアクセラレーション効きますか?
カメラがオブジェクトの周りをぐるぐる回るサンプルを作りたいです!!! カメラ位置(Eye)に RotationX すると、回る事には回るのですが、ただオブジェクトが 回転しているようにしか見えませんでした。 そこで、注視点に同じように RotationX を掛けてみると望んだ結果に近い動きをするのですが、 うまく周りを回ってくれません。 どのような順序で演算すると、カメラがオブジェクトの周りをぐーるぐる回るのが作れますか?
とりあえず二次元で図に描いて考えてみろ。
>>729 >ただオブジェクトが回転しているようにしか見えません
これ以外になにがしたい?
729=幼稚園児並みの立体感覚の持ち主
自分がディスプレイをもってぐるぐる回るというのはどうだろう。
くるくる回せる液晶モニタとかいいわね。
>>729 vEye = vAt + α, αは自力で。
物体の背後に背景をつけるとか比較対象となる別の物体でも置いたらいいんでね
質問です。XP、.NET です。 DirectSound を利用して、WAVE ファイルのストリーミング再生で BGM を流そうとしています。 方法と、スレッドを作成し、バッファの半分が演奏されたら Notify で通知し、もう半分を埋めるのを繰り返す、一般的な方法です。 が、プロジェクトの仕様上、BGM 切り替え時の遅延をできるだけ少なくしたいのです。 そこで、演奏する可能性のある BGM の数だけセカンダリバッファを作成し、全 BGM に対して、 WAVE をオープンすると同時にあらかじめ、ストリームバッファの半分だけバッファに BGM をロードし、 イベント通知用のスレッドを作成しようとしています。 が、こうすると、BGM の数だけのスレッドが待ち状態になり、効率が悪く思えます。 BGM の演奏開始時に、その BGM 用のスレッドを作成することも考えましたが、 スレッドの生成にどれだけ時間がかかるかが分かりません。 こういうときの定石みたいなものはありますでしょうか? ゲームなどではよく出くわしそうな状況なので、「普通はこうする」みたいなのがあればと思って質問しました。 よろしくお願いします。
>>739 1BGMに1スレッドにするから何本もスレッド作ることになるんでは。
俺は1スレッドで複数BGMを再生しているよ
>>740 ああ、全くその通りでした・・・。ありがとうございます。
質問です。XP、.NET です。 何度も申し訳ありません。 DirectSound を用いたストリーミング再生で BGM を演奏しているとき、 他の音を鳴らすと、BGM が飛ぶというバグが発生しています。 しばらくしたら元に戻るため、(1秒未満の間だけ、ずれた演奏ポイントで BGM が演奏される) 間違ったイベントが通知されているのではないかと考えていました。 調べてみたところ、同じ質問が各所であり、 DirectSound の有名なバグだという記述まで見つけたのですが、(真偽は分かりません) 詳細が調べられず、解決方法が分かりません。 質問が曖昧で申し訳ありませんが、もし本当に有名だとしたら、何かご存知の方、お願いします。
イベントの発生が怪しいなら、イベントを使わない実装方法ならうまくいくかな。 すんごく原始的だけど、再生位置を常時チェックして、今どこを再生しているのか見る。 前回の再生ポイントから現在の再生ポイントまでを新しいバッファで埋める。 まあストリーミング再生なんて再生できれば十分なことだし、こんなんでいいかと
.NET なら AudioVideoPlayback 使うとか。よく分からんが解決したりして
>>742 前に自分で使ったとき、オンボードのサウンドチップで
バッファをハードの方に取るとおかしくなることがあったよ。
>>745 試しに Play() に DSBPLAY_LOCSOFTWARE フラグを与え、
全てソフトウェアで再生してみたところ、通常に再生されました・・・。
何でだよおおおお
PCに高スペック要求してしまうかもしれないので、起動時にどちらで再生するかを選ばせるようにしてみます。
ありがとうございました。
>>744 AudioVideoPlayback についても調べてみます。ありがとうございました。
747 :
742 :2005/09/08(木) 19:00:38
と、レス番号を名前に入れてませんでした、申し訳ないです。
>>746 今時ハードウェアバッファ使う奴なんていないぞ。
余計にバス圧迫するからDX6の時点で打ち切りだ。
やっとわかってきました。 注視点に RotationX を掛けたあと、オブジェクトをカメラ位置(Eye)から移動させて、 そしてから RotationX すると望んだ結果になりました。 てっきりオブジェクトを置いてからカメラで撮るような感じかと思ったんですが、 まずはカメラありき、、、なんですね。 そこで新たな疑問です!!! 一周ぐるりと回転させてるはずなのに、二個のオブジェクトがあるとなぜか二周? ぐらい回ってしまいます。どちらかの RotationX を半分にするのかと思うんですが、 これはオブジェクトの個数が影響するんでしょうか?
>>749 とりあえず君は基礎からやりなおしたほうがいいとおもう
>>749 まずは君がテレビのカメラマンになったつもりで
固定されたティーポットの全方位を視聴者に見せるには、どうすればいいのか考えろ。
カメラマンがオブジェクトの周囲を回転するだろ? だから、
Camera.Pos = Object.Pos + Radius*(cosθ,sinθ)
以上。
カメラ行列は、その概念とは裏腹に、実際は世界を回転させてカメラに 合わせる行列だから、カメラ行列用の関数を利用しないで生の行列を 使うと分かりにくいんだけどな。
欝だ氏のうDirectXスレって中級者以上専用ですか?
鬱で氏にそうな人は誰でも利用できます
カメラが回らなくても急須が回ればいいだろ
カメラを動かすのとオブジェクトを動かすのって処理的にはどっちが軽いとかあるの? それともやっぱりケースバイケース?
757 :
デフォルトの名無しさん :2005/09/10(土) 02:36:09
君は何を言ってるんだね…
>>756 この世を終わらそうと思ったら他人を皆殺しにするか、自分が死ぬかどっちがいいの?
758は758で馬鹿だな
俺は上手いと思ったが
この世に、二人っきりだったらどっちでもいいじゃまいか。
762 :
デフォルトの名無しさん :2005/09/10(土) 05:06:19
うぇ 教えてください!!
(August2005)でD3DXを使ってDLLを添付しないで済むように作ることはできますか? また、DirectX8や7を使った時もd3dx9_27.dllは必要になるのでしょうか?
げ、もしや August2005 の D3DX は標準で入ってないんかい ……あと、dx8 なら d3dx9_*.dll は必要無いとおもう。多分 ところで「Z 値が同じポリゴン2枚を描画すると後から描いたのが必ず手前に来る」は正しい?
>>764 頂点座標がまったく同じなら、D3DRS_ZFUNCの設定による。
デフォルトはD3DCMP_LESSEQUAL。
DX9のD3DXCreateTextureFromResourceってbmp以外のフォーマットに対応してないの?
>This function supports the following file formats: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, and .tga. だよね。うん、対応してる筈。 ……ってことはリソースの組み込み方が変なのか orz
>>768 一度自分でバッファに読み込んでInMemoryとか?
むしろ、たくさんファイルがあるならリソースじゃなくデータ用フォルダに突っ込むか
データをまとめて1ファイルに突っ込んでおくのもいいんじゃ。
Visual C++ と DirectX8でゲームを作ってます。 質問なんですが、ウィンドウを動かしたり最小化して戻したりすると 画面が一瞬ノイズだらけになったり、直前に動かしていた別のDirectXプログラム (ゲームなど)の画面が一瞬映ったりするんですが、原因は何なんでしょうか? デバイスロストって奴なのかな? どう修正すれば分からず困ってます……
772 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 16:33:33
はじめまして。
gshowという動画再生のフリーソフトがあるのですが・・・このソフトを改良しようと思って日々いろいろ勉強しています。
このgshowには、ソースがついているので、改良前に自分でgshowをVisual C++6.0でビルドしようにもサッパリできないのです。
プログラミングに詳しい知人に聞いたのですが、わからず八方塞状態です。ちなみに、gshowの作者とは連絡がとれないのです。
このソースとDirectX8.0以降のSDKとWindows Media Format SDKがあれば、ビルドできるそうです。
今現在、DirectX9(october2004)SDKを導入し、コンパイルしたら下記のようにエラーがでました。
自分なりに解決方法をしらべてはいますが、1週間以上解決法がみつからないままです。
Windows Media Format 9.5SDKをインストールしてはあるのですが・・・きちんと導入できているかわからないです。
このソフトのソースをなんとかビルドできるように、ご指導よろしくお願いいたします。
/////////////// /////////////// /////////////// ///////////////
コンパイル中...
StdAfx.cpp
c:\program files\microsoft directx 9.0 sdk (october 2004)\include\strmif.h(1024) : error C2146: 構文エラー : ';' が、識別子 'HSEMAPHORE' の前に必要です。
c:\program files\microsoft directx 9.0 sdk (october 2004)\include\strmif.h(1024) : fatal error C1004: 予期せぬ EOF が検出されました。
cl.exe の実行エラー
gshow.exe - エラー 2、警告 0
/////////////// /////////////// /////////////// ///////////////
↓gshowの配布サイト
http://www.vector.co.jp/soft/win95/art/se296143.html?y
めぼしいのをビルドしてみたけど、 警告は大量にでるけど一応最後まで終わるよ。 'HSEMAPHORE' が定義されてる箇所を調べてみた? あとそれのtypedef元のDWORD_PTRはどう? それの_WIN64とかのifndefが怪しいんじゃないかな。
Platform SDKが新しくないとかじゃない?
775 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 17:27:44
772です。さっそくの御返事ありがとうございます。 773さん 私は、超初心者なので・・・ソースの中身をみても意味を理解できていません。 'HSEMAPHORE' が定義されてる箇所を調べたり・・・というのはできないです。 すいません。 普通に、VC++をインストールして、DirectX9 SDKとWindows Media Format 9.5SDK インストールするだけでは、ビルドできないということでしょうか? 774さん 何かの本で、最近のDirect X9は、Direct Showが導入されていない という記事を読み、DirectX9のoctober2004を導入してるわけです。 一方で、Direct ShowはPlatform SDKに含まれているようになったときいたのでが・・・ ですから、古いDirect X9 SDKを入れるかわりにPlatform SDKはインストールしていないです。
>>770 ロスト前の内容は保証されない
ウィンドウを戻す前に適切に処理汁
>>775 改良しようとしているんじゃなかったのか?
定義を調べるぐらいできるだろ
778 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 18:01:29
772&775です 777さん HSEMAPHOREを文字検索するぐらいしかできないです。 何分、自分自身プログラミングのことがわかってないですから。 すいませんが、何をしたらいいのかわからないです。 改良といっても、gshowは重複起動できないので、「重複起動のチェックを外す」ことだけを目標としています。 これについては、大体の見当がついてます。 付け加えですが・・・一番最初に、DirectX9SDK(augsut2005)とPlatform SDKをいれてみたのですが、 やはり上手くいきませんでした。
なんとなくだけどVisual C++6.0ってのがダメなんじゃ?VC++.NETで試してみては?
てか何でプログラミングやったことないのにVC++がPCに入ってるの・・・
つーかDirectX初心者じゃなくてプログラミング初心者なんだろ?
スレ違いだ。
>>1 読め
>しかも最近売ってない6.0 警察の予感♪
どうせ割れなら最新版使うだろっての
786 :
デフォルトの名無しさん :2005/09/12(月) 18:08:25
772です。 プログラミングは大学の授業関連で使った程度で久しぶりに使ってるわけです。 なんで「警察の予感♪」なのかわかりませんが、きちんとその当時に、アカデミックパックですが、 家電店にて購入したものなので違法性など微塵もありません。 VC++.NETで試すのも一つの方法かもしれませんが・・・gshow事態は、VC++6.0で作っているので、 VC++6.0を使うことはとんでもない間違いではないはず。
>>786 DirectX SDKのOctober 2004はPlatform SDKを必要とする。
最新のPlatform SDKはVC++6ではうごかないので、
Platform SDKのFebruary 2003を導入する必要がある。
>>プログラミングは大学の授業関連で使った程度で久しぶりに使ってるわけです。 俺には既にあなたが学生ではないような書き方に思えるのでが >>家電店にて購入したものなので違法性など微塵もありません。 アカデミックパックは学生の間だけですよ?
ライセンス違反だな
今3Dのシューティングゲーム作ってるんだけど ホーミングレーザーがうまい具合に作れないっす。 バーチャロンのサイファーがうつ4つでるレーザーみたいに作りたいんだけど 誰かアドバイス求む。
>>790 バーチャ論は知らんが
明後日の方向に撃って
高次曲線で補間じゃ駄目なのか?
>>790 バーチャロンなんて知らないから画像とってこい画像。
そしたらやり方教えてやる。
>>790 オペムー止まりの俺はVIPERUしか知らん。
>>772 VisualC++ 6.0
DirectX 9.0 SDK October2004
Windows Server 2003 SP1 SDK
Windows Media Format 9.5 SDK
(OS:WindowsXP)
wmstub.lib 非リンク
hr = WMCreateCertificate(&m_pCert); -> hr = E_FAIL;
でビルドできたわよ。
enderStateが不明なデバイスの画面に、確実にポリゴンを頂点色で表示するには どうしたらよいでしょうか? 他のプロセス(ゲーム)の画面上にFPSをポリゴンで作った数字で表示させようと しているのですが、一応表示はできたもののFPSのポリゴンの色が変わったり 消えたりします。 D3D9でお願いします。
>>800 のレス予想
1、エンダ〜♪
2、そういえばender's gameの映画化ってどうなった?
800 :
798 :2005/09/12(月) 21:42:45
'R'が抜けてました。
801 :
772 :2005/09/12(月) 23:17:28
787さん&797さん いろいろアドバイスありがとうございます。「windows media format 9.5 SDK」と「Platform SDK」のIncludeとlibraryのリンクを再度見直して、リンクをやり直してみたら、772よりも進みました。しかし・・・・まだ完全にビルドできないです。 hr = WMCreateCertificate(&m_pCert); -> hr = E_FAIL; を追加しましたが・・・・ ////////////////////////////////////////////////////// コンパイル中... DsControl.cpp C:\Documents and Settings\take\デスクトップ\gshow100\src\DsControl.cpp(105) : error C2143: 構文エラー : ';' が '->' の前に必要です。 gshow.cpp コードを生成中... cl.exe の実行エラー gshow.exe - エラー 1、警告 0 /////////////////////////////////////////////////////// とエラーが出てしまいます。 ちなみに hr = WMCreateCertificate(&m_pCert); -> hr = E_FAIL;の -> hr = E_FAIL;を追加しない場合は、 ///////////////////////////////////////////////////////// リンク中... LINK : fatal error LNK1104: ファイル "wmstub.lib" を開けません。 link.exe の実行エラー gshow.exe - エラー 1、警告 0 //////////////////////////////////////////////////// と出てしまいます。とりあえずここまで進みました。なにか気がついた点がありましたら、ご指導をお願いいたします。私事ですが、明日は仕事で当直なので水曜日以降に、書き込みにたいする返事をいたします。
てかプログラミングの知識無いのにどうやって改良すんのよ・・・。 基礎を知ってないと幾らソース眺めても何も出ないよ・・
フフフ微笑ましいナア
804 :
772 :2005/09/12(月) 23:36:45
hr = WMCreateCertificate(&m_pCert); -> hr = E_FAIL; の意味は、追加ではなくて WMCreateCertificate(&m_pCert)をE_FAILに代えるってことなのかな? E_FAILに代えてみても・・・ ///////////////////////////////////////////////////////// リンク中... LINK : fatal error LNK1104: ファイル "wmstub.lib" を開けません。 link.exe の実行エラー gshow.exe - エラー 1、警告 0 //////////////////////////////////////////////////// のままです。 確かに、私はプログラミングの知識はほとんどないですが、どうしてもこのフリーソフトを改良(重複起動のチェックをはずす)ことをしなければならないので どうが見捨てずにご指導ください。よろしくお願いいたします。
>>804 そうよw
wmstub.lib は最新のSDKでは必要ないみたいだから
メニューの[プロジェクト]-[設定]-[リンク]のライブラリ欄から
wmstub.lib を削除すればいいわ…
どこまで続けるつもりだよ…
だから一から全部覚えればいい話じゃん。 全部他人任せかよ。ちょっとは努力しろや。
別にプログラミングをしたいわけじゃなくて、 上司かなんかに言われてそういうソフトが必要になったダケ とかじゃねーのかな。 プログラミングは大学でかじったことあります、って言ったツケが回ってきたとかナ。
一度ウィンドウ外にカーソルを移動させないと砂時計のままです。 どうすれば直りますか?
>>809 カーソルを一度ウインドウの外に移動させれば直るよ。試してみ?
>>810 直りませんでした
どんな原因が考えられますか?
OpenGLスレから飛び火した模様
コンパネのマウスのポインタって所でカーソルの形状を全部砂時計じゃなくせば直る
よくわかんないけど、とにかく後は ソースのどこかを2行コメントアウトすれば目標が達成されるみたいよ。 これは自力で見つけて欲しいわね。
>>809 ::LoadCursor(NULL, IDC_ARROW);
>>816 うまくいきました
ありがとうございます
XSIのボーンによるスキンアニメーションがよくわからん。 ていうかどこで質問すれば良いのかよくわかんないからとりあえずここで質問してみる。
820 :
デフォルトの名無しさん :2005/09/13(火) 21:46:40
始める前から、他力本願か・・・
ていうか本当に今更だな。
>>819 入門向けの本
FPS制御みたいなゲ製作板でFAQになりそうな事が書いてある
もし工学社みたいなリファレンス風が好みなら、その正反対なのでおすすめできない
エロゲ屋さんは未だにDX7しか使わせて貰えないのか
SDKにDXSetup.exeが入ってなかったんだけどどこ?
>>825 DXSetup.exeみつけたらSDKのバージョン教えてくれ
ヘルプには入ってるって書いてるのに無い
October 2004です
>>826 Redist\DirectX9フォルダに入ってる。(October 2004)
今凄いことに気づきました
間違えて(December 2004)入れてました
おさがわせして本当にすみません
特に助言いただいた
>>827 さんにはご迷惑をかけました
今からDirectXと性根を入れなおしてきます
ありがとうございます
>>818 フォーマット公開されてんじゃん。
その前に君はXファイルのスキンアニメーションはできるレベルなの?
質問です。XP、.NET です。 DirectPlay8Peer についてです。 IDirectPlay8Peer::Host() を実行したところ、ウィンドウに制御が戻ってくるのにかなりの時間がかかりました(2秒ほど)。 例えば IDirectPlay8Peer::Connect() では、DPNCONNECT_SYNC を指定しないことで 処理を非同期にできますが、Host() ではこれを行う方法はないでしょうか。 スレッドを作成して並列処理を行うしかないでしょうか? また、Host() が実行されると、DirectPlay8Peer で指定したコールバック関数に DPN_MSGID_CREATE_PLAYER が届きました。 特に問題ないのですが、ホスト自体がセッションに参加したときにこのメッセージが届くのに不自然を覚え、 MSDN を見ても、このメッセージが送信されるという記述がありませんでした。 これはこういう仕様なのでしょうか。 以上2点ですが、よろしくお願いします。
>>831 Hostは起動時に時間がかかる仕様。
MSのソフトのAoKとかもバッチリ固まってくれるよ。
AoKはConnectすらSYNCでやってるっぽい。
DPN_MSGID_CREATE_PLAYERがホスト生成時にも生成されるのは非常に便利。
コールバック引数に渡される構造体のpvPlayerContextの初期化とかをここで行うとよい。
ホストプレイヤーの場合はHost()に渡すときにpvPlayerContextを初期化できちゃうけど、
ユーザーコンテキスト側からDPNIDの参照設定のタイミングとしてはここが最高かと
833 :
831 :2005/09/14(水) 04:17:49
>>832 時間がかかるのは仕様ですか・・・。まあ大きな問題はないので、これについてはあきらめます。
メッセージについても理解しました。詳しい説明ありがとうございました!
卒研としてラッパーライブラリーを作ろうと思ってんだけど すでに開発ストップした既存のラッパーライブラリーを少しいじって 俺のものにしちゃっても問題ないよね? C++とDX9SDKで動くやつにしようかと思ってる
835 :
デフォルトの名無しさん :2005/09/14(水) 09:18:53
知るか。
釣りか?w つーかそんなんで卒研になるのかよ
Easy Link Libraryのことですね
>>836 友人の卒研がプログラムでOKだったのでじゃあ俺も同じにしようかと
839 :
デフォルトの名無しさん :2005/09/14(水) 12:57:31
プログラムといってもピンキリな訳だが。
新しいUpdateを入れてから気づいたのですが、サンプルがほとんど入っていません おそらく前のバージョンに入っているのでしょうが、古いバージョンをインストールしてなにか問題は発生しますか?
フルスクリーン表示/ウィンドウ表示の切り替えは、 1: ウィンドウを非表示にする 2: Device をリセットする 3: ウィンドウのスタイルを変更して表示する ……で合ってますか? 今は上手く動いてるけど、いつ動かなくなるかと思うと心配で心配で。
質問です。XP、.NET です。 かなり初歩的でお恥ずかしい質問なのですが・・・。 DirectPlay8Peer を使っています。 DPN_PLAYER_INFO 構造体のメンバに、pwszName というのがあり、型は PWSTR 型です。 サンプルでは、pwszName = L"hogehoge" というように、L という・・・ 演算子?か何かよく分からないものを用いて文字列の代入を行っています。 この L は何者なんでしょうか。 また、char[] 型に格納されている文字列をこの pwszName に代入するのはどうすればいでしょうか。 よろしくお願いします。
ASCII文字列(1バイト、char形の文字列)を"..." UNICODE文字列(2バイト、wchar_t形の文字列)をL"..." で表す。 DirectPlayは基本的にUNICODEを使うのでL"hogehoge"を代入する。
あと、char形からwchar_t形に変換するには mbtowcだったかその辺の関数を使うんだったかな。 俺はもうめんどくさくなってデフォでUNICODE使うプログラムを作ることにしたよw そのほうがフォントとか自力描画するとき便利なんだわ
845 :
842 :2005/09/14(水) 15:52:19
>>843-844 なるほど。文字コードの知識はかなり薄いので、詳しく調べてみます。
詳しくありがとうございました。
ビュー行列からカメラ位置を得ることは可能?
[Rx,Ry,Rz] [Px] [Rw] [Sx,Sy,Sz] x [Py] = [Ry] x -1 [Tx,Ty,Tz] [Pz] [Rz] R : 転置View行列の1行目 S : 転置View行列の2行目 T : 転置View行列の3行目 P : カメラ位置
間違った。正しくはコレ [Rx,Ry,Rz] [Px] [Rw] [Sx,Sy,Sz] x [Py] = [Sw] x -1 [Tx,Ty,Tz] [Pz] [Tw]
GUIが使えるのはどのバージョン以降ですか?
>>846 カメラ位置をビュー行列で変換したら原点に来るんだから、その逆を考えてみましょう。
質問です。XP、.NET です。 DirectPlayPeer8 に関してですが、 自分自信の DPNID を取得するにはどうすればいいでしょうか。 ホストがセッションを構築したとき、ホスト自体にも DPN_MSGID_CREATE_PLAYER が届くため、 セッションに参加したのが自分なのか他人なのかを調べたいのです。 現在は DPN_PLAYER_INFO 構造体の pwszName で比較を行っていますが、 これだとたまたま名前がかぶったときに衝突してしまいます。 よろしくお願いします。
そんな餌じゃこの俺は(ry
853 :
851 :2005/09/14(水) 18:02:42
あれ、何か勘違いをしていたでしょうか。もう少し考えを整理してみます。申し訳ありません。
854 :
851 :2005/09/14(水) 18:07:52
もしかすると、DPNID はセッション参加時に割り当てられるということは、 DPN_MSGID_CREATE_PLAYER が届いたときの処理ではじめて(自分のも含め)DPNID を取得するのですか? では、セッションに参加したのが自分かどうかを判定するには、IP などの情報から判断するのが適切なのでしょうか。
855 :
851 :2005/09/14(水) 18:13:21
dwPlayweFlag・・・ 自己解決しましたorz お騒がせしました・・・。
>>851 君さ、次々質問してるけど
その件について、中国の了解を取ったのですか? 取ってないでしょ?
アジアの人々はみんな怒ってますよ!
DirectPlayはその辺の処理にパターンがあって凄く綺麗にまとまるんだけれど。 それに気づかないうちは単にめんどくさいだけにしか見えないんだよなあ…
違うPCで同じプログラムを動かしてて、 timeGetTime()の精度が違っちゃうんですけど、どうしたら良いんですか? timeEndPeriod(1);//・・・1 timeBeginPeriod(1); 座標 += ミリ秒単位の移動量 * (timeGetTime() - 前のフレームの時間); 前のフレームの時間 = timeGetTime(); timeEndPeriod(1);//・・・2 endPeriodの位置変えてみると 片方の動作がちょっと変わるんだけど、 どうしてだろう…。 グラフィックボード関係あるかな・・・?
timeGetTime()が二箇所にあるのは感心できないなあ 始めのtimeGetTimeと次のtimeGetTimeの間にタスク切り替えが 発生したら平気で10ms単位でずれていきそう 現在時間 = timeGetTime(); 座標 += ミリ秒単位の移動量 * (現在時間 - 前のフレームの時間); 前のフレームの時間 = 現在時間;
timeBeginPeriodとかはプログラムの最初と最後でやっとけば後は放置だろ
>>859 ,860
ありがとうございます。
とりあえずそうしてみます。
862 :
772 :2005/09/14(水) 22:31:03
>>805 まだ、うまく行かないですが・・・原因を調査中です。アドバイスありがとうございました。
今回の件をきっかけに、もっとプログラミング勉強しようと思います。
ありがとうございました。
--------------------構成: gshow - Win32 Debug--------------------
リンク中...
uuid.lib(oaidl_i.obj) : fatal error LNK1103: デバッグ情報が壊れています; モジュールを再コンパイルしてください
link.exe の実行エラー
gshow.exe - エラー 1、警告 0
>>862 VC6でPlatformSDKのライブラリをリンクするとうまくいかないから、
ライブラリディレクトリ欄から削除(それか下の方に移動)するといいわよ。
864 :
772 :2005/09/14(水) 22:47:12
>>863 できました!!ありがとうございました!
これから改良に取り組んで行こうとおもいます。
本当にありがとうございました。
865 :
772 :2005/09/14(水) 23:06:20
>>863 改良も、見当をつけていたところを少し修正したら成功しました。
本当にありがとうございました。
ここの皆様のご指摘通り、まだまだ勉強が足らないのは確かなのでこれからじっくり勉強していこうと思います。
ありがとうございました。
叩きに耐えてよく頑張った!感動した! ・・・気がする。
867 :
デフォルトの名無しさん :2005/09/15(木) 14:11:04
厚顔無恥乙wwwwwwwwwwwwwwwwww
とりあえず某所にあったラッパーライブラリーを いろいろいじって俺のものにしちゃうことにした 調べたけどベクターとかに登録されてないみたいだし 完全に俺のものとして俺の名前で登録予定 どんな名前のラッパーライブラリーにすっかなーと考えてる
ん? 怒って欲しいのか?
俺もパクりたいからそのライブラリ教えろ
パクりじゃない。インスパイアだろ?
じゃあそのインスパイアって方法でコピーするから頼む
パクリでもインスパイアでもなく 完全に俺のものにするんで 乗っ取り かな
現在も更新が続いてる国産ラッパーライブラリなんて存在しなくね?
そもそもラッパーライブラリが必要ってのが理解できぬ。
その労力使ってゲームエンジンでも開発したほうがよっぽど役に立つのにね 昔は初期化だけで200行以上書かされた しかもバグや環境依存を回避するコードを入れたらさらに増える そういう時代なら役割があったのかもしれない
そこらのラッパー使うと余計に分からなくなるから絶対に使わない。
>昔は初期化だけで200行以上書かされた 今もじゃん。
>しかもバグや環境依存を回避するコードを入れたらさらに増える 今もじゃん。
今はネスト5段とかないだろ?マシにはなってるんだって
DirectXも使いやすくなったよね。 今更WinAPIで作りたいなんて思わない。
WinAPIも9x系捨てていいならそれなりに使いやすい気がする。
DXSTRUCTURE s; s.dwSize = sizeof(DXSTRUCTURE); こういうの無くなって良くなった。
>>883 DPN_PLAYER_INFO dpi;
dpi.dwSize = sizeof(DPN_PLAYER_INFO);
ってのならあるけどこれとは違うんだろうか。
初期化ルーチンなんて一回書いてしまえばほぼ使い回し、 レンダリング部分も特に面倒なことなんてないし。 強いて言えば、デバイスロスト時の動作周りか? エラー処理部分も例外使えば結構すっきりするし、 どう考えてもラッパーの必要性を感じない。 ところで、アームレストの布地が破れた。 1年も持たないのか。。。
>>883 DXSTRUCTURE s;
ZeroMemory(&s,sizeof(s));
s.dwSize = sizeof(DXSTRUCTURE);
じゃね?
>>885 駄目。MSのAPIはソースぐちゃぐちゃになって、ラッパー書かなきゃわけわかんね。
せめて機能ごとにまとめておいてくれないと、どういう意図でそのAPIを使ってるのか、
作った人間に聞かないとわからない。ラッパーじゃないにしてもブロックごとにコメントはつけておいてほしい。
でも、ラッパーになっていてくれれば、ラッパーで提供されてる関数ごとに何をやっているかの概要だけはすぐに掴める。
>>886 DXSTRUCTURE s = {sizeof(DXSTRUCTURE)};
そういう知らない人がいてもおかしくないマニアックな仕様を わざわざ使うのはどうかと思うよ。
890 :
888 :2005/09/15(木) 23:33:58
えー
>そういう知らない人がいてもおかしくないマニアックな仕様を どこが?
2Dの単純描画を3Dで書いてる自分に矛盾を感じる。
無知を正当化するとはレベル高すぎですね。 ローカル仕様じゃなく、cの規格にのっとっているはずだし Win32にも最初のメンバがサイズであるような構造体が大量にあるわけだが。
こんなん使ってるのやねうら某ぐらいだろ。
どんなスパゲッティなコードでも規格にのっとっていれば良いのか? レベル高すぎだな。 速度や容量その他のメリットがあるならわからなくもないが、、 違わないなら、わかりやすい(多く知られてる一般的な)書き方をするのが当然だと思っていたが。
_, ,_ パーン
( ‘д‘) <馬鹿にレスつけんな!
⊂彡☆))Д´)
>>898
この手の話題はレスが伸びる 相変わらず
何処のスレでも言語に話が及ぶと伸びるよな。 それぞれ言語スレが立ってるだろうに。
つまり、ごく当たり前の仕様に則ったノウハウも知らない香具師ほど自分を否定された気になって吼えるんだよ。
俺の脳が摂動された。
904 :
デフォルトの名無しさん :2005/09/16(金) 08:09:58
結論はでてる。
仕様にも糞仕様ってものが存在する。
特にプログラムにおいて可読性は最優先事項だ。
一体
>>888 で何が得られるものがあるのか激しく疑問。
就職作品なら書いてあった時点で落とす。あまりにもキモ過ぎ。
906 :
デフォルトの名無しさん :2005/09/16(金) 11:47:41
Direct3Dで3Dのモデルをフォームに表示したいと思っています。 当方、VisualStudio.NET(2003じゃない)を持っており、DirectX9をインストールしました。 VisualStudio.NETで、(できればVBで) DirectXインストールから、マウスドラッグで簡単な3Dモデルが動かせるようなプログラムを 書くまでを解説してるようなサイトってないでしょうか?
DirectPlayでDPN_PLAYER_INFO構造体のpvDataに文字列Sを入れる場合 dwSizeはstrlen(S)+1でいいんですよね?
間違えました。DwDataSizeです。
>>886 HOGESTRUCT d = { sizeof(d) };
として、dwSize の初期化と残りのゼロ埋めを
まとめてやってしまうコードもたまに見るな。
911 :
デフォルトの名無しさん :2005/09/16(金) 14:23:33
>>910 俺は0埋めがメインで、sizeof dはついでだと思っている。
914 :
デフォルトの名無しさん :2005/09/16(金) 22:59:02
BC++5.5やmingwのようなフリーのコンパイラで DirectX9による3Dプログラミングは出来ますか? Webの情報だと古いものしか見つかりませんでした。 ご存知の方いらしたら教えていただけないでしょうか?
>>914 やったことないけど、DirectXSDK を落としてきてパス設定とか設定すれば問題ないはず
916 :
デフォルトの名無しさん :2005/09/17(土) 12:06:06
class CCharData { public: CCharData() { ZeroMemory(this,sizeof(CCharData)); } LPD3DXMESH pMesh; D3DMATERIAL9* pMeshMaterials; LPDIRECT3DTEXTURE9* pMeshTextures; DWORD dwNumMaterials; } ; enum { MAX_CHAR = 10 } ; CCharData CharData[MAX_CHAR]; という風にCCharDataクラスを使ってXFileを読み込み表示したのですが for (int i=0; i<MAX_CHAR; i++) { SAFE_RELEASE( CharData[i].pMesh ); CharData[i].pMeshMaterials = NULL; CharData[i].pMeshTextures = NULL; } でメモリ解放してもメモリリークしてしまいます。 クラスでなく構造体でやるとメモリリークしませんでした。 どこが悪いのか教えていただけないでしょうか。よろしくお願いします。
クラスとか構造体とかとは関係ないんだけど > CharData[i].pMeshTextures = NULL; これはまずいんじゃない? これもRelease呼び出さないと。
>>CCharData() { ZeroMemory(this,sizeof(CCharData)); } どうでもいいけど、これクラスが仮想関数持ってたら 仮想関数テーブルポインタも初期化しちゃって、そのうちアボンよ。
>>917 >SAFE_RELEASE( CharData[i].pMesh );
よくわからんけど、これがそうなんじゃね?
920 :
デフォルトの名無しさん :2005/09/17(土) 12:55:33
>>917 ポインタはリリースできないとか言われちゃったので、無理やりNULLしてました;
>>918 おおお;そんなことが。
変数ごとにNULLか0かします。
>>919 SAFE_RELEASEでメッシュをReleaseしてNULLを入れてるんですが迷子です
ZeroMemoryをやめてD3DMATERIAL9とLPDIRECT3DTEXTURE9をポインタで
無いようにしてやってみます。
ありがとうございます。
921 :
916 :2005/09/17(土) 14:22:50
できました! 初歩的なミスでしたすみません; for (int i=0; i<MAX_CHAR; i++) { for (int j=0; j<CharData[i].dwNumMaterials; j++) { SAFE_RELEASE( CharData[i].pMeshTextures[j] ); } delete[] CharData[i].pMeshTextures; delete[] CharData[i].pMeshMaterials; SAFE_RELEASE( CharData[i].pMesh ); } と配列の削除を入れたらメモリリークが無くなりました。
>>921 あー、そういやそんなのあったなぁ。
STLのvectorとstringとlistはお手軽に使えて便利だから
ちょっとだけかじってみればそういう苦労なくなるよ。
924 :
デフォルトの名無しさん :2005/09/18(日) 01:22:16
コンパイルしたexeを直接実行するとMPEGファイルが実行できるけど、 デバッガの中から実行するとRenderFile()で0x80040200エラーになってしまう。 何か手がかりありませんか? 環境はVisual C++ 2003, WinXP Proです。
MPEGファイルがdebugフォルダの中にある
926 :
924 :2005/09/18(日) 01:50:27
"MPEGファイルが実行"→"MPEGファイルが再生"の間違い。
>>925 ファイルはプロジェクトと別フォルダに置いてあります
MPEGファイルへのパスを、フルパスで渡すと?
928 :
924 :2005/09/18(日) 01:58:09
渡してます。 #defineFILENAME L"c:\\home\\foobar.mpg" .... IGraphBuilder *pGraphBuilder; IMediaControl *pMediaControl; HRESULT hr; hr = CoInitialize(NULL); hr = CoCreateInstance(CLSID_FilterGraph,NULL, CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder); hr = pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl); hr = pMediaControl->RenderFile(FILENAME); ここでエラー。
929 :
924 :2005/09/18(日) 01:58:42
渡してます。 #defineFILENAME L"c:\\home\\foobar.mpg" .... IGraphBuilder *pGraphBuilder; IMediaControl *pMediaControl; HRESULT hr; hr = CoInitialize(NULL); hr = CoCreateInstance(CLSID_FilterGraph,NULL, CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder); hr = pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl); hr = pMediaControl->RenderFile(FILENAME); ここでエラー。
930 :
デフォルトの名無しさん :2005/09/18(日) 04:30:29
今作りかけのゲーム用のライブラリがあります。 これのインターフェイスはほぼ素のC++であり 依存する他のライブラリはDirectXぐらいです。 これらの設定を入力する為にダイアログを作らなきゃならなくて windows用のGUIフレームワークが必要になるんですが 何使うのがベストですか? 思いついた一覧 MFC → IDEのサポートが効くしシンプルな構造で使いやすそう、独自コンテナとかウザい、この板の評判が悪い。 ATL/WTL → 軽い、この板の評判はいい、ドキュメントがソースのみ、MFCそっくりなのであえて選ぶメリットが不明瞭。 JavaSwing → 今風な作りで楽に書けそう、Windows+DirectXの構成でわざわざJavaを選ぶのはアクロバティック過ぎないか? そもそもDirectX動くのか? .NET WindowsForm → 今風な作りで楽に書けそう、.NETの仕様を一から覚えるの大変、MC++なんとなく嫌。
Win32プラットフォームのライブラリならって事だけど、 どれも全く経験が無いなら、MFCが扱いは楽で導入の問題も比較的少ない。 .netは、クライアントに.net Framework入れるのが前提になるので、 俺は配布するようなライブラリには、絶対選ばない。Javaも同様。 ATL/WTLが個人的には一番オススメ。使用経験ないならこの際いかが?w MFCそっくりだから選ぶメリットが不明瞭というけど、 それはGUIフレームワークを使用して、プログラミングした時だけの話でしょ。 結果生成される物は、似て非なる物だもの。
初心者がMFCやるとDoc/Viewだけでわけ分からなくなって撃沈するんじゃないの?
そんなに複雑なもんでもないと思うけどDoc/Viewは。 あれで躓くようなら、他のGUIフレームワークどれでも躓くような気がするが。 それだったらいっそのこと、VCLでも薦めるよ。
MFCだからといってDocViewを強制される訳では無いのだが・・・
>windows用のGUIフレームワークが必要になるんですが >何使うのがベストですか? もはやQt以外に選択肢は無いな。
DirectX 7 SDK 日本語ドキュメントが欲しいのですが、MSサイトに行っても 8以降のバージョンしか置いてありません。 他にインターネット上で入手する方法はありませんか?
すみません自己解決しました。
MFCわかんね。
ダイアログだけ使うならMFCも難しくはないでしょ。
ダイアログだけで良いなら、APIだけで作るのもありかと。 たかがゲームの設定ダイアログだけの為に、フレームワークだの何だのは大げさな気がするけど。
そう、ダイアログなんてAPIだけで十分。 プログラムからやるのは、初期値の設定と最後に ダイアログから値を取得することくらいだし。
APIベタでやるんならWTLでいいじゃん
WTLなんて今更感ありすぎ
今の時代WTFだよな
945 :
930 :2005/09/18(日) 16:21:50
お答えありがとうございました。 お答え参考にしてMFCで行くことにします。 Qtというのもちょっと調べてみます。
マウスカーソルの位置によって速度が変わります。なぜでしょう? 解像度を640x480にすると、SDKサンプル全てで発生します。
947 :
デフォルトの名無しさん :2005/09/19(月) 02:18:28
DirectX9の勉強をするために、本を3冊ほど買ったのですが、 発行年度がバラバラで、 1.2004年1月 2.2004年11月 3.2005年3月 となっていて、一番新しいやつを読むと、2004年の途中で大幅に仕様が変更になったらしいのですが、 この場合どうしたほうが良いでしょうか? 自分として考え付くのは、発行年度が一番古い本のバージョンのDirectXを入れて、古い順に勉強していって、 次の本に行くごとにその本にあったDirectXのバージョンを入れる または、一番新しいやつを最初に勉強して、古いやつのコードを新バージョンのDirectXにあうように書き換える(出来るかどうかわかりませんが)。 位なんですが、どうでしょうか?
2chでは糞本が多いとされるDirectX関連本をまとめて3冊買う蛮勇にまずは乾杯。 仕様変更っちゅーても、初心者が学習する範囲においては気にするようなモンじゃないよ。 いーんじゃない? 新しいので。なんの本買ったのか知らんけど。
>>947 SDK付属のサンプルコードだけで十分。
Microsoft謹製
950 :
947 :2005/09/19(月) 11:52:01
一応アマゾンでは評価が高いやつを買ったんですけど、 1.DirectX9シェーダプログラミングブック 2.DirectX9ゲームプグラフィックスログラミング Ver.2 3.DirectX9 DirectX Graphics を買ったんですが、古いやつほど、ページ数が多く色々書いてあるので・・・ 仕様変更は、ライブラリが変更になったり、関数が変更になったりと書いてあったと思うんですが、 古いコードを新バージョンに対応させることって出来ますかね?
951 :
947 :2005/09/19(月) 11:54:30
>>949 SDKのヘルプとかも一応見たんですけど、どうもPC上に書いてある長文は苦手で、
本で見れるものがほしかったので。
というか今現在出版されてる書物で最新のDirectXの仕様に対応してる奴ってないよな? SDK付属のドキュメントも日本語版は古いままだしなぁ。
そりゃ最新の仕様が出たのが8月だしな
一番古いのがシェーダプログラミング とか書いてあるし どのみち後ろの二つで先に基礎を学ぶことになるのでは
DirectX SDKのチュートリアルに当たる部分に仕様変更なし
>> パフォーマンスの低下を招くことは間違いないようなので、正方形にします。 >現在テスト可能な環境、SavageIX、G200、G400MAX、Radeon9600Proで、 >トランスフォーム済み頂点で1024×512のテクスチャを640×480に切り出して >ひたすら描画するだけのテストをしてみましたが、 >512×512を二枚使って二回描画した方がパフォーマンスが落ちてしまいました。 > >間違いないと断言されていらっしゃるので、何らかのテストされたのだと思いますが、 >具体的にどの製品でどのような描画の仕方でパフォーマンスの低下が確認できたのでしょうか? 2回レンダしたら遅くなるの当たり前だろ知障 2048*1024と1024*1024から640*480だけ抜いて比較しろよ染色体異常者
おこったごーん
>>956 2048にする意味がわからんのだが、
そもそも1024*512と512*512二枚とどっち使うかという話だったんでは?
俺は素直に1024*512使うが。
>>958 あいつは正方形のほうが速いということに反応し、
512*512*2と1024*512で比較したんだよな?
正方形が速いという話はテクスチャ1枚のことであって、
2枚と1枚を比較してる時点で頭おかしいだろ?
640*480で正方形と長方形を比較するなら、
これがすっぽり収まる2048*1024と1024*1024だろ?
元々の512*512*2と1024*512の話は別で、
どれぐらいの大きさまで使えるのか聞いてただけだろ?
>1024×1024ぐらいのサイズのテクスチャはたいてい作れます。 >ただ、なしさんが言われたようにパフォーマンスは保障されません。 >工夫して、無駄をなくすことを心がけましょう。 >例えば、よく使う640×480や800×600の背景などは、実は512×512のテクスチャ2枚の中に納まります。 >これだけで、1024×1024のテクスチャよりも半分節約できます。 こいつがそもそも頓珍漢 同一人物か?
962 :
デフォルトの名無しさん :2005/09/19(月) 18:53:37
つーか、
>>956 ってどこへのレスなんだ。
アンカーぐらいちゃんと使ってくれよ。
963 :
デフォルトの名無しさん :2005/09/19(月) 19:08:31
今c++を勉強してるんだが、掲示板みてるとJAVA の方が主流?そこで質問 C VS JAVA 使いやすさ、流通度、就職や職場ではどちらが使われているか の点から意見求む。
>>963 スレタイも読めない人には教えられません。
というか先に日本語勉強しましょう
>>963 C++とDirectXが主流ですよ
使いやすいし、これ以外流通してない
JAVAは趣味程度なのかな? ここの板みてるとJAVAが多いような気がする。
967 :
デフォルトの名無しさん :2005/09/19(月) 19:43:29
何故BBXの話題がここで?
わざとJavaの話題を出して、C++使いにJavaを叩いてもらいたい、 よくある厨のパターンですか。
970 :
924 :2005/09/19(月) 22:31:17
924です。 相変わらず解決しません。 MPEG1, AVIは問題なくデバッグ可能ですが、MPEG2だけだめみたい。 (作りたいのはMPEG2なので、他のフォーマットが再生できても) アドバイスをお願いします
MPEG2だからじゃね?
D3DXPlaneFromPointsに指定する頂点の順番は 時計回りでよろしいでしょうか?
973 :
デフォルトの名無しさん :2005/09/20(火) 00:03:28
test
このスレを埋めたいと思うのは俺だけだろうか? 埋め
そろそろ次スレ
>>972 時計回りなら平面の法線(a,b,c)が上、逆なら下になるわ。
(v2-v1)と(v3-v2)の外積(の正規化ベクトル)ね。
平面の式としては同じだけど、
平面の向きが関係する関数(D3DXPlaneDotCoordとか)では
結果が変わってくるみたいね。
とりあえず法線が上になる時計周りにしておけばいいわ。 D3DXPlaneFromPointNormalってのもあって、こっちの方がわかりやすいかもね。
979 :
974 :2005/09/20(火) 00:30:41
親切な解説どうもありがとうございました。 こういうドキュメントに載ってないのは、やっぱり 実験実証なのでしょうか。て、それしかなさそうですね。 面倒くさがりな自分....
サービスプロバイダとポートだけ設定して hr = lpDirectPlay8Peer->Connect(&dpnAppDesc, prgHostAddr, prgDeviceInfo, NULL, NULL, NULL, 0, NULL, NULL, NULL, DPNCONNECT_OKTOQUERYFORADDRESSING | DPNCONNECT_SYNC); if(FAILED(hr)) { //エラー処理 return; } として実行したらIP入力ダイアログに何を入力してもエラー処理に行かないで ダイアログが再度出てくるのですがDPNCONNECT_OKTOQUERYFORADDRESSINGっていうのは そういう仕様なんですか? キャンセルしてもダイアログがまた出てくるから強制終了しか出来ないorz
981 :
980 :2005/09/20(火) 02:49:18
あー、DirectPlayのサンプルを試したらちゃんとエラー処理に行ってるなぁ。 どこで何間違えてるんだろう…orz
埋め 後17
次たってないのに梅んな
>>982 IPアドレスはコーディング段階では未入力で
実行時にDPNCONNECT_OKTOQUERYFORADDRESSINGによって作成されたダイアログに入力してます。
適当な数字、文字列、ポートを指定せずにIPを入力してOK、もしくはキャンセルを押した場合は
即座にIP入力ダイアログが再出現します。
127.0.0.1:2345などの形式で入力した場合は、接続試行をした後再度ダイアログが出ます。
>>986 DirectPlayのサンプルが、きちんとエラー処理に飛んでるなら、
絶対どこかに違いがあるはず。
ほんの些細な事でもいいから具体的な違いを見つけ出すしかないかと
988 :
980 :2005/09/20(火) 09:59:30
>>987 原因が判明しました。
bool OnConnect () {
//省略
hr = lpDirectPlay8Peer->connect(...);
if(FAILED(hr)) {
MessageBox(NULL, "接続失敗", "ERROR!", MB_OK | MB_ICONWARNING);
return false;
}
としているのですが、このOnConnect()が誤ってループの中に書かれているというお約束のミスでしたorz
お騒がせしました。申し訳ないorz
次スレよろしく
それにしてもなんで【C++】なんだろw
【C++】【C♯】ならともかく何で【C++】を2つ書く必要があるのかってのは前から思ってた
おまじない
結界張ってんだよ
C++ってしーぷらぷらって読むよりしぽぽって読むほうが楽しいよ、ね?
ume
@2ハァハァ
1000は俺が取る! 誰かが1000を狙ってる余寒
俺が1000だ!!!!!!!!!1111111111111111111
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。