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

C#でDirectX9 初心者の館

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Windows Longhorn でGDIに取って代わって標準になりそうなDirectX9ですが
GDIと違ってドキュメントも難解で何をすれば描画できるのかさっぱりさっぱりなライブラリです。
その上知っている人はレベルが高すぎて聞いても宇宙語でしす(泣
そんなDirectX9を将来に備えて勉強してみようというスレです。
Microsoftの掲示板
http://www.gdncom.jp/general/bbs/ShowForum.aspx?ForumID=29
SDKをダウンロードできるところ
http://www.microsoft.com/japan/msdn/directx/downloads.asp#CDasp#CD
0162デフォルトの名無しさんNGNG
イベントをウインドウ制御側のスレッドで実行したければ、
必要に応じて別スレッドからSendMessageでユーザーメッセージを処理させればいいだけだし。
何故イベントリブンを無意味にするような方法を使おうとするのだろう?
0163デフォルトの名無しさんNGNG
スレッドはパフォーマンスが落ちるからなるべく避けてきたというゲーム独特の歴史的背景のせいだと思われ
016454NGNG
>157
そのソースを見る限り「Invalidate」のおかげで
WndProcに戻ってきてるのでは……。

だったらそもそもOnPaintの中に書けばいいんじゃないかな。

0165デフォルトの名無しさんNGNG
そしてメッセージループ中で重い処理を書いた方が、
ウインドウの反応速度が落ちて重く感じることになるという。
0166デフォルトの名無しさんNGNG
http://www.csharphelp.com/archives2/archive387.html
0167デフォルトの名無しさんNGNG
OnIdleなんぞ使おう物なら、どうでもいいときに制御が回ってきて無駄が多いは、
他のスレッドが重い処理をするととたんに回ってこなくなるはで、さあ大変。
0168デフォルトの名無しさんNGNG
>>161
スレッドはアクションゲームには向かないし初心者には同期とるのもね。デッドロックかかちゃいそう。
>>140
この答えはいろいろあるとおもいますが
>>60の最後に書いてるけど

// Windowsメッセージを処理します。
Application.DoEvents();

をつけたせばウインドウズのメッセージを処理できるー>無限ループにならない。
僕はWinProcやOnPaintはつかってないねぇ。
0169デフォルトの名無しさんNGNG
>スレッドはアクションゲーム向かないし
あなたがどうしようもないほどの馬鹿だということが分かりました。
0170デフォルトの名無しさんNGNG
>>160
すべてのメッセージがそこを通るんだから描画と処理の同期がおかしくなる
0171デフォルトの名無しさんNGNG
初心者が大勢集まってるもんだから
0172デフォルトの名無しさんNGNG
Device デバイス = new Device(
                 0,
                 DeviceType.Hardware,
                 フォーム,
                 CreateFlags.SoftwareVertexProcessing,
                 パラメータ );
のときに 1つめの引数が0になっていますが0ってどういう意味でしょうか?
C++ヘルプでは
Adapter[in]ディスプレイ アダプタを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイ アダプタである。
とありますが 0はプライマリディスプレイアダプタなんでしょうか?
0173デフォルトの名無しさんNGNG
#define D3DADAPTER_DEFAULT 0
0174172NGNG
D3DADAPTER_DEFAULT=0
defineの数値に対応してるんでつね、
ありがとうございます
にしてもC++のへるぷないとどうにもなりまつぇんね・・
おとなしくC++でヤったほうがよいのかとすら思えてきますた
0175デフォルトの名無しさんNGNG
>>169
自分のこと書いて楽しいですか?
0176デフォルトの名無しさんNGNG
>>169
馬鹿って言い方は失礼だと思うぞ。
単に、ここ最近のWindowsの仕組みを知らずに言い放った愚か者ってだけ。
0177デフォルトの名無しさんNGNG
スレッドを勘違いしている無能者って、VBからC#に移ってきた奴なんだろうなあ。
0178デフォルトの名無しさんNGNG
N88べーしっくから移ってきた漏れよりはマシなんではないでしょうか
0179デフォルトの名無しさんNGNG
>176
ここ最近って何か変わったの?
0180デフォルトの名無しさんNGNG
そもそもVB厨でもなければ、スレッドを使わずにDoEventでぶん回そうなどと、
阿呆なことは考えない。
0181デフォルトの名無しさんNGNG
>>180
おまいの理屈だと
チュートリアル作ったやつも
VB厨って解釈できるが
それについて何かコメントおながいしまつ

もうね、ループすりゃどうだっていいじゃん
偉そうなこと書くなら
おまいらの言う理想のループ処理とやらを書いてくれ
参考にさせてもらうから
0182デフォルトの名無しさんNGNG
>>180殿、さ、どうぞ!

0183デフォルトの名無しさんNGNG
だからスレッド使えよ。
0184デフォルトの名無しさんNGNG
*言うだけなら誰でも*
0185デフォルトの名無しさんNGNG
>>183
おまいの理想とする
スレッド使ったコードを晒してください
話はそれからだ

*言うだけなら誰でも*
0186デフォルトの名無しさんNGNG
関係ない話題は、然るべきスレでかきなよ。
いい加減、うっとおしくなってきた。
0187デフォルトの名無しさんNGNG
C++ではメインループとウインドウメッセージを分けることなど当たり前なのに、
何故C#になるとスレッドを使おうとしないのか不思議で仕方がない。
別にC#特有の問題が存在するわけでもないのに。
0188デフォルトの名無しさんNGNG
>>187
C#ではメインループとウィンドウメッセージを意識せずにコードが
書けるからでは?
0189デフォルトの名無しさんNGNG
>>187
スレッドの場合
たとえば16ms毎にゲーム処理のスレッドを呼び出すとすると、もしスレッドの処理が3msで終わってしまえば
次の呼び出しまでの13msは待ち時間となり無駄になるだろ?

でもメインループなら、マシンの限界まで処理を回ることができる。
お前ってMFCしか使ったこと無いの?
0190デフォルトの名無しさんNGNG
スレッドをループさせれば同じことじゃないの?

あと、アクションゲームの場合は、おそらくイント単位で処理することになるから、
メインループでもスレッドでも、待ち方が違うだけで同期処理は同じになると思われ。
0191デフォルトの名無しさんNGNG
イントってなに?
0192デフォルトの名無しさんNGNG
>>189
待ち時間はSleepなり、正格にやるならマルチメディアタイマーのイベントシグナル(コールバックを使わない方法)等で
処理を休ませることになるが、Win32APIでプログラムを組んだことがないの?
0193デフォルトの名無しさんNGNG
正格→正確
0194デフォルトの名無しさんNGNG
Sleepもマルチメディアタイマーも問題山積なのを隠して語っても仕方ないだろう
とりあえず叩き台になるソース晒せや

*言うだけなら誰でも*
0195デフォルトの名無しさんNGNG
ていうか、そもそもC#自体がWin32APIを直接叩く事を
推奨していない言語仕様だからなぁ。
0196172NGNG
質問でつ チュートリアル2で
頂点バッファ.Lock(0, 0, 0);
といふ頂点をロックする処理がありまつが、

1つめの引数=頂点バッファをロックを開始する位置(バイト単位)
2つめの引数=頂点バッファをロックするサイズ(バイト単位)
でいいのでせうか?
しかも両方のパラメータが0なのでバッファ全体をロックを指定したといふことですよね?

3つめの引数は0になってまつが、
D3DLOCK_DISCARD
D3DLOCK_NO_DIRTY_UPDATE
D3DLOCK_NO_SYSLOCK
D3DLOCK_READONLY
D3DLOCK_NOOVERWRITE
のどれが0だかわからないでつ デファインに対応した数値表とかないんでつかね?
0197デフォルトの名無しさんNGNG
>問題山積なのを
何が問題なのか提示せず反論だけ。

*言うだけなら誰でも*
0198デフォルトの名無しさんNGNG
C#でWin32API使うのは、面倒で非効率です。
素直にMC++と併用するのが無難でしょう。
0199デフォルトの名無しさんNGNG
>>197
マルチメディアタイマーの機種依存、Sleepの精度
Win32APIやったことあるなら知ってるだろ?
そういう話題の振り方して逃げるようなこと書くなや
0200デフォルトの名無しさんNGNG
Sleepに関しては、精度が気になるのであればマルチメディアタイマーと書いている。
マルチメディアタイマーに関しては機種依存といっても、最小間隔の値のが違うだけで、
しかも1msに設定できないのは、そうとう昔のチップセットの話。
3Dを扱うPCスペックのマシンで、最近も問題があるというのなら具体例を挙げて欲しい。
今、機種依存の問題と書くからには、それなりの根拠があった上での話だよね?
0201デフォルトの名無しさんNGNG
         ☆ チン

       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         ヽ ___\(\・∀・)< DirextXのラッパークラスまだー?
            \_/⊂ ⊂  )_ \________
          / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
       |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
       |   愛媛みかん   |

0202デフォルトの名無しさんNGNG
>>196
ここのバカどもには答えられないから他で質問汁
まぁ漏れもそんなバカどもの一人だが
0203デフォルトの名無しさんNGNG
C++側のヘルプを見れば載っているのに、Managedの方しか見ない奴が悪い。
0204デフォルトの名無しさんNGNG
C++イラネ
0205デフォルトの名無しさんNGNG
.Net Frameworkのヘルプを見ても載ってないマイクロソフトが悪い。
0206デフォルトの名無しさんNGNG
スレッド使うとかゆいところに手が届かないというか、
届かなくてもいいとこなら使うって感じなんだが、

ゲーム開発の世界ではふつーに使ってるものなの?
0207202NGNG
>>203
C++のほうも見たが196 の
>どれが0だかわからないでつ デファインに対応した数値表とかないんでつかね?
は俺もわかりませんでつたよ わかる神はいませんか?

>1つめの引数=頂点バッファをロックを開始する位置(バイト単位)
>2つめの引数=頂点バッファをロックするサイズ(バイト単位)
>しかも両方のパラメータが0なのでバッファ全体をロックを指定したといふことですよね?
これはたぶんあってると思う
0208デフォルトの名無しさんNGNG
DirectX SDK 有料にしてでも ちゃんとしたヘルプつけてくださいまし
といいたくなるくらい ManagedのDirectXヘルプはウン○だね・・
0209デフォルトの名無しさんNGNG
#define D3DLOCK_READONLY 0x00000010L
#define D3DLOCK_DISCARD 0x00002000L
#define D3DLOCK_NOOVERWRITE 0x00001000L
#define D3DLOCK_NOSYSLOCK 0x00000800L
#define D3DLOCK_DONOTWAIT 0x00004000L

#define D3DLOCK_NO_DIRTY_UPDATE 0x00008000L

これじゃなくて?
0210デフォルトの名無しさんNGNG
>>208
> DirectX SDK 有料にしてでも ちゃんとしたヘルプつけてくださいまし
DirectX5以前までは英語版のヘルプしかなく、
和訳された辞書みたいな分厚い本が2,3万で売ってた気がするけどな。
0211デフォルトの名無しさんNGNG
フラグを付けなければ、フラグにある効力は一切使用しないだけ。
デフォルトもへったくれもない。
0212デフォルトの名無しさんNGNG
>>210
ああ、あったな。「馬鹿高い本だなぁ。」と驚いた。
なつかしい。
Managed DirectX(C#)用の詳細に書いた本が今でれば、
2,3万でも買うんだけどなぁ。
0213デフォルトの名無しさんNGNG
>>209
それ、どこに載ってた?
0x〜ってことは16進数だよね・・
10進数値が0のやつは1つもないね
0214デフォルトの名無しさんNGNG
>>213
>[in] 実行するロックの種類を記述する、0 個以上のロッキング フラグの組み合わせ。このメソッドに使用できるフラグは次のとおり。

>0 個以上のロ
これじゃねーの

>>209はC++のヘッダファイルより
0215172NGNG
>>214
いつのまにか神が降臨してる〜
つい最近c#はじめた漏れにC++のヘッダファイル云々ってムリポでつよママン
つまり 0を指定してるのでフラグつかってませんってことでつね
ボロHPにまとめておきまつ
0216デフォルトの名無しさんNGNG
あえてC#でやるからには、
C#の特性を存分に使うべきだね。
そうしなければ、C++でやったほうが
情報も多いし、パフォーマンスも優れるし良いと思う。
まあ、あたりまえのことだけど・・・。
0217デフォルトの名無しさんNGNG
>>216
.Net FrameworkにDirextXのラッパークラスが載ってない以上、
C#でDirectXを使うメリットはないと思う…

そう言う意味では>>201や>>205は的を射ている。

つか、WindowsもOfficeみたく、殆どの機能をクラスで扱える
ようになればいいのに。
0218デフォルトの名無しさんNGNG
ビデオカードのテクスチャサイズ制限(256x256までとか、2のべき乗とか)を
プログラムで取得するにはどうしたらいいでしょうか?

RADEON9600で640x480のテクスチャ読み込ませたら問題なく使えてしまったので
もしかしたらsummer版から内部で適当に処理してくれてるのかと思ったのですが
そうでもない気がしてきたので…。

VRAMのテクスチャバッファ残量を動的に取得する方法もあるようでしたら知りたいです。
0219デフォルトの名無しさんNGNG
CAPS?
0220218NGNG
>>219
caps見れば良かったんですね。
あっさり解決しました。ありがとうです。
0221デフォルトの名無しさんNGNG
     C++                 C#
DrawIndexedPrimitiveUP   DrawIndexedPrimitives
DrawIndexedPrimitive     DrawIndexedUserPrimitives
DrawPrimitiveUP        DrawPrimitives
DrawPrimitive          DrawUserPrimitives

これでいいですか?
0222221NGNG
すみません。よく調べたらUP系が逆でした…
0223デフォルトの名無しさんNGNG
>221-222
その無駄な変化はなんなんですか...
0224デフォルトの名無しさんNGNG
D3DX系(Sprite、Matrix)と自前系(Primitive)を比較してみると機種にもよるがフレームレートの差は2〜5倍もある。
糞重いD3DX使ってる奴は艇脳負け組って意味だろw
0225デフォルトの名無しさんNGNG
差はあっても、カード依存という壁をなんとかしてくれるD3DX系の使いよさは、
多くのユーザーを抱える場所では開発コストを抑えられるたまらない恩恵なわけで。
0226デフォルトの名無しさんNGNG
どこの板でも定期的に>>224みたいな馬が涌いてくるね
0227デフォルトの名無しさんNGNG
土日の定期便みたいなもんだ
0228デフォルトの名無しさんNGNG
馬鹿定期便。
0229デフォルトの名無しさんNGNG
>>224
D3DXが無ければXファイルや形状データ、座標を扱うのって難しくないですか?
自前ライブラリを持つメーカーならともかく、一般人ならD3DXに頼らざるを得ないと思う。

初心者の意見ですけど。
0230デフォルトの名無しさんNGNG
速度云々よりは、内部構造を理解しておかないと、
用意されていない機能を実現しようとするときに困ることになる。
実用出来るかどうかは別にしても、Xファイルの読み込みからレンダリングまでは、
ある程度自分で作れるようになっておくに超したことはない。
まあ何を作るかにもよるので、何が必要なのかは各々で判断すればいい。
0231デフォルトの名無しさんNGNG
自作ライブラリ作るのが生きがいですってならともかく
漏れみたいに、ただヌルい3Dゲを作りたいって人は
レンダリングまで自分でやりたいなんて到底思わないかと
0232172NGNG
Microsoft.DirectX.Direct3D.Pool.の
Default
Managed
Scratch
SystemMemory
の違いがイマイチよくわからんでつ よくわからない場合はとりあえずDefaultを選べってことでつか?
0233デフォルトの名無しさんNGNG
今後
C#が、C++での実装に
パフォーマンスで追いつくことは不可能かな?
0234デフォルトの名無しさんNGNG
GDI+が異常に遅かったのは自分でチャックしたんだけど、トータルでも結構遅いの?
0235デフォルトの名無しさんNGNG
>>233
ノートPCの性能がデスクトップに追いつくの?
ってのと同等の質問に見えた漏れは夢がないんでしょうか・・?
0236デフォルトの名無しさんNGNG
C#やJavaに日頃慣れていると、
C++の開発が非効率に思えてね。
0237デフォルトの名無しさんNGNG
>>234
俺も偏った部分しかチャックしてないが、あんま速くなかったよ。
でもま、あれは簡単に扱えるって意味でのライブラリだから、あんなもんでいいと思うよ。

チャック?
0238デフォルトの名無しさんNGNG
GDI+はDIBでゴリゴリやってるのと同じだし、
別にDirect3D使ってるわけじゃないし、
遅いのはC#のせいじゃないだろ。
0239デフォルトの名無しさんNGNG
じゃあ、C#+DirectXで
パフォーマンスは追いつくわけだ。
0240デフォルトの名無しさんNGNG
         ☆ チン

       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         ヽ ___\(\・∀・)< DirextXのラッパークラスまだー?
            \_/⊂ ⊂  )_ \________
          / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
       |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
       |   愛媛みかん   |
0241デフォルトの名無しさんNGNG
完全にスレ違いけど、GDI+ ってα値付きで絵が描けるんで DirectX のテクスチャに
絵を書くときとても便利だよね。線とかパスのスミージングも出来るし。
0242デフォルトの名無しさんNGNG
 ↑
スミージング・・・何語だよ
0243デフォルトの名無しさんNGNG
誰か>>232に答えられる神はいないのか?
0244デフォルトの名無しさんNGNG
用途によって異なるとしか言いようがない。
ヘルプを読めば分かるだろ。
0245デフォルトの名無しさんNGNG
ヘルプ読んでもわからない馬鹿がここにいますが何か?
ヘルプ読めばわかるって言うならこんなスレいらないよね
0246デフォルトの名無しさんNGNG
ヘルプは粗末すぎだよな。
メソッドやフィールド名で推測するしかないし。
高くてもいいから、分厚い本でもだしてくれ。
0247デフォルトの名無しさんNGNG
C++のヘルプも読め、そっちにきっちり書いてあるから。
0248デフォルトの名無しさんNGNG
どこがわからないとか言わないと回答のしようもないよ
まさか専門用語がわからないなどとググりもせずホザイテマスカ?
0249デフォルトの名無しさんNGNG
>>247のとおり、C++側に大抵書いてある。
若干名前が変わってるが手順などほとんど同じだし。
0250デフォルトの名無しさんNGNG
>>246
「高くてもいいから、分厚い本でもだしてくれ」

マニュアル登場

「もっとわかりやすい本だしてくれ」

分かりやすいマニュアル本登場

「なんかマンドクセー!」
0251デフォルトの名無しさんNGNG
C++でDirectX慣れていれば、
C#でもすらすらと開発できそうなんだけどなぁ。
0252デフォルトの名無しさんNGNG
>>251
「初心者」っていうのは、C# にも DirectX にも、ドキュメント読むことにも、考えることにも、
推測することにも、質問することにも、調べることにも初心者なんですよ。

どれか一つでもうまく出来るようなら、他のことも大抵できるようになって、もう初心者じゃ
なくなるから。
0253デフォルトの名無しさんNGNG
C++のドキュメント読まないといけないなんてC#は糞ですね?
0254デフォルトの名無しさんNGNG
>>252
それは人間の初心者。
今までの人生で成長が存在しないとは、いったい何をしていたんだか。
0255デフォルトの名無しさんNGNG
単純にドキュメントだけにフォーカスをあてるなら253の言う通りC#&Xはクソですな
0256デフォルトの名無しさんNGNG
C++も2003summerの日本語ドキュメントないよ
0257デフォルトの名無しさんNGNG
>>253
いや、マイクロソフトがヽ('A`)ノウンコー
0258デフォルトの名無しさんNGNG
RHW=同次空間上のトランスフォームした頂点。(x,y,z) データは既に w で除算 (w の逆数を乗算) されている。

結局んとこ、この値を設定すると何がどうなるのかよくわかりませぬ
まったく指定しなくてもチュートリアルは普通に動くみたいだし
0259デフォルトの名無しさんNGNG
テクスチャマッピングの補正につかうんだったかなー
0260デフォルトの名無しさんNGNG
くだらん論議してるときは盛り上がるのに
質問でるととたんに静かになるんやね
>>258はそのくらい自分で調べろとか言われちゃうんだろうね
0261デフォルトの名無しさんNGNG
>>259
ためしにテクスチャ張って数値をいろいろ弄ってみたらワカッターよ
テクスチャを張ってから数値変更すると設定した数値ぶん、テクスチャが歪むのね
■ このスレッドは過去ログ倉庫に格納されています