トップページgamedev
152コメント55KB

SlimDXについて語ろうぜ

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2010/01/31(日) 10:41:21ID:uYVfFOYk
公式
http://slimdx.org/

日本語の解説
http://mainori-se.sakura.ne.jp/slimdxwiki/

SlimDX は、.NET Framework に対応した言語(C#、VB.NET など)を使って
DirectX アプリケーションを開発することができるオープンソースのライブラリ(DLL)です。
0031名前は開発中のものです。2010/03/21(日) 20:18:08ID:CzRwkR6A
>>27
SlimDXの再頒布パッケージは完全なDirectX再頒布パッケージを
収録してない嘘パッケージであることに注意。
インスコ直後のXPにこれ入れてもゲームは動かんぞ。

28の言うようにサンプルはC++で書かれているからそれを逐一C#に移植していくことになる。
0032名前は開発中のものです。2010/03/21(日) 20:21:40ID:CzRwkR6A
>>30
Direct3DでレンダリングかけてるというWPFとSlimDXの組み合わせは一番面白そうだよな。
0033名前は開発中のものです。2010/03/21(日) 20:57:09ID:BNf6aD+I
実際には組み合わせられないのが残念
別々に動かしてサーフェス転送してるだけ
コントロールのウィンドウハンドル取れるWinFormsの方がまだ親和性は高い
0034名前は開発中のものです。2010/05/14(金) 15:50:38ID:Agn9QNYG
0035名前は開発中のものです。2010/10/09(土) 21:42:28ID:nr26u1G7
0036名前は開発中のものです。2010/10/23(土) 17:36:44ID:dH4nrlFp
SlimDXでDirectX初めてやってるんだけどいいねコレ。
今はHLSLでシェーダを触り始めた辺り。
しかし、2Dゲーの為に苦労してるなぁ〜…って思うw

GPU! GPU! GPU!
0037名前は開発中のものです。2010/10/23(土) 17:41:32ID:dH4nrlFp
俺が使いたいのはピクセルシェーダなんだよぅ、おぅ
0038名前は開発中のものです。2010/10/23(土) 19:02:57ID:NYvWtI7E
2005は対象外かよー
0039名前は開発中のものです。2010/10/23(土) 21:01:27ID:dH4nrlFp
ソースのコンパイルの話っすか
0040名前は開発中のものです。2010/10/24(日) 14:49:27ID:41k51lwY
頂点変換済みの板ポリをウィンドウのクライアント領域に描画して、
それをHLSLで弄るスケルトンがようやく完成したぜ… in D3D9

今度はピクセルシェーダでテスクチャにモザイクかけてみるよ(よ!)

GPU! GPU! GPU!
0041名前は開発中のものです。2010/10/24(日) 16:07:26ID:0z3YDA8C
そんなもんC++やXNAのサンプルでいくらでもあるじゃん
だいたいそのまま移植すればいいだけ
0042名前は開発中のものです。2010/10/24(日) 16:39:37ID:41k51lwY
>>41
ちょうどXNAのを拾って読んでる所w
理屈で考えたら移植で動く筈なんですよね

勉強がてら中身の理解も進めます
0043名前は開発中のものです。2010/10/24(日) 16:49:12ID:0z3YDA8C
2次元エフェクトならWindows Presentation Foundation Pixel Shader Effects Libraryがお勧め
一通りまとまっててWPF使わなくても参考になる
0044名前は開発中のものです。2010/10/24(日) 17:13:50ID:41k51lwY
>>43 thx!
まさにそれ落として読んでましたw
サンプル動画も見たんですが、どう考えても宝の山ですww

ただHLSLの基本がまだまだなので理解力がヤバイですorz
ティーカップの人の本を買って熟読するしかないですね。

P.S.
SlimDXの2DゲームエンジンってGorgonってのしかなさそうですね。
まぁ、自分用の作るから別にいいんですが、参考にしてみようかと。
SDL.netのスプライト周りが面白かったんで、その変も参考にしたいですね。

つーかGorgonはWin7(x64)だと何故かインストールで弾かれるw
.Net3.5は最初から入ってる筈なのにインストーラーが馬鹿なのかな?
だからあれほどzipでくれと言ってるのに。
0045名前は開発中のものです。2010/11/13(土) 09:04:43ID:snFVsDxl
TextLayoyt:SetDrawingEffect()に渡すIClientDrawingEffectの実装の仕方がさっぱりわからん
C#での実装の仕方を教えてほしい
0046名前は開発中のものです。2010/11/13(土) 12:26:45ID:qup/FXee
DirectWrite使ったことないけど見てみたらComPointerに吹いた
COMのIDWriteTextRendererをC#のCOM相互運用で実装して返せばいいのかな
できなくはないんだろうけど俺には無理というかやりたくない
0047名前は開発中のものです。2010/11/14(日) 13:07:09ID:VAytE0MM
TextLayoutでクラスを実体化させたあとGetDrawingEffect()で取り出せる。(嘘)
0048名前は開発中のものです。2010/12/15(水) 17:22:05ID:W0ff0zj1
visualstudio2010でslimdxsamplesのSimpleModel10をデバッグすると
DXGI_ERROR_UNSUPPORTEDって出て途中で止まるんだけど理由わかりますか?
0049名前は開発中のものです。2010/12/15(水) 17:31:36ID:D5FJhaCt
>>48
ハードウェアがサポートしてないから。

ただ、サポートしてないと言っても色々あって、
プログラムが必要としてない機能をデバイスに要求してて失敗してるだけなら、
それを外すことで他の部分は動かせるようになる。
0050名前は開発中のものです。2010/12/15(水) 21:24:32ID:q2iTm1kx
>>49
やっぱりハードの問題だったか。
ありがとうございます
0051名前は開発中のものです。2010/12/18(土) 01:42:46ID:4XOJBpRQ
SlimDX使ってる人少ないなぁ。
やっぱりC#でDirectX使うのは少数派なんだろうな。
MicrosoftはなぜDirectXサポートを止めたのだろうか。
無理矢理XNAに引きずり込みたかったのだろうけど。
0052名前は開発中のものです。2010/12/18(土) 09:57:31ID:JWorHuxc
DirectX生で使うような人の多くは速度やらGCやらでC#は避けるんだろうなぁ
あとドキュメントもほぼ全てC/C++向けに書かれてるし。
まぁ何だかんだ言ってC#の手軽さとXNAはよくあってると思う。
MSが作ってるだけあってよく作り込まれたフレームワークだし。
0053名前は開発中のものです。2010/12/18(土) 11:43:06ID:NqdLgtTb
悪い意味で他にライバルが居ないんだよな
C++は別格としても、それ以外ではC#のほかに現実的な選択肢が無い
0054名前は開発中のものです。2010/12/18(土) 20:11:14ID:4XOJBpRQ
やっぱりC++が現実的だよね。
DX10以降になればWindows API Code Packが使えるのかな。
0055名前は開発中のものです。2010/12/18(土) 21:50:41ID:K2tyzowz
俺はアプリやゲーム自体はC++で作りたいんだけど
エディタとかは簡単にC#で作りたいんだよね
そこで困るんだよなぁ

DirectXを使用しないC#なんて描画が遅くて話にならないし
使うにしても現状XNAしか選択肢が無いけれどXBOXの仕様にひっぱられて
DirectX9までの中途半端な物しか使えない

やっぱりC#から普通にDirectXを呼び出せるManagedDirectXの存在は
必須だったと思うんだが、なぜ開発をやめてしまったのか・・・

だからSlimDXには超期待している
0056名前は開発中のものです。2010/12/18(土) 21:53:45ID:JWorHuxc
エディタなら配布のこともあまり考えなくて良いからSlimDXは良い選択だと思う
0057名前は開発中のものです。2010/12/18(土) 22:23:40ID:4XOJBpRQ
けどC#+SlimDXだと、DirectX+Net Framework+SlimDXが必要だからね。
SlimDxは添付できるし、DirectXもNet FrameworkもXP以降は最初から入って
いるけど、今の最新にする場合はやっぱりインスコ必要だし。
そこが一番面倒なとこ。
SlimDxはDirectXの薄いラッパーだから、変に集約してなくて使いやすいので
選択肢としてはいいとは思う。
0058名前は開発中のものです。2010/12/18(土) 22:56:19ID:5bWq6Od2
まあD言語とかの選択肢がないではないけどな。

WPFとの組み合わせが確立できるといいんだけどなぁ。
0059名前は開発中のものです。2010/12/18(土) 23:58:01ID:4XOJBpRQ
WPFはゲームには使えないだろ。
ブラウザゲー程度かと。

D言語は昨日サイト見てたけど、言語仕様がガラパゴスな感じ
だったね
0060名前は開発中のものです。2010/12/19(日) 09:49:54ID:+uUW/+wM
D言語って言語仕様だけ見ればかなり良い言語だと思うんだけど。
基本はC系だしガラパゴスな感じってのがよく分からん。
ただ、これでゲーム作るとなるとC#なんて目じゃ無いぐらいドキュメントが少ないっていう。
0061名前は開発中のものです。2010/12/19(日) 14:39:17ID:tZJ4XwZS
Dは互換性のない言語仕様変更をしょっちゅうやってるから実用言語としては話にならない
C#も言語仕様は拡張しまくってるけど、MSだから上位互換は絶対に保たれる
0062名前は開発中のものです。2010/12/19(日) 14:55:42ID:tl1Xfhrg
>>61
D言語ってそんなに互換性のない仕様変更多いのか。
自作ゲームで採用するのを見送ってよかったぜ。

>>60
基本C系だけど、色んな言語のいろいろな機能を取り込んでいるから
機能多すぎと言った方がいいかもしれない。
まあ、基本だけ覚えて後は使わなければいいのだけど、それだとD言語
をわざわざ選択する必要はないし、ある機能を使ってこそ意味があると
思う。
0063名前は開発中のものです。2010/12/19(日) 16:50:41ID:+uUW/+wM
なんかD言語スレ見たくなってしまったなw
0064名前は開発中のものです。2010/12/19(日) 17:15:07ID:tl1Xfhrg
あー、変な話降ってすまない。
元のSlimDXの話をどうぞ。
0065名前は開発中のものです。2010/12/19(日) 19:59:21ID:oIwD3nP1
優越決まっても、別に最初から最後まで
それしか知らないそればかり使えない事は無い
ゲハ板の住人でもあるまいし


C言語わかってもDirectX SDKのDXUT読める奴はそう居ない
シェーダーとか使いこなせるようになるまでは
C#でもDでもいいんじゃないか
0066名前は開発中のものです。2010/12/19(日) 20:34:24ID:+uUW/+wM
むしろシェーダーとか使うようになるまでが言語の差が出てくると思うんだが
3Dの基礎はどの言語でも変わらない訳だし
0067名前は開発中のものです。2010/12/19(日) 21:34:42ID:oIwD3nP1
曖昧な書き方して、意味を取り違えられたかな?

CやC++で初めるのは良いよ
後々PIXを使えないと死ぬので、どのみちCヘッダーぐらい
読め無いと生き残れない
だけど、DXUTをガチで相手したら駄目
Cがこういう糞言語という訳でない
0068名前は開発中のものです。2010/12/19(日) 22:36:29ID:EYwGO04p
DXUTはそれ自体が大規模化しちゃって、
DirectX(3D)の使い方を調べるのはやや不向きになっちゃってるのが残念だよね。
その点はSlimDXのサンプルのほうが簡潔で分かりやすい。

そいや、C#でプリミティブのVertexBuffer用のデータを作成するのって
皆はどうやってる?
やっぱりstructを定義して1個ずつインスタンスを初期化していくんですかね。
この部分、ジェネリックがうまいこと動かずにすごく苦労する。
0069名前は開発中のものです。2010/12/19(日) 22:48:47ID:2VEpyIA3
unsafeでポインタ使いまくり
SlimDXなんか使ってる時点で安全性なんか関係ない
0070名前は開発中のものです。2010/12/20(月) 22:37:09ID:YK+Rc81C
ポインタ使いまくりなら最初からC++でやればいい気がするが?
0071名前は開発中のものです。2010/12/20(月) 23:00:57ID:Ml895Bvs
なんでそういう極論になるかな。
速度的にクリティカルなところとか、どうしても低レベルな処理をしたいところはあるだろ。
そういう箇所って言うのは一般にはほんの一部なんで、
そこのためだけに面倒なC++を使う必要がないのは大きなメリット。
0072名前は開発中のものです。2010/12/21(火) 00:32:03ID:N/+0RCBN
ところで結構作り進めて今更気がついた。
DirectX9でのロスト対策がどうしようもないんだけどどうすればいい?
Device.Resetかけた時点でInvalidCallを吐き出して進まん・・・
0073名前は開発中のものです。2010/12/21(火) 01:17:54ID:FsRX6CKW
>>72
Direct3D9以前のデバイスロスト対策は、それはもう大変なんだよ。
今からやるならおすすめしないね。
仕事上、どうしてもやらないとというなら頑張れ。

>>69-71
ちょっと違うんだな。VertexBufferは速度面に問題があるのではなくて、
ジェネリックが使えない部分で困ってるんだよ。
C++のように何でもかんでもテンプレート化ということはできないから。
0074名前は開発中のものです。2010/12/21(火) 05:58:42ID:UFi6vgUK
わからん。専用のstruct定義して配列流しこむ以外に何かあるの?
もしかしてC++でいうTMPとか駆使してFVFや頂点宣言を自動で解決したいとかいう話?
0075名前は開発中のものです。2010/12/21(火) 08:52:18ID:FsRX6CKW
>>74
MemoryStreamにバイト単位で書き込んでいく方法もある。
どうもこのあたりの部分をジェネリックでうまく一般化出来ないんだよね。
C#相談室あたりで質問したけど無理、という結論になったことが。
0076名前は開発中のものです。2010/12/21(火) 10:07:33ID:IUyb5141
なんだコイツ?
会話する気が無いのか?

VertexBufferの作成やSetFVFが簡単にできる
C++の構文で、C#にはできないのはな〜だ?
ってwなぞなぞかよw

聞きかじった知識があるだけで、何も理解してない
だろコレ
0077名前は開発中のものです。2010/12/21(火) 11:45:06ID:FsRX6CKW
>>76
書かれてるレスをなぞなぞ呼ばわりしてるんだったら、
理解してないのはお前じゃないか。

SlimDXはC#でDirectXを扱えるようになる便利なライブラリだが、
VertexBufferのフォーマットを色々と弄りたい時に
C#の文法上の制限から扱いにくい場合があるという話をしているだけ。
0078名前は開発中のものです。2010/12/21(火) 11:59:41ID:IUyb5141
じゃあ、C++文法上だとどんな書き方ができる?
0079名前は開発中のものです。2010/12/21(火) 13:40:09ID:589aNUur
頂点扱うメソッドやクラスはなんでもかんでも<TVertex>と書きたいということ?
インターフェイス使って
interface IPosition3D { Vector3 Position3D { get; set; } }
interface ITexCoord2D { Vector2 TexCoord2D { get; set; } }
where TVertex : struct, IPosition3D, ITexCoord2D みたいな感じで可能
構造体の場合は実行時に特殊化されるのでインターフェイス経由のメンバアクセスでもボックス化は発生しないけど
プロパティ経由だからインライン展開されたとしてもコピーは消えないのでどうしても遅くなるのは仕方ない
MemoryStreamとか使っていい程度なんだったら別に問題にはならんでしょ
0080名前は開発中のものです。2010/12/21(火) 14:33:36ID:IUyb5141
ガキはほっといて、C#のメタプログラミングで
VertexDeclarationの自動化を解決させちまおうぜ

C++の静的じゃなくて、AttributeとReflectorを使った動的メタプログラミング

定義部
struct HOGEVertex
{
   [VertexElement(type = DeclarationType.D3DDECLTYPE_FLOAT3 ,usage = Decl
arationUsage.D3DDECLUSAGE_POSITION)]
   Vector3 Position;
   [VertexElement(type = DeclarationType.D3DDECLTYPE_FLOAT2 ,usage = Decl
arationUsage.D3DDECLUSAGE_TEXCOORD)]    Vector2 UV;
...

読み込み部
VertexElement[] ReadFVFAttribute<T>() where T : struct
{
var vertexElements = new List<VertexElement>();
foreach(var fi in typeof(T).GetFields())
{
   foreach(var attr in fi.GetType().GetCustomAttributes(false))
   {
       if (attr.GetType() == typeof(VertexElementAttribute) )
           vertexElements.add(new 略);
...
   result = vertexElements.ToArray();
}
0081名前は開発中のものです。2010/12/21(火) 15:10:37ID:FsRX6CKW
>>80
なんじゃこりゃw すごい動的なコードだなぁ。
VertexBuilder的なクラスの階層でジェネリックにすればいいのかなと
思って色々試したんだけど、うまくいかなかったんだよね。
0082名前は開発中のものです。2010/12/21(火) 16:03:41ID:589aNUur
それだったら別にリフレクションなんか使わなくても
VertexElement[]を返すプロパティを宣言したインターフェイスをHOGEVertexに実装させて
whereで要求すればいいだけじゃないの?
0083名前は開発中のものです。2010/12/21(火) 16:08:34ID:IUyb5141
それC++でやってたソースみた事あんのか?
なんだかな

C++もC#も知らない
その自分が未熟なことも知らない
しまいには人を見下すだけで会話もできない
0084名前は開発中のものです。2010/12/21(火) 16:10:35ID:IUyb5141
>>82
うん 俺もこんなの使って無い
0085822010/12/21(火) 16:15:24ID:589aNUur
直接関係ないけどGetCustomAttributesがフィールドの宣言順に返ってくる保証は無いよ。
順番が保証されてるフィールド情報の列挙方法はリフレクションAPIには無いので、
VertexElement属性には明示的にインデックスを付ける必要がある。
どうせリフレクション使うんだったら、staticプロパティとしてVertexElement[]を返すプロパティを定義してしまって
そっちに属性を付けた方がいいかもしれない。
0086名前は開発中のものです。2010/12/21(火) 17:09:39ID:IUyb5141
>>85
>宣言順に返ってくる保証は無いよ
本番では使って無くてよかったw


後の継承設計を考えると、staticなVertexDeclarationを
渡す、IVertexDeclarationProvider{ GetDeclaration(); }じゃないかな。

たぶん、みんなこういうことしてるのではないかなぁ
DrawableObj<T> where T: struct , IVertexDeclarationProvider
{
  Draw() //毎フレーム
  {
    gd.VertexFormat(T.GetDeclaration());
    vb.SetData(T_array);
  }
}
class HogeEffectedObj : DrawableObj<HogeVertexA>
リフレクション使うとしたら、ゲーム開始やLoading中に、
プロジェクト中のstaticな要素をパラメータ付けて初期化するとか(破棄&GCするとか)

ゲームのメインループ外に処理にできないと設計の意味が無い。
0087名前は開発中のものです。2010/12/21(火) 18:38:36ID:Xai41NPW
インターフェイスのstaticメンバはサポートされてないので
staticフィールドを返すインスタンスメンバとして実装してdefault(T).GetDeclaration()かな
0088名前は開発中のものです。2010/12/21(火) 20:51:48ID:N/+0RCBN
>>73
亀レスすまぬ
普通にロスト起こした時にSpriteやらのリセットをしてなかっただけだった。無事に対策できたっぽい
失礼しました
0089名前は開発中のものです。2010/12/21(火) 23:09:44ID:IUyb5141
>>87
ゴメンtypo

× T.GetDeclaration() //コンパイルできません
○ T_array[0].GetDeclaration() //こんなもんかな

それから型パラメータは TVertex とかにしないとスゲー読みづらい
0090名前は開発中のものです。2010/12/21(火) 23:25:18ID:Xai41NPW
いやdefault(T).GetDeclaration()のほうがいい
構造体なのでdefault(T)でインスタンスが作れる
0091名前は開発中のものです。2010/12/21(火) 23:36:17ID:Xai41NPW
それと、リフレクション使うならこういうふうにシングルトンでキャッシュするのがいいよ
class VertexInfo<TVertex> {
 public static readonly VertexInfo<TVertex> Instance = new VertexInfo<TVertex>();
 public VertexElement[] Format { get; set; }
 private VertexInfo() { /*ここでリフレクション使ってFormatを初期化*/ }
}
0092名前は開発中のものです。2011/01/23(日) 21:16:58ID:v5GChX7G
俺MDXから入った身なんだけど、Spriteでの拡大とか回転に悩んでるんだが。
SlimDXでのDirectX9オンリーで作りたいんだけど、MDXで作ってた時みたいにSprite.Draw2DでやろうとしてもDX10/11にしか無いんだよね。

要するにSlimDXでSpriteの拡大とか回転ってどうやんの?
本家DirectXの知識は殆ど無い。
0093名前は開発中のものです。2011/01/23(日) 21:28:14ID:IvAtt79g
Transformに変換行列入れる
ネイティブのD3DXのラッパーっていうのはなんか気持ち悪いからSpriteは自作してるなあ
0094名前は開発中のものです。2011/01/23(日) 22:19:47ID:v5GChX7G
>>93
いまいちキチンと分かって無いんだけど、Matrix.Transformation2Dってものがあったんで試してみた。
が、表示されん。きちんと描画してるはずなのに何故だ・・・
0095名前は開発中のものです。2011/01/24(月) 00:11:56ID:ZV2/0eH0
>>94
SlimDXのサンプルは単純でよく出来てるから、
それを真似するところから始めるといいよ。
0096名前は開発中のものです。2011/01/24(月) 17:28:23ID:SbpYcvOy
サンプルを見てみたが、SpriteとTexture使った拡大とか無かったわ・・・
うーむ、俺の考え違いだったのかも知れない。やはり一から勉強しなおす必要がありそうだ。
0097名前は開発中のものです。2011/01/24(月) 17:33:40ID:ZV2/0eH0
>>96
俺の場合、2Dの板ポリをGPU描画することが大半なので専用の計算をしている。
座標系が2D系と同じにすることを意図して、
Z軸のマイナス側からカメラを向ける。
そして板ポリの座標系がそれに合うようにワールド座標を設定しておく方式。
0098名前は開発中のものです。2011/01/24(月) 17:45:20ID:SbpYcvOy
>>97
なるほど、ちょっとじっくり勉強しつつ試してみます。ありです。

ただMDX見たいなDraw2Dのように簡単に拡大とか出来たりする奴はSlimDXのDX9には無いってことでいいのかな。
ずっとMDXに頼ってきて最近SlimDXに移ってきたから・・・ 無知ですみません
0099名前は開発中のものです。2011/01/24(月) 18:02:45ID:ZV2/0eH0
>>98
それならなおさらD3DXSpriteを使えばいいじゃん。
0100名前は開発中のものです。2011/01/26(水) 21:53:12ID:q2pNSJtE
度々すまない。
俺が思ってる簡単に拡大とかって言うのは、
Sprite.Draw(位置,Rectangle,サイズ,ロケーション)
見たいなもので、それが無いのかなと甘い考えをしてた。
D3DXSpriteと言われても良く分からなかった。
もうこれで分からなかったら迷惑になりそうなので引きます・・・
0101名前は開発中のものです。2011/01/26(水) 22:59:48ID:Dys02ewd
>>100
D3DXFontには変換座標かけつつ描画するモードがあるから、
たぶんSpriteにもあるはずなんだけど。
ただし、D3DXFontの場合は描画が遅くなったのであしからず。
(なぜかというと、変換かけない場合はVertexエンジンを使用せずに描画するから)
0102名前は開発中のものです。2011/01/26(水) 23:00:52ID:q2pNSJtE
>>101
なるほど。試してみます。
お騒がせしました
0103名前は開発中のものです。2011/02/21(月) 01:33:37.79ID:FjA/EdKJ
SlimDX初心者です。
画像を表示するためにDirect3D9でテクスチャ表示をしようと思っているのですがどうしたら良いのか教えていただけないでしょうか?
DirectInputを利用したキーボード入力、Direct3D9を利用した背景色の設定は出来ました。
0104名前は開発中のものです。2011/02/21(月) 04:26:22.73ID:e+9Xrrk1
>>103
サンプルプロジェクトのソースコードを読め。
0105名前は開発中のものです。2011/02/21(月) 20:14:03.45ID:da8+AaWU
>>103
とりあえずこのへん
http://www21.atwiki.jp/csharpgamedev/pages/18.html
0106名前は開発中のものです。2011/03/12(土) 19:58:15.04ID:gPTtXzoi
age
0107名前は開発中のものです。2011/03/24(木) 15:10:27.06ID:o/XjgpCP
3DモデルのツールみたいなものをSlimDXで作ろうとしてるのですが、別ウィンドウでダイアログを
出してボタン等のコントロールを表示することってできるのですか?

0108名前は開発中のものです。2011/03/24(木) 15:12:42.59ID:+jtjlJX2
もちろんできる
普通にWinFormsやWPFで作って表示すればいいだけ
というより、フォーム上に貼り付けたコントロールの上にSlimDXの描画を行う
01091072011/03/24(木) 16:52:06.20ID:o/XjgpCP
Winformに配置する部分ってフォームデザイナも使えるんですか?
0110名前は開発中のものです。2011/03/24(木) 17:00:46.83ID:+jtjlJX2
使える
SlimDXで描画したい部分にはパネルでも貼り付けといて
そのウィンドウハンドルをDeviceのコンストラクタに渡せ
01111072011/03/24(木) 17:14:42.98ID:o/XjgpCP
なるほど、そのやり方でやってみます。
ありがとうございました。
01121072011/03/24(木) 17:48:46.54ID:o/XjgpCP
フォーム表示までできたのですが、
// var form = new RenderForm("SlimDX Sample"); ←はコメントアウトして
   var device = new Device(new Direct3D(), 0, DeviceType.Hardware, パネル.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters()
というやり方で合っていますでしょうか?
0113名前は開発中のものです。2011/03/25(金) 10:54:48.65ID:L6sPV2wn
SlimDXのサンプルが掲載されているWebサイトって無いですか?
海外サイトでも構いません。
0114名前は開発中のものです。2011/03/25(金) 21:09:55.09ID:vv767kg8
>>112
ウィンドウハンドルを入れるところは合ってるけど、色んなものが抜けてる。
とりあえずDirect3Dオブジェクトを外に出して、更にPresentParametersに
適切な値を設定するところから。

>>113
ttp://www21.atwiki.jp/csharpgamedev/pages/18.html

あとSlimDX SDKのサンプル。
0115名前は開発中のものです。2011/03/25(金) 21:18:59.16ID:8nQu2/1X
XNACCのサンプルとDirectXSDKのサンプル(C++)が一番役立つ
0116名前は開発中のものです。2011/03/29(火) 23:06:19.15ID:7uGGHTvI
2点引っかかっている箇所があります。
どなたかヒントなどお持ちの方いらっしゃいましたら教えてください…。

@
 新しいテクスチャを作る際のTexture2DDescriptionのパラメータで
 Usage=Default
 OptionFlags=None  
 CpuAccessFlags=None
 この3つのどれか一つでもDefault/None/Noneから別のに変えるとnew Texture2Dのところ(*)でInvalid Callエラーが出ます
 ネット上では同様の症例にたどり着けなかったのですが可能性のある原因など思い当たる方はいらっしゃいますか?
 (Default/None/Noneの状態だと普通に作れます)
 //////////////////////////////////////////
 Texture2DDescription testTexDesc = new Texture2DDescription();
 //他のパラメータ省略
 testTexDesc.Usage = ResourceUsage.Default;
 testTexDesc.OptionFlags = ResourceOptionFlags.None;
 testTexDesc.CpuAccessFlags = CpuAccessFlags.None;

 Texture2D testtex = new Texture2D(dx11Device, testTexDesc);  //*
 //////////////////////////////////////////
0117名前は開発中のものです。2011/03/29(火) 23:06:29.29ID:7uGGHTvI
A
 テクスチャ(Texture2D)からピクセルを読み出したかったのでGetPixel的なメソッドを作っているのですが
 Direct3D11以降、テクスチャのロックをするメソッドはdx11デバイスのImmediateContext.MapSubresource(〜);で正しいでしょうか?
 (もしくはtex.AsSurface(〜).Map(〜)…?)
 Direct3D10までのTexture2DインスタンスにはMap()メソッドがあるようなのですがDirect3D11のTexture2Dには見当たらず、調べてみたら前述のメソッドがそれっぽいような感じを受けました。
 テクスチャのCpuAccessFlagを変更できないのでそのメソッドでいいのか確認できないのですが、もし定石のやり方があれば知っておきたいと思っています。


/////////環境
Windows7 64bit
Visual C# 2010 Express Edition
SlimDXのバージョンは昨日までJune 2010でした
今日March 2011にアップデートして参照設定置き換えましたが症状はまったく変化しませんでした
参照DLLはx86Verとx64Ver両方で試しましたがどちらも同じでした。

ろくに英語読めないながら海外のサイトなどをちょっと見たところでは
Win7 64bitというのがどうも相性が悪そうな感じを受けるのですが…
0118名前は開発中のものです。2011/04/05(火) 18:00:52.28ID:+LS+lOHR
海外でもいいので情報交換をしてるフォーラムってないんですか?
0119名前は開発中のものです。2011/04/06(水) 02:47:44.18ID:PtBPsaxE
gamedev.netはslimDX関連のスレッドをよく見かけるなぁ
0120名前は開発中のものです。2011/04/09(土) 10:55:44.62ID:sKYCeLl0
SlimDXでDirectX関連で確保したメモリは、最後に手動で開放しないと残ってしまうんですか?
0121名前は開発中のものです。2011/04/09(土) 12:36:51.53ID:QWLtEJqL
うん
たしかナントカManagerみたいなのがあって
そのstaticメンバとして全てのDirectX関連のリソースへの強参照を保持してて
わざわざGCを動かなくしてる糞設計だったはず
0122名前は開発中のものです。2011/04/09(土) 13:35:47.32ID:oX/gW5Mu
オレは自前でリソース専用のガベコレを用意して、
明示的に解放させてるな(システムとしては参照カウンタ方式)

SlimDX付属のフレームワークもそうなってるだろ?
0123名前は開発中のものです。2011/04/12(火) 16:16:23.71ID:Y/I5qVEj
SlimDXにあるUnprojectってスクリーン空間からオブジェクト空間にベクトルを射影させる関数ですか?
MDXにあるUnprojectとは引数が違っている様に思うのですが、使い方が分かりません。
0124名前は開発中のものです。2011/04/12(火) 16:22:02.28ID:155qZFtN
>>123
実装を見て考えたら?

Vector3 Vector3::Unproject( Vector3 vector, float x, float y, float width, float height, float minZ, float maxZ, Matrix worldViewProjection )
{
 Vector3 v;
 Matrix matrix;
 Matrix::Invert( worldViewProjection, matrix );

 v.X = ( ( ( vector.X - x ) / width ) * 2.0f ) - 1.0f;
 v.Y = -( ( ( ( vector.Y - y ) / height ) * 2.0f ) - 1.0f );
 v.Z = ( vector.Z - minZ ) / ( maxZ - minZ );

 Vector3::TransformCoordinate( v, matrix, v );
 return v;
}


0125名前は開発中のものです。2011/04/12(火) 23:28:55.22ID:4dFtS2x0
>>123
俺はこんな感じで使ってる(マウスカーソルを射影)
float z = 0.1f; //0〜1f?射影時の視点からのポイント距離
Vector3.Unproject(new Vector3((float)mouseX, (float)mouseY, z), viewport.X, viewport.Y, viewport.Width, viewport.Height, viewport.MinZ, viewport.MaxZ, mat);

最初と最後の引数以外は全部Viewportから取ってるから
Viewport持ってるなら簡単

最後のmatrixは普通にワールド*ビュー*プロジェクションのマトリクス渡す
0126名前は開発中のものです。2011/04/22(金) 02:56:05.21ID:UveiKLLT
>>120
今時、搭載メモリ8G12GB16GBはあたりまえだから、あんまり気にしなくていいんじゃないかな。
0127名前は開発中のものです。2011/04/23(土) 17:14:08.38ID:H3hA0vRV
Xファイルの中にある法線ベクトルのインデックス番号ってどうやったら取れるのですか?
頂点バッファと頂点インデックスまでは取れてます。
0128名前は開発中のものです。2011/04/23(土) 18:42:03.05ID:0CpVWLj4
>>127
普通は頂点に位置とかUVとかと一緒に法線ベクトルそのものが入ってるよ。
01291272011/04/23(土) 19:33:02.95ID:H3hA0vRV
>>128
ありがとうございます、法線ベクトルも取れました。

でも、せっかく取れた法線ベクトルですが、Xファイルから独自形式の(FVFで定義した)もので描画しようと思ったのですが、
法線ベクトルを頂点データに入れてもライティング効果がありませんでした。

struct VertexTex
{
public const VertexFormat Format = VertexFormat.Position | VertexFormat.Diffuse | VertexFormat.Normal;
public Vector3 Position; public int Color; public Vector3 Normal;
}

VertexTex[] vert = new VertexTex[N];
vert[n].Position = 取得した位置
vert[n].Color = 取得した色
vert[n].Normal = 取得した法線ベクトル

こんな感じで取得した情報をそのまま頂点バッファに入れています。
Xファイルから法線情報を引き継ぐにはどうしたらいいのですか?
0130名前は開発中のものです。2011/04/23(土) 19:55:21.49ID:0CpVWLj4
>>129
Mesh.FromFileで読み込んだMeshに、独自のVertexFormatを
後から定義したいということ?

とりあえず下の例ではXファイルから生成したMeshにNormal追加してるので参考に。

chsarpgamedev - Xファイルの描画
http://www21.atwiki.jp/csharpgamedev/pages/32.html

デバッガで法線ベクトルが正しそうな値が入っているのを確認して、かつ
固定パイプラインを使っての描画なら、ライトが正しく設定されているかを
確認したほうがいいかも。

シェーダ使ってるならシェーダ自体が間違ってる可能性も。

ちょっとこれだけでは様々な原因が推測されるので、Mesh.CreateTeapot使って
どうなるかとか、問題の切り分けが必要だと思われる。
■ このスレッドは過去ログ倉庫に格納されています