トップページ⇒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
0660デフォルトの名無しさんNGNG
DirectXの国産書籍はろくなのがないね・・ 実際
0661デフォルトの名無しさんNGNG
>>659
その本、和訳版でてるよね。
ゲームプログラミングのための3Dグラフィックス数学
ってやつ。
ある程度数学わかってないと、初心者には難しい。
0662デフォルトの名無しさんNGNG
>>660
だよね。本屋でDirectXのコーナーを見てると鬱になる。

「俺がもっとましなヤツ書いてやるぜーっ!」って思う。
0663デフォルトの名無しさんNGNG
>>659
確かに、その人の本はどれもおすすめできないね。

特にこの本の第一章は、読んでると腹の底からモーレツにムカついてくる。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4875934998
0664デフォルトの名無しさんNGNG
>>661
和訳版は一応でているが、
値段がべらぼうに高いのに、それに見合うだけの内容が全然ない。
紙面のマージンをべらぼうに取りすぎ。
0665デフォルトの名無しさんNGNG
主にアルゴリズム関連を知りたいのですが、
洋書のおすすめの書籍って何かありますかね?
Game Programming Gemシリーズが有名みたいですが。
0666デフォルトの名無しさんNGNG
gemsは別にアルゴリズムの本ではない。

純粋にアルゴリズムについて調べたければ、ゲームの枠に虎割れてはいけない。
数学とかソフトウェア工学とか、学会の論文を当たってみても、
金を斯けずともおいしいものはゴロゴロと転がっている。

0667デフォルトの名無しさんNGNG
Zバッファが上手く機能しません。

レンダ毎に
Device.RenderState.ZBufferEnable=true;
としてやっているのですが、
後から描画したオブジェクトがZ-Bufferを無視して
前面に描画されてしまいます。

考えられる問題点としてどのようなことが挙げられるのでしょうか。
宜しくお願いします。
0668デフォルトの名無しさんNGNG
マトリクス使ってないに100セペタ
0669デフォルトの名無しさんNGNG
べつに毎回ZBufferEnableを設定せんでも・・・・・・。

Device.Clear()でZBufferをクリアしてない。ってのは?
0670デフォルトの名無しさんNGNG
DirectXだと思ったら実はDirectorだったに32767ポリゴン。
0671667NGNG
667ですが未だ上手くいきません。

>668
マトリクスと使っていないというのは、
具体的にどういう状況を指しているのでしょうか。

>669
レンダ毎に
Device.Clear(ClearFlags.Target|ClearFlags.ZBuffer, Color.DarkBlue, 1, 0);
とやっております。引数に何らかの問題点が…?

>670
ポリゴン数が多すぎるのも原因になるのでしょうか。
およそ、400,000ポリゴン使っております。
0672デフォルトの名無しさんNGNG
>>671
その設定だったら問題なさそうなんだが

そいうときはもっと簡単な手法で確認すれ
例えばチュートリアルの三角形やら虎メッシュを2つ表示してみるとか

それでOKなら おまいさんのコードかグラボのどっちかがダメってことで
0673667NGNG
原因が分かりました。

Device.Transform.Projection
に設定するMatrix
Matrix.PerspectiveFovLH(fieldOfViewY, aspectRatio, znearPlane, zfarPlane)
の第3引数であるznearPlaneの値に問題があったようです。

問題解決以前はznearPlaneの値を0に設定していました。
この値を適度な正の数値に変更をしたら、
とりあえず見た目の問題は解決しました。
但し、この数値が小さいと、
局所的にZバッファが無視されるという現象が発生しました。

改めてこのあたりの数学的な意味を勉強し直す必要があるようです。

ご指示を頂きありがとうございました。
0674デフォルトの名無しさんNGNG
>>667
なるほど、プロジェクション変換で間違ってたんですね。
解決して良かった、良かった。

プロジェクション・マトリックスはワールド座標系を同次座標系に
変換するマトリックスです。
0675デフォルトの名無しさんNGNG
>プロジェクション・マトリックスはワールド座標系を同次座標系に
>変換するマトリックスです。

なに言ってんのあんた。
「ワールド座標系」と「同次座標系」は言葉のカテゴリが全然違うでしょ。

プロジェクション行列は、ビュー座標からプロジェクション座標への変換。
DirectXでは、どっちの座標も同次座標で表される。
0676デフォルトの名無しさんNGNG
ワールド座標XYZからスクリーン座標XYを知るにはどう計算すればいいんですか?
0677デフォルトの名無しさんNGNG
>>676
ワールド座標をベクトル(x,y,z,1)とするとこれに(ビュー行列x射影行列)
を掛けて求まったベクトル(x',y',z',w')の各成分をw'で割ると
スクリーン座標が求まる。っつーかこれがわかってないと
3Dプログラミングができないと思うんだけどどうしてんの?
0678デフォルトの名無しさんNGNG
Managed DirectXのDirectSoundってうんこ?
c:\Windows\media\start.wavで再生の練習しようとしたんだけど、
うまくいかなくてどーにもこうにもおかしいと思ったんです。
自分のコードが駄目かもと思ったがサンプルのbinにあるcsPlaySoundでも再生不可能。
ほかのファイルなら自分のもcsPlaySoundもOK。

調べていくとBufferTooSmallExceptionってのが発生してるらしい。
ということは極度に小さい長さのファイルは再生できないってこと???
そんなあほな…。C++じゃこんなことなかったのに。
というわけで折角C#に移行しようとしたのにいきなり出鼻を挫かれたという感じ。
0679デフォルトの名無しさんNGNG
ものすごくアホな質問ですいませんがDirectX9cをダウンロードできませんorz
セットアップ中の承諾したあとにコンポーネントをダウンロードしますってところから
進みません

漏れには何が何だかわからないんです(´・ω・`)
どうしたらいいのですか。・゚・(ノД`)・゚・。
0680デフォルトの名無しさんNGNG
>677
視点固定でマウスで操作しないタイプならなんとかなるポ
その説明でも分からない漏れは死んできまつ

0681デフォルトの名無しさんNGNG
誰か677の言ってることを日本語に翻訳してください
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に挑戦してみます。どうもでした
■ このスレッドは過去ログ倉庫に格納されています