ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

DirectX SDKコミュのDirect3D

  • mixiチェック
  • このエントリーをはてなブックマークに追加
DirectXの主な機能は、やはり3Dでしょう。
ということで、Direct3Dについて、
こんなふうに作ってる、困ってる、などなどありましたら、
その想いぶちまけてください!

コメント(94)

 久しぶりです。
 この前DirectGraphics周り弄ったので、其処らへんのことについて書き込みます。
 以前、れいやさんが言ってたテクスチャ真っ黒って現象についてですが、私の方では確認できませんでした。
 ただ、D3DXCreateTextureFromFileExで下記のフラグを設定すると、テクスチャ真っ白になったりします。(コレは読み込んで表示した瞬間から真っ白なので、よくわかりませんが。普通は指定しないのでしょうか)
 D3DPOOL_SYSTEMMEM
 D3DPOOL_SCRATCH
 あとは、ひたすら消失したデバイスの復帰の仕方を模索してました。デバイスのResetメソッドをただ使用しただけだとエラーを返すのでどうしたものかと途方にくれたものです。(DirectX8の時は大丈夫だった記憶があったのですが)
 とりあえず、OnLostDeviceとOnResetDeviceを適切に処理すれば大丈夫な事に気付き何とか解決。
 近々ノートPCの方でも動作確認しますので、そっちの方でもテクスチャがどうなるか、ためし次第報告します。
 では、また。
連続で投稿してなんだか申し訳ないですが、とりあえず前に私が聞いたことで解決した事をつらつらと書いておきます。

>Microsoft DirectX 9.0 SDK Update (October 2004)
 当時私が使っていたDirectX9のSDKはSummer2003すら入れていない状態だった事が昨日発覚(遅っ
 引数が増えたり減ったりの仕様変更は、Summer2003の時点で既にあった様子ですので、Summer2003からOctober2004に移った方は違和感が無く移植できたかも。
 一応、通常のDirectX9.0とSummerやOctoberの違いを適当に上げておきます。
http://al-eiru.hp.infoseek.co.jp/dxg_neta001.txt
個人的なメモみたいなモノですので、内容は期待しないでください。

SummerとOctoberでソースコードの変更は特になかったのですが、Octoberは標準でVC++6.0を対象にしていない様子。
Extraとかいうモノを別途ダウンロードして修正することで6.0でも使用できるみたいです。
ですので、そのままコンパイルしようとすると、libまわりのエラーが沢山でたりします。
私は67個出ました。

VC++6.0でOctober2004を試す人は、気をつけてください。
ふーむ ついにVC6.0 標準から切り捨てですかぁ
淋しい限りな感じがしますが。

新しいコンパイラー買う財力がない僕はこのまま放置かなぁー。

と言うことで、調べ物ご苦労様です(・_・ゞ
>ふーむ ついにVC6.0 標準から切り捨てですかぁ
>淋しい限りな感じがしますが。
 ええ、よい統合環境だったので、ちょっと残念。
 まぁ、マイクロソフトとしては、早く新しい環境にしたいのでしょうから、致し方なしと諦めますw
 けど、たしか次のWindowsはDirectX9が標準になるはずなので、もうしばらくはVC6.0も現役で居られそう。
 …あー、けど、Windowsプログラミングのあたりの仕様変更が激しかったから結局切り替えを迫られるのかなぁとか思わなくも…(どっちだw)

>新しいコンパイラー買う財力がない僕はこのまま放置かなぁー。
 そういうところを考えると、教員関係のお仕事に憧れません?
 たしか教育用ってことでアカデミックパックが買えたはず。

>と言うことで、調べ物ご苦労様です(・_・ゞ
 ありがたいお言葉であります(・_・ゞ
spin さんとこの記事で見ましたが、
次は DirectX Graphics → Windows Graphics Foundationですか。

わたしはまだ vc.net を持っていないんですが、
いまの vc.net って Longhorn でも使えるんでしょうかねぇ?
ダメなら vc6 でもうしばらく我慢して、 Longhorn 版を買いたいところ。


> サイダーさん
lua ユーザー発見!!
いいですよねぇ。lua。もううっとりです(笑

わたしの場合はモデルもモーションも lua 形式で定義して、
スクリプトを実行時に走らせてロードする予定です。(予定かよっ!

scene = {
  model = {
    poition = {
      { 0, 0, 0 };
      { 0, 0, 1 };
      { 0, 1, 0 };
    };
    poly = {
      { 0, 1, 2 };
    };
    tex = "tex.tga";
  };
  anim = {
    { 0, 0, 0, 0 };
  };
};

↑みたいな。
これを lua のスクリプト上でロードします。
まだMAYAのエクスポートプラグインを書いている最中ですが。
おお、すばらしいですねー > Luaでロード。
僕の場合、そう言う構造体を Luaからロードする方法が解らなくて諦めちゃいましたから^^;;;

Mayaエクスポーターって なんか僕とやってることが微妙にかぶりそうでちょっとドキドキダ :D
>うてにゃん
IDirect3DDevice9::SetViewport
を使ってスクリーンの一部に描画出来ますよ
いえいえ、画面分割するには、

SetViewport(左上);
描画処理1P
SetViewport(右上);
描画処理2P
SetViewport(左下);
描画処理3P
SetViewport(右下);
描画処理4P

とすればいいです。

ちなみに、DirectX8以降は、2D関連の処理をするにも3Dパイプラインの魔の手から逃れられないので要注意です。

例えば、スクリーン座標を直接指定したいがために D3DFVF_XYZRHWを使うと多くのビデオチップでテクスチャが描画されない等
はじめまして。砂花と申します。

いきなりで申し訳ありませんが、
現在テクスチャデータをプログラム内で書き換えようとしているのですが
?のような場合、データを書き換えても描画に反映されません。
(1度目だけは反映されているようです)

?
texture create
処理ループ {
  texture lock
  データ書き換え
  texture Unlock
  描画
}
texture release

しかし、?ような場合は反映されます。

?
処理ループ {
  texture create
  texture lock
  データ書き換え
  texture Unlock
  描画
  texture release
}

テクスチャは、256x256、D3DFMT_A8R8G8B8、D3DPOOL_MANAGEDにて
作成しています。

?のやり方は使うなと言われればそれまでなんですが
なぜ、こうなるのかが調べても分かりませんでした。
ご存知の方がいらっしゃいましたら、ご教授願います。
プログラムの詳細はわからんですが、アンロックしたからと
いって即座にVRAMに反映されてるわけでは無いのでしょう。
MANEGEDだとなおさらVRAMとの同期タイミングは分からない
のではないでしょうか。
> kaoruさん

遅くなって申し訳ありません。
数分実行し続けても反映されなかったので
不思議に思ってたんですが。。。
もう少し調べてみようと思います。

どうもありがとうございました。
>情報のソースとかありますでしょうか?
>ご存知でしたら教えてくださいまし〜m(_~_)m

こちらは実機で確認しているので・・・

ヘルプ(だっけ?)のどこかに、D3DFVF_XYZRHWを使用すると頂点シェーダーをスキップする様な記述を見かけました

とりあえず再現方法は、

Intel915G,RADEON9200まで,Matrox G550/Parhelia,GeForce2まで&4MXなどで

・D3DFVF_XYZRHW | D3DFVF_DIFFUSE
・メインメモリに頂点データを用意
・用意した頂点データはグラデーションがかかるように頂点色を設定
・DrawPrimitiveUPで描画

で、グラデーションがかかっていないポリゴンが描画されると思います。

少なくとも、手元のThinkPadX41(915GM)では確認済みです。

こちらでは、RHWを除去してHLSLでUnprojectionすることで回避しましたがw
とりあえず、DX8世代のビデオチップ(nVIDIA以外)を引っ張り出してきて試してみてください。

Parhelia,RADEON8500,Mobility RADEON 9000,WildcatVPあたりがおすすめ

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/DirectX9_c/directx/graphics/programmingguide/programmable/vertexshaders/decouplingvertexdeclaration.asp

>XYZRHW タイプの位置座標を持つ FVF をプログラマブル頂点パイプラインと共に使った場合、頂点は「トランスフォーム済み ライティング済み」として処理され、頂点シェーダ機能は適用されない。
最近DirectXを学び始めたんですが、Visual C++ 6.0で作ったプログラムがVisual C++ 2005 Express EditionだとコンパイルはできるのですがClear(...)に失敗してしまうようになってしまいました。Tutorialと比べつつ変更していったんですが、解決することが出来ません。
Visual C++ 6.0からVisual C++ 2005 Express Editionに移す際に絶対に変更しなければならない点とかあるんでしょうか?
>鬼灯さん
はじめまして。

基本的にVC6からVCExpressに移植する時にコード変更は殆ど無いと思います。詳しい失敗状況が分かりませんが(SDKのバージョンやエラーで戻ってきた値)エラーの原因として、

1、Clearに渡すD3DCLEARフラグの組み合わせが無効
2、そもそもデバイスが作成されていない

1に関して、例えば深度バッファを作成せずに、D3DCLEAR_ZBUFFERフラグを組み合わせてClearを呼び出すと失敗しちゃいます。
>Gyabo@Luteさん
回答どうもありがとうございます、原因はおっしゃるとおりでした、D3DCLEARフラグの設定がおかしかったようです。あと、ヴューポートの設定も変なことしてました、でも、こうなると、なんでVC++6.0で動いていたのか不思議です・・・・。
すみません。
ここには初めて書き込みさせていただきます。
そむにうむ@森山弘樹と申します。
現在、仕事でDirectGraphicsをいじっています。
(クライアントからの要求で、Oct2004版のDirectX9をベースにしています)

いきなりですが質問です。
ID3DXANIMATIONCONTROLLERをD3DXLoadMeshHierarchyFromFile()を利用せずに自力でデータを設定してアニメーションを実行された方はいらっしゃいますでしょうか?

実は、現在開発しているプログラムでアニメーションの逆転再生機能を実装しようとして頭を抱えています。
現在のアニメーション関数の仕様ではキーフレームの逆転再生は不可能で、ならばと思いアニメーションセットのキーフレームの情報を逆に並べ替えてみたのですが、一回再生すると2度とアニメーション再生が出来なくなってしまいます。
(この現象が何のペナルティで発生しているか原因は未だつかめていません。)

そこで、正方向再生と逆方向再生のアニメーションコントローラを設定し、それぞれ正逆再生用のアニメーションセットを新規に定義して再生スrと、今度は階層構造がばらばらになって再生される始末で、現在完全にお手上げ状態です。

というわけで、結局Xファイル上に逆転再生用のアニメーションセットを定義して実行する事でこの問題を回避する事にしたのですが、逆転再生くらいプログラムでスマートに処理できないものかという未練がくすぶっています。

まだDirectXプログラミング歴1年半の未熟者ですが、何かアドバイスがありましたら是非ご教授下さいますよう宜しくお願い致します。(汗)
□ 質問「Direct3D 10が快適に動作するのはどんな環境?」 □

・Windows Vista RC1
・NVIDIA GeForce 7600 GT
・Core 2 Duo
・メモリ2GB

という環境なのに、Direct3D 10のサンプルプログラムは、使い物にならないぐらい動作が重いです。

どういう環境なら快適に動作するのでしょうか?

正式にVistaがリリースされれば、Direct3D 10もこの環境で快適に動作するでしょうか?
>NVIDIA GeForce 7600 GT

DirectX10対応カードじゃないし〜。

対応カードじゃない時点でエミュレーションモードでしょう。
遅いのはしょうがありませんね。

どの道ちゃんと動かそうと思ったら来年の今ごろまで待たないと
どうにもならんですね。
今でも8800とかでてますけどちゃんと安定して開発ができるのは
その頃くらいになるんじゃないですか。
ある程度ビデオボードのタマ数出てこないとシェーダのバランスとかあたりがつけられないですからねぇ....
つかさぱぱさん、ありがとうございます。

>DirectX10対応カードじゃないし〜。

DirectX8のときに買ったビデオカードが、DirectX9でも使えたので、今回もDirectX10にも対応するのかと思っていました。
出てしまうというより、既に出ているが正解
先月のSDKからですよ
非常に低レベルな質問で申し訳ありません。

direct3dの初期化に失敗しました」との表示が出て、起動しません。
direct3dアクセレータに問題があるらしく、「利用できません」の状態になっています。

direct3dアクセレータを有効にするにはビデオドライバをインストールすればいいのらしいですが、
ビデオドライバってどのファイルをどう実行すればいいのか、どうやっても分かりません。

本当に困っています。
どなたかご助言下さい!
>gsssさん
そのプログラムがちゃんと動作するものと信用して・・・

ビデオドライバはお使いのPCに付いているビデオボードによって違うので、まずビデオボードがどこのメーカーのどの型番かを調べて、該当するドライバをメーカーのサイトからダウンロードして入れる必要があります。
大体は「setup.exe」「setup.msi」の形になっているので入れ方自体は悩まないはずです。

しかしです。
この数年でDirectXに対応してないビデオカードを知りませんので(ノートだと判らないけど・・・)、そもそもウィンドウズ95とか使っておられませんか?
そうでなければ初めからDirectX対応のドライバが入っていると思うのですが・・・。

3DアクセラレータだけってのはVooDoo以外に聞かないし、それ以前に現存してるのかどうか・・・。

的外れな答えになってたら、まずは開発環境を書かれたほうがいいと思います。
VAIOやらメーカー純正っていうのかな?そういうのは個別にドライバが無い機種も有りますし。
けいすけ@烏合の衆さん
ご助言ありがとうございます!

windouwsXP professional ver2002 servis pack 1

vaio PCG-Z1X

デバイス
MOBILITY RADEON
ATI Technologies inc,
MOBILITY RADEON AGP(0x4C59)
INTERNAL DAC(350MHz)

ドライバ
ati2dvag,dll
バージョン6.14.0010.6387

という感じです。
ATIのホームページに行ってみたのですが、たくさん種類があって、しかも英語なのでまったく判りませんでした…あせあせ(飛び散る汗)
>vaio PCG-Z1X
>MOBILITY RADEON
初代のM-RadeonなのでDirectX7に対応しているくらいではないでしょうか?
それからドライバはMOBILITY用はノートメーカー供給またはMSからだけなのでATI(AMD)のHPには出ていません

ちなみに
>windouwsXP professional ver2002 servis pack 1
SP1なのは何か理由があるんでしょうか?
DirectX10.1でしたっけ
Direct3Dの新しい部分ってどうなるんでしょうか・・・
ハードウェアが変わるって事だからいろいろ変わるんでしょうね・・・
Direct3D9が長かったせいで変更に耐えれないよー
91:ちゃりさん

懐かしい話題が・・・・

確かにリンク切れですね。

取り敢えず別の所から引用
http://www.shader.jp/xoops/html/masafumi/d3d02.htm

>・D3DFVF_XYZRHW
>トランスフォーム済みな柔軟な頂点フォーマット。3Dの場合、本来は3D→2Dという処理があるわけだがそれをすっ飛ばしたフォーマットがコレ。だから3Dなのにスクリーン座標指定で描ける。


「すっ飛ばした」ってところがミソ
何を「すっ飛ばした」のかがさっぱり判らない
GPUメーカーも何をすっ飛ばしてもいいのか判らない
と言うわけで、GPUメーカーやチップ毎に実装が変わってしまう可能性が大きいです。


逆に、頂点シェーダーを通せば動作が保証されるので

D3DFVF_XYZRHWをやめて、

・D3DFVF_XYZにスクリーン座標をセット
・頂点シェーダーで同次座標系で出力

とすれば楽に解決できる上に

・解像度が変わっても無修正でスケーリングされる

という副効果もありますよw
DirectX初心者です。

DirectX10のDirect3Dで勉強しようとしているのですが、いきなりつまづきました。

単純にスワップチェインとデバイスを作成して
画面を表示するだけのコードを書いてデバッグしたのですが、
ALT+Enterキーを押すとフルスクリーンになろうとはするものの
元の大きさにもどってしまいます。
なぜフルスクリーンにならないのかわかりません。
また、IDXGISwapChain::BufferDesc::windowed = falseとして
フルスクリーンモードで開始すると
今度はウインドウモードに切り替えられません。
原因になりそうなことの検討もつかないものですので
ご教授くださいませんでしょうか。

以下、ソース

//COMとかの初期化部分
//2000字に引っかかるため必要そうなとこだけ抜粋

//バックバッファの能力を設定
DXGI_MODE_DESC backBufferDesc;

backBufferDesc.RefreshRate = refleshRate; //リフレッシュレート
backBufferDesc.Width = windowWidth; //幅
backBufferDesc.Height = windowHeight; //高さ
backBufferDesc.Scaling = DXGI_MODE_SCALING_STRETCHED; //スケーリング
backBufferDesc.ScanlineOrdering = (DXGI_MODE_SCANLINE_ORDER)0; //描画方法
backBufferDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; //フォーマット

//マルチサンプリング(アンチエイリアス)能力を設定
DXGI_SAMPLE_DESC sampeDesc;
sampeDesc.Count = 4;
sampeDesc.Quality = 0;

//スワップチェインの能力を設定
DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferDesc = backBufferDesc; //バックバッファ
swapChainDesc.SampleDesc = sampeDesc; //サンプリング
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //アクセス権限
swapChainDesc.BufferCount = 1; //交換(スワップ)するバッファの枚数(今回はバックバッファの一枚のみ)
swapChainDesc.OutputWindow = hWnd; //出力ウインドウ
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; //スワップ方法
swapChainDesc.Windowed = true; //ウインドウモード(false = フルスクリーン)
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

//スワップチェイン及びデバイスのインターフェイスポインタ取得(フラグにデバッグ用を指定)
result = D3D10CreateDeviceAndSwapChain(NULL,D3D10_DRIVER_TYPE_HARDWARE,NULL,
D3D10_CREATE_DEVICE_DEBUG,D3D10_SDK_VERSION,&swapChainDesc,&this->swapChain,&this->device);
if(FAILED(result))
{
//ビデオカードが不十分な場合などはソフトウェアの仮想GPUドライバを使用
result = D3D10CreateDeviceAndSwapChain(NULL,D3D10_DRIVER_TYPE_REFERENCE,NULL,
D3D10_CREATE_DEVICE_DEBUG,D3D10_SDK_VERSION,&swapChainDesc,&this->swapChain,&this->device);
}
if(FAILED(result))
{
this ->State = Game::CLOSE;
return;
}

//IDXGISwapChainがリソース(バックバッファ)を保持、描画パイプラインをID3D10Deviceが保持しているので
//Deviceにバックバッファをバインドする必要があるのでバインドする
ID3D10Texture2D *BackBuffer; //2Dのバックバッファ
ID3D10RenderTargetView* targetView;

this ->swapChain ->GetBuffer( 0, __uuidof( ID3D10Texture2D ), (LPVOID*)&BackBuffer );
this ->device ->CreateRenderTargetView( BackBuffer, NULL, &targetView );
this ->device ->OMSetRenderTargets( 1, &targetView, NULL );
this ->renderTargetView.Attach(targetView);
BackBuffer->Release();


//最後にビューポートを設定します
D3D10_VIEWPORT vp;
vp.Width = windowWidth;
vp.Height = windowHeight;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
this ->device ->RSSetViewports( 1, &vp );


//描画部分

float color[4] = { 0.8f, 0.8f, 0.8f, 1.0f };
this ->device ->ClearRenderTargetView(this ->renderTargetView,color);
this ->swapChain ->Present(0,0);

//解放部分
if(this->swapChain)
{
//フルスクリーン表示の場合はウインドウモードに戻す
BOOL isFullScreen = TRUE;
this ->swapChain ->GetFullscreenState(&isFullScreen,NULL);
if(isFullScreen)
{
this -> swapChain ->SetFullscreenState(FALSE,NULL);
}
}

if(this->device)
{
this ->device ->ClearState();
}
はじめまして 書くところを間違えてたら申し訳ないです。

 最近DirectXを使うゲームをやり始めたのですがゲームを少しプレイしてると DirectXに回復不能なエラーが発生しました とでます。自分でググッてドライバーのアップデートやDirectXを最新verにしても出ます。このエラーを直すにはどうしたらいいのでしょうか?

 グラボはGTS450です  DirectXは11を使っています

解る方いましたら回答のほうお願いします

ログインすると、残り65件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

DirectX SDK 更新情報

DirectX SDKのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング