トップページ⇒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
0682デフォルトの名無しさんNGNG
>>680

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/DirectX9_c/directx/graphics/programmingguide/fixedfunction/transforms/transforms.asp
これでも読めれ。

多分、同次座標系が解らんと意味がわからんと思うので解説。

3DCG用途では透視変換や平行移動を4行4列の行列で扱える
ようにするため同次座標系というのをつかう。同次座標系では通常の
3次元ベクトル(x,y,z)に等質wを加えた(x,y,z,w)で表現される。

通常の3次元ベクトル(これをユークリッド座標系という)と
同次座標系との相互変換は以下のとおり。

・3次元ユークリッド座標系でx,y,z)で表されるベクトルを同次座標系(x',y',z',w')に変換
w=1とし、x,y,zはそのままつかう。(x',y',z',w')=(x,y,z,1)となる。

・同次座標系(x,y,z,w)を3次元ユークリッド座標系(x',y',z')で表されるベクトルに変換
同次座標系の各成分をwで割る。(x',y',z')=(x/w,y/w,z/w)となる。

以上から例を挙げれば同次座標系(x,y,z,w)と(2x,2y,2z,2w)は3次元ユークリッド
座標系上では同一のベクトルとなる。

ビュー行列と射影行列はネットでも検索して勉強してくれ。

昔(DirectX5とか6とかの時代)はSDKの解説はもうちょっと詳しかったし
もっぱら話題の中心がこんなことばっかりだったからもっと解説している
サイトが多かった(宇治社中とかが親切だった)けど、今はあまりこんなの
だれも解説しないからな。初心者には厳しいかも。もし手に入るようだったら
昔のDirectXのSDKのリファレンスでも読んでくれ。
0683682NGNG
続き

書籍で情報を得るなら以下の2冊がいいと思ったけど初心者には
必要なところを抜き出して読むのが難しいかもしれない。

・コンピュータグラフィックス 理論と実践
http://www.amazon.co.jp/exec/obidos/ASIN/4939007375/qid%3D1096460418/249-2167903-6130707

・ゲームプログラミングのための3Dグラフィックス数学
http://www.amazon.co.jp/exec/obidos/ASIN/4274064050/qid%3D1096460363/249-2167903-6130707

たしかどちらかといえば「ゲームプログラミングのための3Dグラフィックス数学」
のほうが数学としてはわかりやすくまとまっていたように記憶している。
(手元に本がないし長らく読んでいないので詳細がわからない)
0684デフォルトの名無しさんNGNG
>>676
Vector3.Projectつかえばいい
ここにサンプルあるから
ttp://www.interq.or.jp/black/minami-m/
C++だけどね。まあわかるよ。
0685デフォルトの名無しさんNGNG
>>678
start.wavなのに始められない、ってなんか笑えるな。w
いや笑っちゃいけないのかもしれないけれど…
0686デフォルトの名無しさんNGNG
>>678
俺はYouTooFoolExceptionが発生して半分あきらめてる
0687デフォルトの名無しさんNGNG
>>686
俺に対してTooFoolってこと?

それにしても短い音は駄目っぽ…
音の後半を無音にすれば行けるがスッキリしないな
あとDuplicateに対応するのってManagedだとCloneなんだろか。
0688デフォルトの名無しさんNGNG
YouAreFoolTooException
0689デフォルトの名無しさんNGNG


ハンドルされていない例外 ThreadAbonedException が発生したため、このスレは
0690デフォルトの名無しさんNGNG
すれぽ
0691デフォルトの名無しさんNGNG
やっぱその表現で行くのなら
YouIsBigFoolManException
だろw
0692デフォルトの名無しさんNGNG
you is って聞いたことありません>>691は何語をしゃべっているのか教えてくださいおながいします。
0693デフォルトの名無しさんNGNG
"you is big fool man"でググれ
有名なネタだ
0694在日外国人参政権反対NGNG
ググラずに聞くが北米院?
0695デフォルトの名無しさんNGNG
書き込み少ないけど、常駐率が変に高いスレだな。
0696デフォルトの名無しさんNGNG
>>682 683
アリガトン ・ゲームプログラミングのための3Dグラフィックス数学 は手にとってみたけど
公式ばっかりならんでてウザかったんで挫折してしまいますた

>>684
ミラクル トンクス。
やっぱり便利なメソがあったんでつね
自分で計算しろとかいうウザイやつばかりだったんで感激でつ
0697デフォルトの名無しさんNGNG
>>696
ウザイウザイ言う君が一番ウザイ。
0698デフォルトの名無しさんNGNG
初心者すれで揚げ足とって楽しんでる奴もう(ry
0699デフォルトの名無しさんNGNG
音楽関係の質問ですが、
AudioVideoPlaybackを使ってMP3を複数同時に再生するにはどうしたらいいのですか?
最終的には2つ以上の音が合成されて出力させたいのです。
0700デフォルトの名無しさんNGNG
new Audio("1.mp3").Play();
new Audio("2.mp3").Play();

じゃだめなのん?いや全然試してないんだけどね。
0701デフォルトの名無しさんNGNG
それ以前にMP3じゃなくてOggを使おうぜと言ってみるてすつ
0702デフォルトの名無しさんNGNG
それ以前に
new Vorbis.OggAudio("1.ogg").Play();
でいいような気が。
0703デフォルトの名無しさんNGNG
今Managed C++でOggのSDKからSystem.IO.Streamへのプロキシを書き終えた。
WAVEファイルに見せかければSecondaryBufferにStream食わせて簡単に再生できるからねぇ。
だけど実際はストリーミングしないでワンショットとして扱うらしく、長いファイルの演奏に向いてなさげ。
結局ストリーム再生しようとしたら今まで通りその辺を自力で書かないと駄目かもなあ。
0704デフォルトの名無しさんNGNG
900 -> 1901 -> 2902 -> ?

いや規則は分かるが、なんでこんな変な付け方なんだ?
だれか解説きぼん
0705デフォルトの名無しさんNGNG
http://www.microsoft.com/downloads/details.aspx?familyid=B7BC31FA-2DF1-44FD-95A4-C2555446AED4&displaylang=en
DirectX 9.0 SDK Update - (October 2004)
リリースsage。
0706デフォルトの名無しさんNGNG
日本語版まだぁ〜
0707デフォルトの名無しさんNGNG
>>706
一生待ってろ
0708デフォルトの名無しさんNGNG
しもたー さっき2004summer入れたのに・・orz
0709デフォルトの名無しさんNGNG
>>708
気分は夏でも暦は10月なんだなこれが
0710デフォルトの名無しさんNGNG
>>708
つーか、October入れるのにSummerをアンインストールする必要はない、
というかアンインストール「してはいけない」。

だから君は正しい手順を踏んでるよ。

0711デフォルトの名無しさんNGNG
>>704
今回のOctoberでは変化ないな。
変な上がり方はともかく、内容が変わったのに数字に変化ないのはどーかと思うが。
0712デフォルトの名無しさんNGNG
http://www.microsoft.com/downloads/details.aspx?FamilyId=143EF8C6-CFF7-4AF0-8209-1CDF49C58BC0&displaylang=en
再配布パッケージのリンクなんだが、サポートOSにFreeBSD入ってるのはどう思う?
0713デフォルトの名無しさんNGNG
FreeBSD対応は、DirectXの前にウインドウフレームワークの実装の方が先だと思うが。
0714デフォルトの名無しさんNGNG
October = 9.02.3900・・・?
0715デフォルトの名無しさんNGNG
VS.NET2003でやってみたいんですが、やっぱりDirectX SDKが必要なんでしょうか?
200MB超えてるんですが orz
0716デフォルトの名無しさんNGNG
最近はわからんが、雑誌の付録についてたりしないか?
0717デフォルトの名無しさんNGNG
サンプルとかヘルプとか要らないなら再配布パッケージだけでも開発できるが、
やっぱりSDKがあった方がいい。
0718デフォルトの名無しさんNGNG
200MBぐらいテレホで4日あれば落とせるよ
テレホ終了で自動的にモデムが切れるソフト使えば余裕
0719デフォルトの名無しさんNGNG
http://www.microsoft.com/downloads/details.aspx?FamilyId=143EF8C6-CFF7-4AF0-8209-1CDF49C58BC0&displaylang=en
ってSDKでつか?
それともマネージドコードDirectXもインスコされるランタイムでつか?
0720デフォルトの名無しさんNGNG
>>719
ランタイム
0721デフォルトの名無しさんNGNG
トンクス 今までマネージドコードDirectX別にインスコさせてカッタルかったんで助かりまつ
0722デフォルトの名無しさんNGNG
>>721
そういう事見たいやね。

うちの翻訳ソフトの出力:

このダウンロードは、開発者が含むことができる再分配可能なDirectX 9.0cエンド・ユーザーに
彼らの製品を与えます。
この更新は、DirectX 9.0 SDKアップデート(2004年10月)から管理されたコードのための
DirectXアップデートを含みます。

管理されたコードのためのDirectX == Managed DirectX
0723デフォルトの名無しさんNGNG
普通にWindowsUpdateで入るDirectX9.0cだとManaged DirectXで作られたアプリは動かないってこと?
0724デフォルトの名無しさんNGNG
マネージドだいれくとセックルを別にインスコすれば動く
だけどそれがメンドイ

ところで 
DirectX 9.0c Redistributable for Software Developers - Multilingual - 日本語
with updated DirectX for Managed Code (October 2004)
って フレームワーク以外何も入ってない環境でも コレ一つでおK?
0725デフォルトの名無しさんNGNG
DirectXで全画面表示にして最小化されたりとかして
元に戻してもおかしくならない方法って結構複雑にならない?
もっと簡単に出来ないのかな。
0726デフォルトの名無しさんNGNG
最大化できないようにウインドウサイズを固定するんじゃダメなのか?
0727デフォルトの名無しさんNGNG
>>726
いや、通常は全画面(画面の解像度とか変えたりするほう)で表示してるけど、
Alt+Tabキーとか押されたら最小化されちゃうから
そのときに描画処理やらないようにするための処理が結構面倒で
何とかならんもんなのかなぁと。
0728725NGNG
スマソ。
今書いてみたらあんまり面倒じゃなかった。
0729デフォルトの名無しさんNGNG
全画面モードにするとデバッグ中に開発環境が「小さくなる」のは痒い。
0730デフォルトの名無しさんNGNG
聞いて解決したんなら、自己解決でも
何をしたか書こうな。
0731デフォルトの名無しさんNGNG
>>730
面倒だと思ったことをやってみたけど
実際は面倒じゃなかったってだけのことだったんで
書かなくてもいいかなと思ったんだけど書いとくか。

bool deviceLost = false;をどっかに置いといて
レンダリングメソッドにて

public void Render()
{
    if ((deviceLost) || (Form.ActiveForm != this))
    {
        System.Threading.Thread.Sleep(100);
    }

続く
0732デフォルトの名無しさんNGNG
    if (deviceLost)
    {
        try
        {
            device.TestCooperativeLevel();
        }
        catch (DeviceLostException)
        {
            return;
        }
        catch (DeviceNotResetException)
        {
            device.Reset(device.PresentationParameters);
            OnDeviceResizing(device, new CancelEventArgs());
        }
        deviceLost = false;
    }

    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, options.Background, 1.0f, 0);

    //ここで描画処理

    try
    {
        device.Present();
    }
    catch (DeviceLostException)
    {
        deviceLost = true;
    }
}
0733デフォルトの名無しさんNGNG
Direct3DのSpriteってDirectDrawでDrawするのとは根本的に違うのでしょうか?
それともDirectDrawをDirect3Dから使えるようにしたものでつか?
0734デフォルトの名無しさんNGNG
Direct3DのSpriteはポリゴンにテクスチャを貼り付けたものをバックバッファへ書く。
DirectDrawのDrawはオフスクリーンサーフェスからバックバッファへ転送する。

まあDirect3Dのほうはポリゴンだから変形が楽だとか
演算やシェーダを使ってエフェクトをかけたりすることもできるというあたりかなり高機能
0735デフォルトの名無しさんNGNG
Sprite.Drawのcenterパラメータってなんか意味あるの?
回転するパラメータもないのに。
0736デフォルトの名無しさんNGNG
>Sprite.Drawのcenterパラメータってなんか意味あるの?
何を言ってるんですか意味ありまくりですよあなた

>回転するパラメータもないのに。
Draw2DやRotationZで回転するときの中心補正点になるんだよ

使わないなら Vector3(0,0,0)でも指定しとき
0737デフォルトの名無しさんNGNG
>>736
ありがとうございました
0738デフォルトの名無しさんNGNG
ところでスプライトって
RotationXやRotationYは使える?
漏れのダメポPCだとRotationZしかつかえない
ほかは表示がヘンチクリンだ
0739デフォルトの名無しさんNGNG
>>738
こっちでも表示がヘンチクリンだ。
0740デフォルトの名無しさんNGNG
ちょっと教えて下さい。
Vector3とMatrixの積を返すメソッド。
ヘルプで探したのですが見つからなかったので…。
0741デフォルトの名無しさんNGNG
メソッドでやってもいいんだが
掛けるだけじゃ出来なかった?
Vector3 v = 〜〜〜〜;
Matrix matrix = 〜〜〜〜〜〜;
v = v*matrix;
0742たけしNGNG
DirectX 9.0 SDK Update (October 2004)になって、Spriteの扱い方がかわって、スプライトの2D描画がうまくいきません。

まずsprite.Begin(SpriteFlags.None);とsprite.End();が必要になったのはわかりました。

ですが、Draw関数を以下のように、体力の黄色と赤のゲージを描画するコードだと、1本で体力を表したいのに、上下に2つ画像が描画されます。
sprite.Draw(
barTEX,
new Rectangle(0,0,(hero.energy>0)?hero.energy:0,16),
new Vector3(0,0,0),
new Vector3(10,10,0),
Color.White);
sprite.Draw(
barTEX,
new Rectangle((hero.energy>0)?hero.energy:0,16,300,32),
new Vector3(0,0,0),
new Vector3(10+hero.energy,10,0),
Color.White);

Draw2Dは、
public void Draw2D(Texture, Point, float, Point, Color);
だけうまく描画されましたが、他は描画さえされません。

以前のバージョンのコードを、ちょっと変更してプログラミングしただけなので、それがまずいのかもしれませんが、どうやればうまくスプライトのDrawとDraw2Dを描画できるでしょうか?
0743デフォルトの名無しさんNGNG
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=17601
0744デフォルトの名無しさんNGNG
Microsoft.Samples.DirectX.UtilityToolkitってなんどすか?
0745デフォルトの名無しさんNGNG
>>744
プロジェクト開いて検索汁
0746デフォルトの名無しさんNGNG
>Spriteの扱い方がかわって、スプライトの2D描画がうまくいきません。
以前のバージョンではちゃんと表示されてたのか?
0747たけしNGNG
SDK2003のSprite.DrawではRectangleが(左,上,右,下)だったのが、SDK2004では(左,上,幅,高さ)に変わったようです。
これでうまくいきました。
0748デフォルトの名無しさんNGNG
よし!がんばれ たけし!!
0749デフォルトの名無しさんNGNG
次はDecember2004である、に一票。
0750デフォルトの名無しさんNGNG
しかもまたスプライトの仕様が変わるに一票
0751デフォルトの名無しさんNGNG
と思ったらフェイントでOctober-II 2004 緊急リリース!、に一票。
0752デフォルトの名無しさんNGNG
かったるいから
しばらくの間
2004夏で我慢することにした
いちいち仕様カエルナヨ・・MSさんよぉ
0753デフォルトの名無しさんNGNG
>>752
別にそれで構わんが、2004夏でManagedなら
TextureLoader.FromFileには気をつけろよ。
このせいで2004十月が出たようなもんだから。
0754デフォルトの名無しさんNGNG
>>753
Managedで2004夏使ってなおかつTextureLoader.FromFileを使ってるんだが
何がどうまずいの?
0755デフォルトの名無しさんNGNG
>>754
使ってて気づかないの?もしかしてエラー出力もチェックしたことないとか?

せっかくキーワードがそのまま書かれてるんだからちょっとは調べろよ。
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=14982
0756デフォルトの名無しさんNGNG
C#でDirectXの入門サイトでお勧めのところを教えてください。もしくは書籍。

やりたいのは2Dの処理です。パズルゲームとかトランプゲームみたいなのを作りたいと思ってます。
(わざわざDirectXでやるな、といわれそうですが・・・)

いろいろ探してみたんですが、C++で解説してたり、3Dを扱ってたりでお手上げです。
いちおうあげておきます
0757デフォルトの名無しさんNGNG
そうやって他人が何とかしてくれるだろうと甘い考えを持った末路は、



グビチョン
0758デフォルトの名無しさんNGNG
ヘルプとサンプルでどうにかなるんでない?
やりたいことが2Dでも、3Dは勉強しなきゃならんと思う。
DXSDK\Samples\Managed\Direct3D\Tutorialsにあるサンプルを1から6までやるべし。
0759デフォルトの名無しさんNGNG
>>758
うむむ、なかなか読み応えありますね
DirectXで2Dをやろうとすると、DirectDrawよりもDirect3D.Spriteを使ったほうが良い場合が多いそうですね(理由はわかりませんが)
とりあえず3Dに挑戦してみます。どうもでした
0760デフォルトの名無しさんNGNG
仕様変更で面倒ばかり起こすSprite系には何のメリットもない。
普通に頂点を作ってテクスチャを張るべし。
0761デフォルトの名無しさんNGNG
>>760
ほほぅ
肝に免じておきます
0762デフォルトの名無しさんNGNG
DirectDrawとDirect3Dでは難しさが・・・
0763デフォルトの名無しさんNGNG
2Dの場合、Direct3DはDirectDrawより少し遅い
2004Summerでまたスプライト関数の引数が変更したらしいな
0764デフォルトの名無しさんNGNG
GDI+とどっちが早いですか?
0765デフォルトの名無しさんNGNG
GUI+使うなら DirectDrawをオススメします

3DSpriteは仕様変更がウンザリなのと
ちょっと古いPCやドライバの更新もできないような
ヘタレ君の環境だとマトモに表示されないケースが多いのがマズー
0766デフォルトの名無しさんNGNG
>>765
GUI+なる謎の物体を突然持ち出す君の方がマズー

君ってチンカス以下だね
0767デフォルトの名無しさんNGNG
>766
つまんね


C#にもC++並のサンプルつけてくれMS
VBに至ってはサンプルナッシングかよ
かわいそうに
0768デフォルトの名無しさんNGNG
>>767
オマエモナー
0769デフォルトの名無しさんNGNG
ぶっちゃけVBいらね
0770デフォルトの名無しさんNGNG
ぶっちゃけC#いらね
0771デフォルトの名無しさんNGNG
わざわざ無理にC#でやろうとしなくていいよ。
C++とかのほうが情報多いんだし。
0772デフォルトの名無しさんNGNG
でも、未開拓の言語って触るの面白いんだよ。
……これが仕事でなければ。
0773デフォルトの名無しさんNGNG
枯れた言語は掲示板のレスもツマンネ奴ばっかりだしな
0774デフォルトの名無しさんNGNG
つまりC#も枯れた言語というわけか。
0775デフォルトの名無しさんNGNG
C#のことは気にせず、
黒い箱にスパゲティ入れて遊んでな。
0776デフォルトの名無しさんNGNG
C#でMDX使い始めたらC++でDirectXは使いたくなくなった
0777デフォルトの名無しさんNGNG
>>776
M$の罠にかかった香具師がここにも一人。もうだめぽ。
0778デフォルトの名無しさんNGNG
>776
そんなに楽?すぴーどなどもよろ。
0779デフォルトの名無しさんNGNG
楽そうとかいう理由で使うやつは初心者。
C++のほうがパフォーマンスいいんだから、
そっちで無難にやっておけよと。
0780 ◆Rk6dvtD5gI NGNG
自分ではパフォーマンスの測定もろくにせず
一般的な文言を鵜呑みにして他人をも洗脳しようとする>>779の方がよっぽどクズ。


いろんな系統のプログラムで測定してみたが、
俺の環境ではManagedによるパフォーマンス低下は大体0〜15%。

当たり前のことだが、GPUよりCPUを酷使するプログラムでは
パフォーマンスはネイティブに比べ大きく低下する。
逆にパフォーマンスがほぼGPUでの処理のみに依存しているようなプログラムでは、
体感的にはもちろん、数値的な差もほとんど確認できない。

ただし、MDXが提供するクラスの中には、単なる状態取得プロパティ・メソッドに見せかけて、
実は呼ばれる度にオブジェクトを新規に確保→コピーを繰り返すという、なんとも迷惑なのがかなり多くある。
また最近のバージョンでは減ってきたとはいえ、>>755みたいなバグが未だ潜んでいる可能性は大いにある。

Managedでパフォーマンスを重視するなら、ネイティブでの開発経験はもちろん、
Managedメソッドとそれに対応するネイティブメソッドとの関係を詳細に把握しておくことが必要。

逆にManagedで開発するメリットとしては、やはり圧倒的な開発効率がある。
.NET Frameworkが提供する豊富なライブラリを利用できる上、
対象の説明まで表示してくれるインテリセンスなどIDEのサポートも非常に便利。
上では欠点ばかり書いてしまったが、
MDXのクラスはManagedの流儀に併せてきれいに再構成されているし、
ほとんどのクラスがMarshalByRefObjectから派生しておりAOP的なプログラミングも可能。


何にでも言える事だが、そのデメリットを充分に理解しているのなら、
そのメリットを生かすためにそれを使うことには躊躇しなくてもよい。

俺はもちろんネイティブDirectXも使うし、Managed DirectXもありがたく使わせてもらっている。
0781デフォルトの名無しさんNGNG
コピペ乙
0782デフォルトの名無しさんNGNG
>>772
>でも、未開拓の言語って触るの面白いんだよ。
ここは同意出来るが、C#が未開拓かと言えばそうでもない。
いつものように既存のものを名前変えただけだろ。

■ このスレッドは過去ログ倉庫に格納されています