【C++】 DirectX初心者質問スレ Part25 【C】
1 :
デフォルトの名無しさん :
2009/08/25(火) 22:50:20 ※回答する人も、質問する人も必ず読んでください
これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。
【C++】 DirectX初心者質問スレ Part24 【C】
http://pc12.2ch.net/test/read.cgi/tech/1245675989/
2 :
デフォルトの名無しさん :2009/08/25(火) 22:51:49
前スレ終わりの方だったため質問が流されてしまったので またお願いします。 SetRenderTarget()で2枚分のテクスチャにDrawSubset()で描画して 2枚のテクスチャをプログラマブルシェーダでミックスして表示させようとしたのですが 背景色が表示されるだけで肝心のDrawSubset()で描画したメッシュが表示されません。 どうすればいいんでしょうか?
エスパーでもねぇのにそんな脳内説明だけでわかるわけないだろ・・・。 初心者スレつってもちゃんとした説明くらいしてくれねぇと困る。 というわけでPIXで何が書かれてないか確認しろ。
前スレ
>>996 Gamefest 2008で口頭のアナウンスがあっただけで正式発表はまだないぞ。
したがってDirectX 11がVistaで動作しうるかについては確度は高いが確定情報ではない。
5 :
デフォルトの名無しさん :2009/08/26(水) 00:36:33
>>3 すいませんでした。
dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
dev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
dev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
dev->SetRenderState( D3DRS_ZENABLE, TRUE );
for (int i = 0,n = 2;i < n;i++) {
dev->CreateTexture(SCREEN_WIDTH,SCREEN_HEIGHT,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&EffectTexture[i],NULL);
dev->CreateDepthStencilSurface(SCREEN_WIDTH,SCREEN_HEIGHT,D3DFMT_D16,D3DMULTISAMPLE_NONE,0,TRUE,&DepthStencil[i],NULL);
}
dev->GetRenderTarget(0, &stTarget);
dev->GetDepthStencilSurface(&stDepthStencil);
dev->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(8,8,8),1.0f,0);
dev->BeginScene();
6 :
デフォルトの名無しさん :2009/08/26(水) 00:38:21
LPDIRECT3DSURFACE9 surface0; EffectTexture[0]->GetSurfaceLevel(0, &surface0); dev->SetRenderTarget(0, surface0); surface0->Release(); dev->SetDepthStencilSurface(DepthStencil[0]); dev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DXCOLOR(1,1,1,1), 1, 0 ); D3DXMATRIX m; D3DXMatrixIdentity(&m); dev->SetTransform(D3DTS_WORLD, &m); dev->SetTexture(0,Texture); mesh->DrawSubset(0); LPDIRECT3DSURFACE9 surface1; EffectTexture[1]->GetSurfaceLevel(0, &surface1); dev->SetRenderTarget(0, surface1); surface1->Release(); dev->SetDepthStencilSurface(DepthStencil[1]); dev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DXCOLOR(1,1,1,1), 1, 0 ); dev->SetRenderTarget(0,stTarget); dev->SetDepthStencilSurface(stDepthStencil); effectShader->SetFloat("Alpha",0.5f); effectShader->SetTechnique("Mix"); effectShader->SetTexture("Tex0", EffectTexture[0]); effectShader->SetTexture("Tex1", EffectTexture[1]); // 矩形を描画(省略 dev->EndScene(); dev->Present( NULL, NULL, NULL, NULL );
7 :
デフォルトの名無しさん :2009/08/26(水) 00:39:58
>>5-6 が関係ありそうなソースになります。
よろしくお願いします。
省略したところでつまらない凡ミスしてて、それが原因だったらどうするの
surface0->Release(); surface1->Release(); かなー。
そもそも普通にDrawSubsetしてちゃんとモデルはバックバッファにかかれてんのか>
11 :
デフォルトの名無しさん :2009/08/26(水) 02:47:49
>>8 すいません。
effectShader->Begin(NULL,0);
effectShader->BeginPass(0);
// dev->CreateVertexBuffer(4 * sizeof(VERTEX),0,D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE2(1),D3DPOOL_MANAGED,&VertexBuffer,NULL);
LPDIRECT3DVERTEXBUFFER9 vertextBuffer = VertexBuffer;
dev->SetStreamSource(0,vertextBuffer,0,sizeof(VERTEX));
dev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE2(1));
VERTEX* pVertex;
vertextBuffer->Lock(0,4 * sizeof(VERTEX),(void**)&pVertex,0));
pVertex[0].fX = 0; pVertex[0].fY = 0;
pVertex[1].fX = SCREEN_WIDTH; pVertex[1].fY = SCREEN_HEIGHT;
pVertex[2].fX = 0; pVertex[2].fY = 0;
pVertex[3].fX = 1; pVertex[3].fY = 1;
12 :
デフォルトの名無しさん :2009/08/26(水) 02:48:58
pVertex[0].fTU0 = pVertex[0].fTU1 = 0; pVertex[0].fTV0 = pVertex[0].fTV1 = 0; pVertex[1].fTU0 = pVertex[1].fTU1 = 1; pVertex[1].fTV0 = pVertex[1].fTV1 = 0; pVertex[2].fTU0 = pVertex[2].fTU1 = 0; pVertex[2].fTV0 = pVertex[2].fTV1 = 1; pVertex[3].fTU0 = pVertex[3].fTU1 = 1; pVertex[3].fTV0 = pVertex[3].fTV1 = 1; for (int i = 0;i < 4;i++) { pVertex[i].fZ = 0; pVertex[i].rhw = 1; pVertex[i].diffuse = D3DXCOLOR(1,1,1,1); } vertextBuffer->Unlock(); dev->SetRenderState(D3DRS_ZENABLE, FALSE); dev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); dev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); dev->SetRenderState(D3DRS_ZENABLE, TRUE); dev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); effectShader->EndPass(); effectShader->End();
13 :
デフォルトの名無しさん :2009/08/26(水) 02:54:11
>>8 >>11-12 が矩形を描画する処理です
>>9 どうすればいいですか?
>>10 メッシュの極一部が異常に拡大されて一色のみ表示されているかのような状態でテクスチャに書き込まれている気がします
あるいはテクスチャに書き込まれてさえいないかも知れません
どちらも自信はありませんが
PIXで調べろという最も簡単かつ効果的なアドバイスが出ているのに、なぜガン無視するんだ
トゥーンシェーディングをしたいんですが あれって法線ベクトルをいくつかに分類して それぞれに色を割り当てれば良いんですか?
17 :
デフォルトの名無しさん :2009/08/26(水) 16:13:52
現在Directx9でスプライトを使って複数の2D画像の描画をしようとしているのですが、 マリオブラザーズのようなゲームで敵を描画するとき ステージごとに敵の配列を用意して /// Sprite->Begin( NULL ); 関数( 敵情報の配列 ); g_pSprite->End(); /// 関数に 位置座標・どの画像を使うか の変数等が入った構造体の配列を渡して、 関数内でfor文により要素全てを描画するという形で、一応描画はされるのですが 要素の二つ目以降がキーボードのキーを押したりマウスカーソルを動かすと描画されない時があり 点滅しているような状態になってしまいます。 ちなみにマウスカーソルに関するプログラムは一切書いていません。 イマイチ原因がわからないので何かアドバイス頂けませんか? 初心者なので根本的に可笑しいとかならば それを指摘してくださると助かります。
関数の説明って何処にあるの
どの関数?
>>17 根本的におかしいのは
「たった3行の疑似コードで原因が分かるわけないだろう」
ってこと
その僅か3行で指摘できるのは、SpriteのBeginを呼んでいるのに
Endはg_pSpriteのを呼んでいる点くらいだ。
>>20 原因それでした!
ばっちり直りました
ありがとうございます
22 :
デフォルトの名無しさん :2009/08/26(水) 19:22:04
>>3 >>14 すいませんでした
PIXで調べてみたらテクスチャ自体には描き込まれていたようで
矩形描画の処理に問題があったみたいです
ありがとうございました
23 :
17 :2009/08/26(水) 20:57:58
>>18-20 すみません、17のと少し違いますが左の引数が敵の座標とかが入った構造体の配列で
右の引数が描画する敵の数です。
VOID Draw(Enemy ene[] , int enenum){
for (int i=0; i<enenum; i++){
switch (ene[i].type){ /*どの敵かの変数です*/
case 0: /*敵1*/
ene[i]に使う画像とか設定
break;
case 1: /*敵2*/
ene[i]に使う画像とか設定
break;
}
g_pSprite->Draw( ・・・ ); /*ene[i]を描画*/
}
}
これを g_pSprite->Beginと g_pSprite->Endの間に呼び出すという具合ですが・・・
なぜかキーを押したりすると描画されない時があります。
>>20 g_pSpriteが正しく Spriteの方はただの記述ミスでした。
24 :
17 :2009/08/26(水) 21:02:40
左詰めになってしまい読み辛くて申し訳ない。
25 :
デフォルトの名無しさん :2009/08/26(水) 22:47:40
動画を再生するプログラムを作ろうとしているんですが、 音量調整をするにはどうすればいいですか?
データをいじるかデバイスを操作するか。
27 :
25 :2009/08/26(水) 23:07:34
すみません。説明不足でした プログラム実行中に上下ボタンなどで音量調整するには、どうすればいいですか?
だからデータをいじるかデバイスを操作するか。
29 :
17 :2009/08/26(水) 23:50:45
すみません自己解決しました。 どうもお騒がせしました。
>>28 初心者をいびるために来ているクズは死ねばいいのに。
誰も概論などききたかねーよ。コピペすりゃ動くコードを張れと行ってんだくうきよめ
>>31 関数に渡す構造体変数を宣言するときに static を付けるのを忘れてました・・・
>>30 われわれは質問者のママではない。
ろくなヒントも環境も説明もなしでエスパー発揮して
やさしく答えてくれるのを期待するならママに聞くべき。
>>32 staticを付けなければ動かない時点で、設計ミスだろう
地面との当たり判定と高さをとろうと思い 3点測量とベクトルを用いてどの面にいてどのぐらいの高さかを調べようと思ったのですが この方法だと穴の開いたポリゴンの当たり判定をとれません 穴の部分を識別するなんかいい方法ないですかね?
>>35 シミュレーションのような厳密な計算をするんでなければ、
通常当たり判定はポリゴン自体でなく、それを内接するいくつかの点をチェックすれば十分だ。
D3DXにあたり判定とるための関数があるが、あれじゃダメなのか?
38 :
35 :2009/08/27(木) 11:26:12
え? もしかしてレイを使う奴?
てか穴の開いたポリゴンって何?
えっ
ポリゴンってのは閉じた多角形のこと。 これには異論はないよな? それをふまえて穴の開いたポリゴンって何? ドーナッツポリゴンのこと言ってんの?
ポリゴンの面がない部分の事じゃねえの?
いやドーナツ状でしょ普通に考えて
じゃあこれでいいと思う if( ドーナッツに該当するポリゴンの当たり判定 && !穴に該当するポリゴンの当たり判定 ) return ドーナッツに該当するポリゴンとの距離;
だからその穴があるかどうかの判別法を聞いてんだろ35は
>>45 穴もポリゴンだろ
穴を凸ポリゴンとしてレイとの接触判定すればいい
ま、実際聞きたいことは別だろうし
スレ荒らしはここまでにするわ
ではでは
質問です ビルドが成功したプログラムをデバッグしてみると、FLOATに値を代入するところでエラーが発生しました(代入に関しては問題は無いと思ってください) 何も変更せずにもう一度デバッグしてみると、今度は問題なく動作しました。 エスパーさんがいたら、この原因を当ててください。お願いします。
スレ違い
>>34 いや動きはしますよ、なぜかキー入力をしたりすると描画処理が飛ばされるんです。
DirectX9.0c SDK December2004 無印探してるんだけどもう配布されてないの?
俺のHDDにある
そんな古いバージョン今更何に使うんだ……。
あの、ちょっとお聞きしたいんですけどDirectXってライブラリの事なんですか? 本とに初心者なんで変な質問ですみません。
帰れ。
前スレの985ですが 半透明の四角形は表示できたのですが それを使って画面全体をフェードアウトするために 画面全体に四角形を描画して徐々に透明度を下げてくと 画面がチラついてしまいます。どうすればいいのでしょうか。 透明にする処理を付けくわえたソースです HRESULT creatRect(int x,int y,int w,int h) { g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); //アルファブレンディングの有効化 g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //SRCの設定 g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);//DESTの設定 CUSTOMVERTEX vertices[] = { { x, y, 0.0f, 0.0f, D3DCOLOR_ARGB(RectAlpha,RectRGB[0][0],RectRGB[0][1],RectRGB[0][2]), }, // x, y, z, rhw, color { x+w, y, 0.0f, 0.0f, D3DCOLOR_ARGB(RectAlpha,RectRGB[1][0],RectRGB[1][1],RectRGB[1][2]), }, { x, y+h, 0.0f, 0.0f,D3DCOLOR_ARGB(RectAlpha,RectRGB[2][0],RectRGB[2][1],RectRGB[2][2]) , }, { x+w, y+h, 0.0f, 0.0f, D3DCOLOR_ARGB(RectAlpha,RectRGB[3][0],RectRGB[3][1],RectRGB[3][2]), }, }; if(g_pVB!=NULL)RELEASE(g_pVB); if( FAILED( g_pD3DDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ) { return E_FAIL; } VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); g_pVB->Unlock(); return S_OK; }
テクスチャへのレンダリングを行った後、描画対象テクスチャとサーフェイスの開放が上手くいきません。 ソースの概要は LPDIRECT3DTEXTURE9 pTextureScreen; // 描画先テクスチャ LPDIRECT3DSURFACE9 pSurfaceScreen; // 描画先テクスチャ用サーフェイス d3dDevice->CreateTexture(128 , 128 , 1 , D3DUSAGE_RENDERTARGET, BackDesc.Format, D3DPOOL_DEFAULT, &pTextureScreen, NULL); pTextureScreen->GetSurfaceLevel(0, &pSurfaceScreen); /* Zバッファも設定とかしてるがあまり関係無さそうなので関連処理略 */ /* テクスチャへ描画してメインのサーフェイルへ貼る処理も略 */ // サーフェイスの開放 if(pSurfaceScreen != NULL) { hr = pSurfaceScreen->Release(); pSurfaceScreen = NULL; } // テクスチャの開放 if(pTextureScreen != NULL) { hr = pTextureScreen->Release(); pTextureScreen = NULL; } このテクスチャとサーフェイスの開放処理時に、最初に実行した方の開放が 失敗します(S_OKでなくS_FAILが返る) 順番を入れ替えても最初の方が失敗します。 そして実行後デバッグ出力でおそらくここと思われるサイズのVRAM未開放領域の スタックトレースとかの文がずらずらと表示されます。 開放の仕方や条件があるのでしょうか? どなたか教えてくださいよろしくお願いします。
57 :
56 :2009/08/27(木) 21:59:36
S_FAILじゃなくS_FALSEの間違いでした。 現状ここで詰んでます。よろしくお願いします。
そもそも if(pSurfaceScreen != NULL) if(pTextureScreen != NULL) が全くの無意味。
59 :
56 :2009/08/28(金) 00:10:59
直接的な関連性は分かりませんが、別の箇所でテクスチャをファイルから二重に読み込んでいた 箇所を直したら開放漏れが無くなりました。 if(pSurfaceScreen != NULL) は実際は別関数になっており、アプリケーションの構造上何度も呼ばれる可能性があるのでこうなってます。
>>59 いつでも使える方法ではないが、
オレはゲームエンジン本体側とスクリプト側で、すべてのリソースのハンドルを保持して
必要なタイミングで全部開放するようなコードを2重に用意しているぞ。
2重になってるのは保険のためと、スクリプト側で使いまわすが
本体側からはその意図が掴めない場合があるためだな。
>>59 リファレンスカウンタ、もしくは参照カウンタ
ってググってみ
キャラクターのクラスでキャラクターの行動を乱数で決めてるんだが。 このクラスを配列で表示するとみんな同じ動きになるんだ。 どうやって乱数にすればいい?
乱数で変化とかいいから、まずそれぞれ個別に別の動きをさせられるようにしろ。
何が言いたいのかよく分からんが、スレ違いだと思うぞ
DirectMusicをNovember2008で使いたいのですが dmusici.hその他、DirectMusic関連のファイルを November2008に移すだけで使えるの? 何か問題が出る?
>>64 多分、乱数値が全部いっしょのもんしかとってこれてないんだろ
>>65 古いSDKからヘッダ持ってくればビルド可能だから問題は特にないが
DirectMusic自体MSから切られてる動かなくてもいちいち人に聞くなよって程度。
68 :
デフォルトの名無しさん :2009/08/29(土) 05:35:42
配布されているサンプルで、コンパイルは成功するが画面が立ち上がらないことがあるんだが 自分が使っているDirectX SDKのバージョンと配布者が使っているバージョンが違うと こういうことは起こる?
どのバージョンの何のサンプルが動かないか程度の情報を出すのすら面倒くさいのか?
70 :
デフォルトの名無しさん :2009/08/29(土) 07:29:29
>69 申し訳なかった サンプルはDirectX SDKのではなく個人のもの(○×さんのサイトの) シェーダ編 「多分必須!頂点変換の基本」のサンプル なんだが コンパイルは成功するが画面が立ち上がらない 自分が使ってるSDKは2007 August
個人の作ったものなら作った本人に聞けよ
72 :
デフォルトの名無しさん :2009/08/29(土) 08:01:06
>71 そうだなw 悪かった 本人さんに尋ねます
質問です。Direct3D9、XP、VS2005 を使っています。 ・D3DFMT_D24S8 で作ったステンシルバッファに好きな値を書き込むにはどうしたらいいのでしょうか? 具体的には、D3DFMT_D24S8 で作った、例えば 4*4 の深度ステンシルバッファがあります。(実際はもっと大きいです) このステンシルバッファに、 0x00 0x01 0x02 0x03 0x10 0x11 0x12 0x13 0x20 0x21 0x22 0x23 0x30 0x31 0x32 0x33 という感じに、自由に値を書き込みたいです。 D3DFMT_D24S8 はロックできず、調べても、D3DRS_STENCILREF で特定の値を書き込むまでしかできませんでした。 同じくロックできないレンダーターゲットの場合は GetRenderTargetData があったのですが、こちらは見つかりませんでした…。 ステンシルバッファの使い方は情報が多いのですが、作り方が…。 よろしくお願いします。
ステンシルバッファに対して CPUから直接値を書き込むという発想が間違っている。 DrawPrimitiveでポリゴンを書け。
75 :
73 :2009/08/29(土) 17:35:08
>>74 CPU から直で描く必要はないのですが、DrawPrimitive でポリゴンを描いたとしても、
ステンシルバッファに書き込まれる値は、D3DSTENCILOP で指定できる
「0 にする」 「1 加算する」 「特定の値(固定)にする」 などだけではなのでしょうか?
例えば色情報などを書き込めるなら、テクスチャに描画→DrawPrimitive で好きな値にできるのですが…。
ステンシルは色じゃねえ。ただのマスクだ。 0〜255までの整数しか書き込めねえ。
77 :
73 :2009/08/29(土) 19:36:38
>>76 色情報と言うのは、DrawPrimitive で出力される情報の例として書いただけです。
自由に指定できる値なら何でもいいです。
例えばテクスチャを作成し、ロックして好きな値を書き込み、
D3DFVF_XYZRHW なりを利用して DrawPrimitive で描画します。
例えば結果の R値(赤) なりアルファ値なりをステンシルバッファに出力できれば、つまり好きな値を書き込めるという意味です。
単に、ステンシルバッファに好きな値を書き込みたいだけなんです…。
むしろ何で普通の色用のバッファを使わないのか問い詰めたい Youシェーダに手を出しちゃいなYO!
>>77 そもそも何をしたいのかが明確じゃないから話がまとまらない。
ステンシルに自由に書きたいってのは手段であって目的ではないだろ。
手段を問わずとにかく好きな値を書き込みたいというだけなら、 1ピクセルサイズのポリゴンで1ピクセルずつ固定値で描画すればいいがな。
81 :
73 :2009/08/29(土) 19:56:23
>>78-79 おっしゃる通りでした。すみません。
普通にテクスチャに書き込んで、シェーダでごにょごにょ処理すれば上手くいきました。
やりたかったのは、マスク+αです。例えば、ステンシル値が 0 なら描画しない、255 なら描画する、に加えて
128 なら半透明その他色々な効果も持たせて描画したかったのです。
基本がマスクなのでステンシル、という考えから抜け出せていなかったようです。
解決です、ありがとうございました。
後学としてお聞きしたいのですが、元の質問のように、
ステンシルバッファに好きな値を書き込むのはできないのでしょうか?
>>80 さんの指摘のように、半ば無理やり書き込むしかないのでしょうか。
単に興味としての質問で、目的は特にないです。
DirectX10なら可能って聞いたような気がするような気がしないかもしれない
>>81 というか、ピクセルシェーダで複数のテクスチャを与えて、
そのうちひとつをマスクとして使うようにしたらステンシルバッファいらなくね?
ただしこの場合、テクスチャが複数あってもテクセルはひとつなので、
基本的にテクスチャとマスクの形を合わせないといけないんだけど。
なので、オレは逆にステンシルバッファの方を使ったことがない。
>>83 DrawPrimitiveの結果、ピクセル書き込みの成否によって
バッファの値を変化させるのが、ステンシルバッファの肝であって
これは、ピクセルシェーダで代替は出来ないだろう。
Zテストの結果等に左右される訳だから。
ステンシルテストでクリップされる場合は ピクセルシェーダーの処理自体がカットされるから たいへん高速に処理される。
Xファイルのボーンオフセット行列って 親子関係考慮する必要ないよな?
プログラムシェーダーって難しいの? 処理を軽くできないかなあと思って挑戦したいんだが・・・
実際にやってみたらいいだけの話だろ。
シェーダーを使えないガキの環境を気にかけるべきだ という風潮があるのでゲンナリする そして気にかけてやってもガキ相手で不毛なのでゲーム制作を辞めたくなる
>>89 商業じゃないんだったら、気に入らないのでやらない、でいいじゃないか。
商業だってあるていどでかい会社は切り捨ててますし
>>91 ゆとりのガキも乞食のくせして同じこと主張するよw
93 :
デフォルトの名無しさん :2009/08/30(日) 21:52:11
シェーダーってユーザーが使用のon/off切り替えられるようにするのって難しいの?
シェーダといっても何をやるかによるんだから、自分で組んで試せばいいだろ。
そもそも出来ない処理をどうするんだって話だよ。 ジオメトリインスタンシングとか未対応のハード用に ライブラリもシェーダーも全部用意するのかって話。
>>93 それってどうしてユーザーに選択させるの?
頂点シェーダのほうはハードにあるなし関係なくエミュっちまうからわかんねーぞ
>>95 やんなきゃいいじゃん
普通にそれっぽいテクスチャで描画
フィルタだったらかけなきゃいい
簡単に言ってくれるじゃないの……
ただ表示させるだけなら、切り替えなんていくらでも可能。 だけどそんな分かりきった結論に何の意味があるの?
>>97 やることによってモデルが10000個60FPSで出るけど
それをしないことによってハイエンドPCですら処理落ちするようになる。
ていうかそもそもジオメトリインスタンスが何かわかってねぇだろ。
>>100 エフェクト自体を切っちゃえばいいじゃんってこと
はぁ……、実際自分でやってから言えよ。
しっかしHLSLのスクリプトは管理しづらいな。 従来のAPI+エフェクトを表す列挙値のやり方と相性が悪すぎる。 みんなどうやって管理してるの?
全部の可能な組み合わせに対応しようと思わず、実際にゲームで使うものだけ作れば数は爆発しない。
>>102 は?やるかやらないかの話だけだろ?
他に問題があるなら言えよ
こんな簡単なこともできないなんてアフォじゃねーの?
止めて普通に描画(もしくは消す)もできない程度のアフォが俺に意見たれてんじゃねーよ
HLSLなんてプログラムで動的に作成して使う時にコンパイルすれば数なんて問題ないけどな
Xファイル表示させてるんだけど Meshの法線って単位ベクトルにしといたほうがいいよな? デフォだと単位ベクトルじゃないんだが一般的には単位ベクトルにすべきか?
>>107 単位ベクトルかどうかは吐き出すツールしだいだろ
>>108 そうなんだがなんで単位ベクトルじゃないんだ?
単にこちら側でNormalizeすれば済む話だけど
ツール側が単位ベクトルで吐き出さない理由って何があるんだ?
ツール製作者に聞けば良いんじゃね
ツールに何かしら都合がいいんじゃないの。わからんけど どうせ拡大縮小したらNormalizeせざるをえないわけで、やっとけやっとけ
DirectSoundで、IDirectSoundBuffer8::Play()を呼ぶと、エラー0x88890008が返ってきたりDS_OKが返ってきたりします。 MSDNのドキュメントに0x88890008が返ってくることは明記されていませんが、WASAPIのAUDCLNT_E_UNSUPPORTED_FORMATに相当するそうです。 0x88890008が返ってくるのはPlay()初回のみです。プロセスを再起動すると、やはり同じエラーが返ったりDS_OKが返ったりします。 88890008でググると、Relatek製サウンドカードで発生するようで、開発PCもRelatekです(ドライバは最新)。 今はとりあえず2回Play()して握りつぶしていますが、原因や根本的対策があれば教えてください
>>112 とりあえず、DirectSoundの初期化で使いもしないフラグを指定していないか調べる。
けどマジでツール制作者はどうしてるんだろうな MetasequoiaがどうしてるかとかPIXで監視しようかとしたらみれねーし
単位ベクトルにしたら、 正規化で精度が失われるからじゃねーの 何にしても気にするとこじゃないよ
>>113 レスありがとうございました。
DSBCAPS_CTRLVOLUME等全部消して22.05kHz/8bitでも発生してしまいました。
お手上げです。
>>116 まずOSを書け。Vista以降と以前でハードウェアの取り扱いがまったく違うぞ。
それからRealtek以外にサウンドデバイスが無いかどうかも書くこと。
複数あるならBIOSの設定が必要な場合がある。
>>117 そうでした。すみません。Windows Vista Home Edition SP1 x86とDirectX9(August 2007 SDK)です。
今思い出しましたが、MediaPlayerClassic+ffdshowで、起動直後に音声ファイルが無音再生されることがありました。これも再生しなおすと直ります。
出力先は、スピーカー・イアホンと、HDMIの2種類あります。どちらもRealtekです。あとMIDIデバイスですがMIDI Yokeが入っています。
BIOSにそんな設定があるとは知りませんでした。調べてみます。
>>118 Response 3ですね。貴重な情報ありがとうございます。
HDDバックアップして試してみます。
# 5年前から発生していたのか…
質問 D3DXMATRIXA16とD3DXMATRIXって混同して問題になったりしないの?
俺は一度混同した
A16のほうが精密なんだっけか? その程度の認識しかない
16byteアラインでSSEウマスだよ
D3DXIntersectって2番目で針を出す位置を決めて3番目でどの位置が針の末端かを書くの?
質問です。 DeferredShadingてなんでカメラ空間の法線を書き出しているんですか? ワールド空間の法線じゃだめなんですか? また半透明はなぜだめで、透明は大丈夫なんですか?
>>126 >>なんでカメラ空間の法線を書き出しているんですか?
質問がおかしいです。
ワールド空間を2Dテクスチャ内に収めることを考えれば自明だろ。
>>また半透明はなぜだめで、透明は大丈夫なんですか?
質問がおかしいです。
透明って100%透明てこと?なら見えないよね。
128 :
408 :2009/09/02(水) 19:54:41
DeferredShadingがよく理解できない俺のために 解説へのポインターを教えてください。
そんなに難しい話じゃないよ。 解説ならDeferredShadingでググって出てくる先で十分だ。 例えば、2つの光源+1つの球があるシーンを描画することを考えてみる。 今まで通りの方法だと、 やっぱ面倒くせえ、次の人続きよろしく
Deferred Renderingの方がいっぱいヒットすると思う。
物凄い初歩的な質問ですがどなたか教えてください。 DirectXでのモデルの各頂点の座標は同じ形であれば小さければ小さいほど処理が早いんでしょうか? 使うモデルと背景の縮尺はいくらでも変えれると思いますが、ポリゴンの形が計算の丸め誤差などで崩れてしまわない程度に 一番小さなスケールでやったほうがいいんでしょうか? またマップを作成する場合、物凄い広大なマップのデータを作ったとして、原点から遠く離れた場所の描画(ビュー変換など)ほど 処理が重くなったりするんでしょうか? もしそうであれば広大なマップではある程度原点から離れた場所にカメラが行くたびに、 マップ自体を原点へ戻すような処理をすべきなんでしょうか?
カメラ空間なら奥向きの法線を格納せず、1-R^2-G^2で求められるから?
しいて言うなら決まりはない。 好きなようにデータをサーフェイスに格納して好きなように使えばいい。 単にモデルのレンダリング時にシェーディングしなけりゃなんでも全部Deferred Renderingだ。 半透明が出来ない理由はやってみれば馬鹿でもすぐわかる。
DirectX11は10と違ってCaps見たいなのがあって 別にDirectX11対応のビデオカードじゃなくても動かすことができるらしいな これからは11の時代だぜひゃっほー
それって、またDirectX9以前みたいにビデオカードごとに 動くか動かないかを自力で判定しないといけないんじゃ。
イエス
何の為にD3D10でバッサリ切ったのか わからんよな。 ウロチョロしてんなよって感じ。
>>131 浮動小数点数 は、原点( 0.0000000 )から遠ざかると、精度が落ちてゆく。
重さより精度の問題。
同じく、あまり小さくしすぎると、アンダーフロー(桁落ち?)がおきる。
適度なスケールを使うのがよいと思う。
139 :
126 :2009/09/03(木) 05:44:52
>>127 >ワールド空間を2Dテクスチャ内に収めることを考えれば自明だろ。
言っている意味がよくわからないです。
テクスチャはただのバッファでは?空間はなんでもいいはずです。
gamewatchでKILLZONE2の記事を見ると、カメラ空間の法線を書き出しています。
自分はワールド座標とワールド空間の法線を書き出しあとでシェーディングしています。
ポイントライトには座標も必要だから。
でも、座標を書き出さないでライティングできているのはカメラ空間の法線が何かキーを
握っているのではと思うのですが、よくわかりません。
カメラ空間なら奥行きの法線はいらないのはわかるのですが、どうやってポイントライト
でライティングできるのか謎です。
>>131 とりあえず座標計算上(バーテックスシェーダ)では関係ない。138の言ってるように浮動小数点の精度が変わるだけ。
CPUと違ってGPUでは浮動小数点数の精度がぎりぎりまで削られてるのであまり信用しないように。
2Dテクスチャの大きさはこの時点ではまったく関係ない(この時点ではただのUV値に過ぎない)
ただし、テクセル計算(ピクセルシェーダ)では画面に占めるメッシュ描画の大きさで負荷が変わる。
>>139 >>ワールド空間を2Dテクスチャ内に収めることを考えれば自明だろ。
>言っている意味がよくわからないです。
>テクスチャはただのバッファでは?空間はなんでもいいはずです。
ワールド空間はXYZの3軸、一方2Dテクスチャ座標はXYの2軸。
ワールド座標の法線を書き込むというが、そのままじゃ軸が一個多いのはわかるだろ。
3Dから2Dへなんらかの射影変換が必要になる。
だからワールド空間座標をそのまま書き込めばいいという考えはおかしいと書いた。
>でも、座標を書き出さないでライティングできているのはカメラ空間の法線が何かキーを
>握っているのではと思うのですが、よくわかりません。
実際のところはわからないが、動的ライティングはカメラ空間(Proj座標系)ではやっていないんじゃないか?
Proj座標系ではいろいろ不都合があるし、
http://game.watch.impress.co.jp/img/gmw/docs/125/909/kil17_s.gif のスライドの図はView座標系のものだ。
つーかプロジェクション空間のzがあれば ピクセルの位置からワールド座標が逆算できるだろ。
>>142 x' = x / w
y' = y / w
z' = z / w
x'y'z'から、どうやってwを得るんだ?
別途wバッファがあるなら別だが。
プロジェクション空間ならw=1に射影されてんだろ。 プロジェクション行列の逆行列をピクセルごとに(ry
146 :
126 :2009/09/03(木) 20:54:55
>>141 >ワールド空間はXYZの3軸、一方2Dテクスチャ座標はXYの2軸。
>ワールド座標の法線を書き込むというが、そのままじゃ軸が一個多いのはわかるだろ。
何を言っているかホントによくわからないんですが。
2Dテクスチャには普通に射影変換して書き込みますよ。
その2Dのテクスチャの座標に何を書き込むかが問題なのではないですか?
ワールド空間の座標かカメラ空間の座標か。
ワールド空間の法線かカメラ空間の法線か。
実際自分は、ワールド空間の座標、法線を2Dテクスチャに格納し、
ポイントライティング、ディレクショナルライティングはできています。
でもわからないのは、なぜKILLZONE2は座標を書き込まずカメラ空間(View空間)
の法線だけでライティングできているのか?そこなんです。
ちなみに、Proj空間、射影座標系でライティングしているとは一言も言っていません。
カメラ空間(View空間、カメラ座標系)
です。
本当にDeferredShadingというか、座標系のことわかって言ってるんですか?
>>146 ビュー空間なのは
>>132 の言うように法線データの圧縮ができるから
ワールド座標を描かなくてもいい理由とかも、Game Programming Gems 6 の 5.7 を読むといいよ
>>146 全然わかっていないのは君だよ。
KILLZONE2の法線を収めたバッファ、あれは奥行きがあるだろ?
奥行きがあるってことは、透視変換された結果だ。
3Dであるカメラ空間(View座標系)から透視変換されて、
2Dである(実際は3Dだが)射影空間(Proj座標系)になって
その上で、テクスチャに落とされているんだ。
>Proj空間、射影座標系でライティングしているとは一言も言っていません。
>カメラ空間(View空間、カメラ座標系) です。
だから、これらは全部認識が誤ってるんだよ。
149 :
148 :2009/09/03(木) 21:56:05
いや、わかった。 勘違いしていたのは、俺だったかも。 すまんすまん。
>>147 法線データの圧縮が出来るのは
ベクトルの長さが1であるからであって
ビュー空間云々は関係ないと思うが
151 :
147 :2009/09/03(木) 23:40:15
>>150 そう思うだろうけど、実はz=±√(1-x^2-y^2) だから z の正負がわからない
ビュー空間なら zが[0 - 1] に限定される
152 :
131 :2009/09/04(金) 01:26:49
>>138 >>140 回答ありがとうございます。
精度の問題ですか、とあるFPSの現象を思い出しました。
(スナイパーライフルで遠距離の人間の顔を見ると目玉が顔のポリゴンを飛び出して
見えてゾンビみたいになってしまってる)
あまり原点から距離が離れてしまうところに細かい構造のオブジェクトを描かない方が良いということですね。
その辺りの調整可能な作りにすることにします。
Z値がバッファに書かれていればXY=ピクセル座標、W=1でXYZWが求まるから それにカメラの逆行列をかけてWで割ればワールド座標に戻る。
>>152 それは全く別の問題。
普通に作る分にはfloatの精度なんて、あんまり気にしなくていいよ。
>>153 検算したら、確かにビュー座標に逆変換出来た。
射影空間では、wは不定(ビューのz)だから変換は出来ないけど
ビュー以前なら、w=1だから変換出来るんだな。目から鱗。
156 :
デフォルトの名無しさん :2009/09/04(金) 02:38:07
メッシュの描画に使用した、行列をかけた変換後のメッシュ頂点情報って取得できるんですか? もし可能であればご教授ください。
157 :
126 :2009/09/04(金) 04:51:12
>147 >150 なるほど!ありがとうございます!! 自分も目から鱗です
質問です。 ピクセルシェーダで void psShadowDiffuseForFloor( float4 Color : COLOR0 ,float4 DepthFromCamera : TEXCOORD0 ,out float4 outColor : COLOR0 ,out float outDepth : DEPTH0 ) こんな感じで、カラーと深度値を同時に出力すると、どうにも画面が乱れてしまいます。 どちらか一方だけであれば問題がおきないのですが、カラーと深度値は同時にoutしてはダメなのでしょうか? 色々ぐぐって、同時に使っている例を探そうとしてみたのですが、1つも見つからないので、やってはいけない方法なのかと心配になりまして
>>156 やろうと思えば出来なくはないが、というレベル。
普通は代わりに、IDirect3DDevice9::ProcessVerticesを使う。
もっと言えば、こんなメソッド使うより自前でやった方が
いろいろと楽。
160 :
158 :2009/09/04(金) 15:27:32
失礼しました。 どうも原因は別にあったようです。
質問です。 深度バッファシャドウで、サイトなどでよく o.Pos = mul(Pos, mWVP); //float4 o.Depth = outPos; //float4 と頂点シェーダでPOSをテクスチャとしてもっておき、ピクセルシェーダで in.Depth.z / in.Depth.w; として深度値としているのを見かけます。 一方、マイクロソフトのサンプルでは o.Pos = mul(Pos, mWVP); //float4 o.Depth = outPos.zw; //float2 と頂点シェーダでPOSのzwをテクスチャとしてもっておき、ピクセルシェーダで in.Depth.x / in.Depth.y; としているようです。 そこで両方試したところ、結果が異なっているようです。 何故異なるのか、どちらが正しいのかがよくわかりません。 どなたか分かるかたいらっしゃいますでしょうか。 よろしくお願いします。
>>161 両方とも同じ
結果が異なるとしたら別の要因
163 :
158 :2009/09/04(金) 16:09:47
すいません。名前抜けてました。 別の要因ですか・・・。 デバッグDLLでも再現するので何かしら「ちゃんとミス」っぽいですね。 また質問をまとめなおします。
164 :
158 :2009/09/04(金) 16:14:36
ライティングによる陰を描画しつつ、深度値にバイアスをかけるプログラマブルシェーダで困っています。 うまくいくパターンと、いかないパターンがあるのですが プログラム的には同じ結果を引き起こすつもりなのに、なぜ差が生まれるのかがわかりません。相談にのっていただけると幸いです。 ■うまくいかないパターン ■Depthがfloat4である。最後の深度計算がDepth.z / Depth.wである void vs( float4 Pos : POSITION ,float3 Normal : NORMAL0 ,out float4 outPos : POSITION ,out float4 outColor : COLOR0 ,out float4 outDepth : TEXCOORD0 ) { float3 L = vLightDir.xyz; outPos = mul(Pos, mWVP); outDepth = outPos; outColor = max(0, dot(Normal, L)) + vLightDir.w; outColor.w = 1; } void ps( float4 Color : COLOR0 ,float4 Depth : TEXCOORD0 ,out float4 outColor : COLOR0 ,out float outDepth : DEPTH ) { outColor = Color; outDepth = (Depth.z + 0.01f) / Depth.w; }
165 :
158 :2009/09/04(金) 16:15:21
■うまくいくパターン ■Depthがfloat2である。DepthにはPos.zwが入る。最後の深度計算がDepth.x / Depth.yである void vs( float4 Pos : POSITION ,float3 Normal : NORMAL0 ,out float4 outPos : POSITION ,out float4 outColor : COLOR0 ,out float2 outDepth : TEXCOORD0 ) { float3 L = vLightDir.xyz; outPos = mul(Pos, mWVP); outDepth.xy = outPos.zw; outColor = max(0, dot(Normal, L)) + vLightDir.w; outColor.w = 1; } void ps( float4 Color : COLOR0 ,float2 Depth : TEXCOORD0 ,out float4 outColor : COLOR0 ,out float outDepth : DEPTH ) { outColor = Color; outDepth = (Depth.x + 0.01f) / Depth.y; }
また、陰のカラー値を頂点シェーダから受け取らず、 固定値としてoutColor = 1; とした場合もうまくいきます。 具体的にどう「うまくいかない」のかと言いますと、 何も条件がかわっていない描画を続けているのに、(バイアスをかけず、カラーのみを出力するピクセルシェーダで描画している)他オブジェクトとの前後関係がチラチラと変化します。 挙動的には「メモリーリークなどでどこか壊したのでは?」というような内容です。 Debug.DLLで動かしてみましたが、現象はかわりませんでした。 また、特にエラーなども出力されませんでした。 以上です。 何か「お前こんなことすれば当たり前じゃん」といった部分があれば、ご指摘いただけると幸いです。
167 :
158 :2009/09/04(金) 16:28:16
追加情報です。 Depthがfloat4である場合に、下記のような挙動が見られました。 成功 (1)Depth.x と Depth.y に、それぞれPos.z、Pos.wをいれて、ピクセルシェーダで割り算をする。 (2)Depth.y と Depth.z に、それぞれPos.z、Pos.wをいれて、ピクセルシェーダで割り算をする。 (3)Depth.x と Depth.w に、それぞれPos.z、Pos.wをいれて、ピクセルシェーダで割り算をする。 (4)Depth.y と Depth.w に、それぞれPos.z、Pos.wをいれて、ピクセルシェーダで割り算をする。 ダメ (5)Depth.z と Depth.w に、それぞれPos.z、Pos.wをいれて、ピクセルシェーダで割り算をする。 どうしても、zとwを使った時だけ異常になるようです。 (とはいうものの、他の成功例も「成功したように見える」だけで、実際狂っている可能性はありますが)
168 :
158 :2009/09/04(金) 16:52:51
追加情報です。
まず、
>>167 は、Depthの「値を入れていない要素」については0を代入していました。
(5)のパターンであっても、Depth.x と Depth.y にPos.zの値を入れておくと、正常に動作するようです。
最初、割り算の子の部分を Depth.zにしていなかったのかと思って再確認しましたが、間違い無く
z / w になっていました。
TEXCOORDは、それぞれの要素xyzw が個別に補間されるものだと思っていたのですが…。
169 :
158 :2009/09/04(金) 17:31:42
しつこいようですが、追加情報です。 (5)の場合ですが、 outColor = Color; outColor.y *= Depth.x; outDepth = (Depth.z + 0.01) / Depth.w; と、ほぼ無意味でもいい(完全に無意味だと、コンパイラが省略してしまうのでダメ)のでDepth.xを参照すると、正常化することがわかりました。 コンパイラの吐いたアセンブラ風シェーダのほうを読んでみましたが、 Depth.xに参照したからといって、特にDepth計算まわりの挙動が変わっていることはありませんでした。 (コンパイラのバグというのを期待?していたのですが) 何なんだろうこれ・・・
170 :
158 :2009/09/04(金) 17:51:16
どうも、一番の原因は TEXCOORD0 を使っていることのようです。 TEXCOORD1 に変えると、さまざまな不具合が解消されます。 確かに今描画しようとしているものには、UVが存在します。 ですが今回のシェーダでの描画では必要ない(ライトの陰影だけ書きだしたい)ので、頂点シェーダの引数としても受け取っていません。 このあたりが何か悪さをするのでしょうか? 試しに無意味でもと思って , float2 Tex : TEXCOORD0 を頂点シェーダの引数に加えた(使わない)ところ、また少し違った「おかしな現象」が置きました。 意味がわからない・・・
171 :
158 :2009/09/04(金) 17:52:05
失礼しました。
>>170 の最後3行は無視してください。これはこちらのミスでした。
他のPCもしくはリファレンスラスタライザの結果をみて 環境の不具合か自分のミスか切り分けるしかなさそうだね。 俺の場合、こういうときはハードの不具合と思いがちだったけど、 実際は自分のミスだったことが多かった気がする。
>>172 アドバイスありがとうございます。
REFでも結果同じですね。
どうも色々いじった感じですと、TEXCOORD0のZとWに不具合がある気がします。
元のメッシュがUVを使っている場合、DrawSubsetの段階でfloat2なテクスチャ座標を使うとFVFなどで内部的に宣言されるわけですよね。
この時に頂点シェーダ>ピクセルシェーダ間でTEXCOORD0のZやWを使ってしまって良いものなのでしょうか。
今改めて考えてみると、頂点データの流し込みの時点では存在しないTEXCOORD1などを、
頂点シェーダ>ピクセルシェーダ時に新設してるのは合法なのでしょうか?
(今更合法でないといわれても困ってしまいますがw)
ん、すいません。REFでも結果が同じというのはいったん撤回です。 月曜日にもう一度再現含めて試してみます。
Xファイルでボーンアニメーションやってるんですが 頂点はいい具合に動くんですが光源計算がうまく行きません。 法線も頂点と同様に行列かける以外違いってあるんですか?
正規化しないと駄目だった希ガス
>頂点シェーダ>ピクセルシェーダ時に新設してるのは合法なのでしょうか? 合法って・・別に法律に触れたりしないぞ・・・。 まぁ実際問題普通に頂点シェーダーで作ったデータをピクセルシェーダーに送るので CPU→VSとVS→PSはまったく関係ないとおもっとけ。
178 :
175 :2009/09/06(日) 07:17:22
正規化はちゃんとしてあるんだけどなぁ 変換する行列に平行移動の成分があったらダメとか Xファイルの法線は特別とかそういうのはないですよね?
>>177 >合法って・・別に法律に触れたりしないぞ・・・。
お前の馬鹿さ加減に爆笑した
コーヒー返せ
>>178 スキンメッシュ変換しおわった後に正規化だよ?
181 :
175 :2009/09/06(日) 09:50:39
VS_OUTPUT Out = (VS_OUTPUT)0; //●頂点の変換と出力 float4 pos; pos = mul(In.Position, BoneMat[ In.Bone[0] ]) * In.Weight[0] / 100.0f; pos += mul(In.Position, BoneMat[ In.Bone[1] ]) * In.Weight[1] / 100.0f; pos += mul(In.Position, BoneMat[ In.Bone[2] ]) * In.Weight[2] / 100.0f; pos = mul(pos, WVPMat); Out.Position = pos; //●Diffuseの出力 float3 nor; nor = mul(In.Normal.xyz, (float3x3)BoneMat[ In.Bone[0] ]) * In.Weight[0] / 100.0f; nor += mul(In.Normal.xyz, (float3x3)BoneMat[ In.Bone[1] ]) * In.Weight[1] / 100.0f; nor += mul(In.Normal.xyz, (float3x3)BoneMat[ In.Bone[2] ]) * In.Weight[2] / 100.0f; //頂点法線のワールド変換 float3 vec =mul(normalize(nor), (float3x3)WMat); //頂点法線と光の逆ベクトルとの内積を求める float d = dot(vec, lightdirection.xyz); //内積の結果と光の色を乗算する Out.Diffuse.rgb = saturate(d * lightcolor.rgb + lightambient.rgb); Out.Diffuse.a = 1.0f; //●UVの出力 Out.TextureCoord0 = In.TextureCoord0; Out.TextureToon = In.TextureCoord0; return Out;
182 :
175 :2009/09/06(日) 09:52:46
↑はバーテックスシェーダーの中身です アニメーション自体は正常に動作しており、 またメッシュの法線は正規化されております
ワールドもっていってから正規化じゃね?(いや、テキトーだけどw)
>変換する行列に平行移動の成分があったらダメ 法線の変換なら駄目だろ、3x3の回転行列にしてみ
185 :
175 :2009/09/06(日) 12:29:06
>>184 float3x3にする事で移動成分ってなくならないんですか?
ワールドのライティングをしてるって事は シェーダー変数のライトディレクションはワールドの値だよね? 後は、ライトディレクションの向きは反対じゃないよね? (内積取れる方向って意味)
ウエイトを100.0fで割ってる意味が激しく分らん シェーダー定数に100倍したウエイト値を入れてるの?
ワールド変換行列に拡縮入ってたらワールド変換してから正規化しないと駄目だな
俺はワールドライトをローカル変換する派だから なんかキモイ処理に見えたw
>>189 頂点はワールドに変換しなきゃいけないのに
ライトだけローカルにもってきてるお前のがレアじゃね?
接空間のことじゃね? まあ頂点ライティングでそれを使うのはレアだとは思う
なるほどバンプマップはたしかにそうだな それとは別に法線は法線でワールドにもってきてるわw俺のソースw
193 :
175 :2009/09/06(日) 13:46:17
>>186 あ すいませんコメントが間違ってました
ここがマイナスでもプラスでもライティングは失敗します
>>187 言われてみれば最初から100で割っておけば余計な手間が省けますね
>>188 やってみたらうまくいきました
ワールド空間座標に縮小はないんですがなんでだったんだろう…。
>>193 あるんだろ多分
そんなのロードされるモデル次第じゃね?
>言われてみれば最初から100で割っておけば余計な手間が省けますね えっ・・・
スキニングウエイトを%単位にしているのか?
・単位をcmにしている。 ・固定小数点と三角関数テーブルで高速化、という10年前の知識を紹介してる5年前の本を読んだ
組み込みではまだ有効なテクです
組み込みでは有効だがWindowsでは無駄な処理だろう・・ そもそもそれなら乗算除算じゃなくてビットシフトしろっていう。
PSPとかDSは組み込みに含まれるの?
201 :
158 :2009/09/07(月) 13:28:13
>>158 です。
問題の出た環境で再度、REFとそうでない状況でテストしてみたところ、
・REFでは正しく描画される
・REFでないとおかしくなる
のを確認しました。
もうこうなってくると、ドライバが悪いんだ!と思い、最新版にしてみましたが状況は変わりませんでした。
現象が起こる環境は
Intel(R) G33/G31 Express Chipset Family
です。
GF9600などでは再現しませんでした。
オンボだしなぁ…。
TEXCOORDは1を使うようにするかぁ…。
というのが今の結論です。
何かツッコミどころがあればご意見いただけると幸いです。
サウンドノベルのようなものではなく、とにかく高速に文字列がスクロールなどし、表示されなければならないような ゲームの場合、文字列を描画するにはどういった方法が用いられるのでしょうか? 動的テクスチャの方法でしょうか?それとももっといい方法があるのでしょうか?
>>202 ないよ
やることわかってんじゃん
さっさとやれ
巻物を模したオブジェクトを作って、そこに全ての文字列を貼っておく
206 :
デフォルトの名無しさん :2009/09/08(火) 00:35:25
DxLib3.0誕生
D3DXColorNegativeって負のカラーを生成するって書いてあるけど 負のカラーとはなんですか?
>>207 なんでヘルプ読まないの?
This function returns the negative color value by subtracting 1.0 from the color components of the D3DXCOLOR structure, as shown in the following example.
pOut->r = 1.0f - pC->r;
あーあれか ショッキングな演出か
板ポリで2Dゲームを作ろうと思っているんですが座標は3D座標で管理したいので、 頂点フォーマットをD3DFVF_XYZにして正射影でスクリーンに写して完全に表示を2Dにしたいのですが、 どうもサイズの調整がうまくいかなく読み込む画像自体のサイズとスクリーンに表示されるサイズが一致しません。 調整の仕方は画像の縦幅をスクリーン座標→ワールド座標へ変換した値でポリゴンの頂点を決めてやっています。 が、これだと変に画像が歪んで小さくなっちゃいます。 D3DFVF_XYZRHWは使いたくないので悩んでいます、どうすればいいでしょうか?
>>210 おお! オレもちょうど同じ疑問に行き当たってる。
もっとも、2D画像に関してはスクリーン座標を使う形で対処できてはいるが。
まだZ値の管理をぜんぜんやってないんだな。(だから描画順で完全制御してる)
○×に似たようなのがあった気がする
>>210 WorldMatrix * ViewMatrix * ProjMatrix * ViewportMatrix = WVPV
スクリーン座標系の表示したい座標 = X = [ x, y, z, 1 ] ※zはviewportのzmin, zmaxの中間値
ワールド座標系の表示したい座標 = X' = [ x', y', z', 1 ]
X * WVPV^-1 = X'
このX'使ってる?
214 :
213 :2009/09/09(水) 16:06:37
っていうかD3DXVec3Unproject()使えばいいか これの結果と自前の結果、比較すればいいんじゃねーの
よく分からん 馬鹿でも分かるように説明してよ
ViewMatrixは単位行列 ProjectionMatrixは正射影行列 WorldMatrixはキャラクターの座標で World*View*Projectionでうつらなかったっけ
Windows7だと RECT rect; SetRect(&rect,0,0,640,480); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); SetRect(&rect,0,0,rect.right-rect.left,rect.bottom-rect.top); で640,480にならないのですが どうしてですか?
DirectXと何の関係もない
>>217 あたりまえじゃねーか。自分の書いたコードをよく見てみろ。
0123456789
>>220 Windows7ってタイトルバーとかウィンドウの枠が無くなるんだっけ?
オレぁWindows7でもちゃんとクライアントサイズ640x480でウィンドウ作れてるが
WS_OVERLAPPEDWINDOWのフラグをCreateWindowと同じにしてなかった。 同じにしたら作れた
225 :
デフォルトの名無しさん :2009/09/10(木) 07:25:47
SDKのアイコンが青い椎茸からXNAみたいな今風に変わってる
サンプル山盛り追加だな
しかし大半がDirectX11用なので起動すらしない
やっと11きたか
KB971644のリンクも今の段階では機能していないな。 Win7だとDX11用サンプルもある程度動くんだろう。
すみません、Web上でいくらかDirectXの勉強をし始めたのですが、 いまいち要領を得ないので、本を一冊買ってそれで勉強しようと思うんですが、 おすすめの良書とかないでしょうか?
directx逆引き大辞典 てにはいらんと思うけど
前回のSDKからか、 fx2.0のコードがコンパイル通らなくなったんだよね 今回の入れるか迷う
>>231 付属のHelpを地道に覚えるのお勧め
遠いようで近道だったり
他にwebや参考書を使う場合でも、あくまでHelpのここが
分からないけどどういうことなのかな?っ手感じで
調べる時に使うのがいいと思う
そうするとHelpを中心としたDirectX脳内マップが出来上がります
235 :
233 :2009/09/10(木) 16:49:49
直ってた 杞憂だったみたい
>>232 絶版のようですね・・・
>>234 Helpですか。わかりました、ヘルプ覚える所からまた始めてみようと思います。
>>231 何をやりたいかが明確なら他に参考書も挙げやすいかも
KB971644+FW190.38betaでとりあえずサンプルが起動まではする様になった
241 :
デフォルトの名無しさん :2009/09/11(金) 13:51:36
無料C++総合環境DirectXゲームプログラミング ってサイトを参考にシューティングゲーム
つくってたんですが、
http://lacc.biz/cpp/cpp11.htmこのページの {
int joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(((joypad_state& PAD_INPUT_A) !=0)&&(f_player_gun_flag==FALSE))
{
f_player_gun_flag=TRUE;
*p_player_gun_position_x= player_position_x ;
*p_player_gun_position_y= player_position_y ;
}
if(f_player_gun_flag==TRUE) *p_player_gun_position_y-=GUN_SPEED;
if(*p_player_gun_position_y<1) f_player_gun_flag=FALSE;
return f_player_gun_flag;
}
弾を飛ばすって関数、(ちなみにサイトのコピペです)
A を押すと弾が出るように記述されてると思うんですけど、コンパイル成功して
動かして、A押しても弾がでないです。
というかA以外にB,Cとかにしても動きませんでした。
実験で、プレイヤーは→←↑↓で上下左右に動かすのには成功してるので、
弾を撃つコマンドをAではなく、↑に設定してみると、弾がでました。
解決方法を教えてください。
これDXライブラリ?
>>241 >PAD_INPUT_A // A(1)ボタンチェックマスク(Zキー)
まずはZキーを押してみる
245 :
デフォルトの名無しさん :2009/09/11(金) 15:43:30
>>244 Z押したら出ました・・・
Aって書いてあっても。
対応キーが違うなんて、なんという罠。
とにかくありがとうございました!
>>245 JOY PADのAボタンという意味で、
キーボードのAキーという意味ではない
常に起動しているDirectX 3Dで描画しているアプリに、文字や絵などを割り込み絵画させたいのですが、どのような方法があるでしょうか? (DxtoryのFPSや録画ステータスが表示されているように、DirectX描画に割り込み描画する方法が知りたいです)
>>247 それが自分の書いたアプリかそうでないかで話は全然変わってくる。
249 :
247 :2009/09/11(金) 17:24:17
自分が書いたアプリではないです。ソースコードも不明です
>>248
無理に決まってんだろカス
モンスターハンターフロンティでモンスターのHPをクライアント内に描画するチートあったけどあんな感じのがやりたいんだろうな 俺もやりたい
普通に考えて、COMコーポネントにラッパーかますか フック使うんじゃねーの
253 :
デフォルトの名無しさん :2009/09/11(金) 21:26:06
VisualStdio2008で、 三角ボタンの隣のソリューション設定で、 debugからreleaseに切り替えたら、 debugで3Dオブジェクトが描画されてたのに、 releaseでされなくなった こんなのこってあるんのだろうか・・・ #ifdef _DEBUG とかはつかっていないんだがOTL
どうせ関数の戻り値を確認してねーんだろ しろカス
目の前で起きてるんなら、あるんじゃね
>>253 まあ大抵は変数の初期化忘れなわけだが。
258 :
デフォルトの名無しさん :2009/09/11(金) 22:22:34
>>256 そうなのか初心者でdebugとreleaseの違いが
パスくらいしか思い浮かばなくてOTL
たとえばどんなときに起こるでしょう?
259 :
デフォルトの名無しさん :2009/09/11(金) 22:23:44
>>257 なるほど!
急いでチェックしてみまする
デフォルトではreleaseとdebugでは違うプリプロセッサが付いてるよ
261 :
デフォルトの名無しさん :2009/09/11(金) 22:46:40
>>257 本当にありがとう!
まさに変数の初期化忘れだった!
リリースもーどだと、
変数は初期化しないと何が入っているかわからない
こんな初歩的なことを忘れていた
レス付けてくれた方、ありがとう
UTF-8の文字列処理が多量にあるプログラムをするのですが、 シフトJISとUnicodeは普通にCライブラリがありますが、UTF-8はそういうのあるんでしょうか?
>>262 なぜその質問をここで聞くの? もっとしかるべきサイトやスレがあるでしょっ!
UTF-8とUTF16は同じ文字セットでエンコード方式が違うだけだから機械的に変換できるのよ。
計算の仕方は調べてね。
って、アンタに言ったんじゃないわよ! さっさと行きなさいよ!
そもそもUTF8もUNICODEの一種な訳だが
モデルを作るときにパーツを分けてモデルを作れるけど 普通に読み込むと全部同時によみこむよなあ パーツだけ別に読み込んで操作って出来ないのかなあ?
出来る出来ないもなにも、自分がやるかやらないかでしかないんだが、 お前は操り人形か何かなのか?
D3DXLoadMesh〜()に出来るか出来ないかを聞いてるに決まってるだろうが お前がスレタイを百遍読み直せ
決まってねぇよどこのバカだよ
>>268 決まってないなら他に何があるか書いてみろよ
考えたことなかったが たぶんメッシュアニメーションを参考にしてみるのといいのかこういうの・・・
xファイルの操作法とかっしょ 俺は知らん
SDKを今さっきインストールしたらDirect 2Dのd2d1.hとかのファイルがありませんでした どうやって入手するのが良いのですか?
正式リリースまで待つのが良いです。 どうせDirectX11対応のビデオカードまだねえし。
DirectX11ってDx10や9と比べて使い心地どうよ?
>>267 DirectXを使うこととD3DXに頼り切ることは全くの別
勝手に決めつけるな
昔このスレで、メッシュやらアニメーションコントローラーについて色々教えてもらったけど、 そこで言われた一言 「自作したほうがいい」 正しかった。 (でも、D3DXをいじくりまわして理論を学ぶのは有用だと思う)
ゆとりの知ったかぶりが痛い D3DXで出来ないと一言書けば、用意するモデルデータを分割するだけだし それ前提で自作する事も考える プログラムできれば当たり前の事だ まったく何も解らないのに、詳しそうに見えるように書いて悦にはいってるんじゃねーよ
>>265 ,267,277
質問する側がそんな態度でどうする。お里が知れるというものだ。
じゃあ俺のお里を行ってみろ。 生まれは海無し県だ。 学校は青山にあったが今はない。
>>280 >生まれは海無し県だ。
埼玉県民かよw
神奈川県民よりランク下になった感想はどうなんだよこのクズw
誤: じゃあ俺のお里を行ってみろ。 正: じゃあ俺のお里に来てみろ。
>>277 だったら最初からD3DXで出来るかどうか聞けば良かったのに、
他人に責任転嫁とはどれだけ甘やかされて育ったんだろう?
答えとしては出来るけど、細かい機能を実装していくなら自前で組んだ方が楽という話。
粘着必死すぎ モデルデータ分割するだけで実現出来ることの為に自作しろとかアホだろw
>>285 >D3DXで出来ないと一言書けば、用意するモデルデータを分割するだけだし
>それ前提で自作する事も考える
スプライト厨がいなくなったと思ったら何この状況
Xファイル厨も同根だからなあ 根絶やしにせねばいつまでも初心者がはびこったままだ
まあな でもパーツだけ動かすってのはちょっと興味が湧いたな Xファイルから特定のメッシュを取り出すようなのを作ってみるとするか
どうせDrawSubsetで描画していくんだから、全体読み込んだって別に問題ないような気がするんだが。
Xファイルほど、色々なツールでサポートされ、仕様がわかりやすいフォーマットはないだろ? 勉強用には最適だよ。 だが、理解したら自前フォーマットにしとけ。 アニメーション大量に入れたら、ロードに10秒とか20秒とかかかるんだぜ。 自前フォーマットにしたら1秒かからなかったわ。 いくら拡張性やらに気を使われているとはいえ、遅すぎだぞXファイル。
自作の人は自前でモデラソフトの保存用プラグイン書くの?
そういう時もあるし、Xファイルのようなわかりやすいフォーマットで出力してから、変換かける場合もある
seleneにも独自形式あるし、 ゲームデータのリッパーとかもソース公開されてるから 書けなくは無い
自前フォーマットってどうやんの? 圧縮とかするの?
圧縮はしないな。 例えば頂点データをmemcpyでいっきにVRAM上にコピーできるようにする。 これだけでも速度が圧倒的に違う。 Xファイルは、ファイルフォーマットエラーに対処するためかデータをかなり細かく読んでる。 自前なら「エラーがないことを前提に」高速化が可能なわけさね
ほー ちょっとやってみるかな でもPシェーダーとかやったけど 何にも利用してねえなあ・・・
>>297 俺は今作ってるゲームで、
モデルデータはXファイル
アニメーションデータは自前にして、ID3DXAnimationControllerを作成
ってやってる。
アニメデータが大量にあると、Xファイルの読み込みが超遅かったんでな。
モデルデータの読み込み速度は0.1〜0.3秒くらいなので不満はない。
>>298 追記。
ID3DXAnimationControllerは、ちょっと複雑なことやるとバグ満載なんで
次回作ではぜってー使わないって心に決めてる。
もう理屈はわかったので、頼る必要もないしな。
>>298 それは行列でアニメーションデータを並べているせいでは?
きちんと位置、回転、スケールでキーフレームを作っておけばデータがそんなにでかくなることはない。
読み方云々以前にデータそのものを見直した方がいい。
ID3DXAnimationControllerを変な風に使おうとして動作不良起こさせてるんじゃないの。
正しく使うのが大変で、自分で作った方がマシ。
あれよりヒエラルキーのほうがめんどい なんで最初から積んでないんだ?
ロード時間が長いのは別にXファイルの形式のせいじゃなくね? DXライブラリ(だっけ?)で読んでいるからじゃないかな。 他の3Dフォーマットと比べても、さして特殊な形式とは思わないし(古いけど)。 ちなみにXファイルはバイナリ圧縮形式もあるよ。 今は色々なツールでサポートされているんだな。俺の頃はどの3Dモデラも 中途半端な扱いしかしてなくて、速攻で候補から外されちゃったよ。
Xファイル使ってる人って、ロード後に境界級のサイズも計算するんでしょ? ゲームの起動時に毎回それやるって、アホらしくならない?
じゃあ何かに記録するようにして最初だけ計算しては?
・・・と、そうやって追加情報を加えていけば結局自前フォーマットに行き着く
そもそも境界級など存在しない。 存在しないものは計算しようがない。
xファイルやd3dx.h使ってる奴をおとしめて、俺tueeeしてるだけ
古いDirectXのサンプルにファーみたいなやつを実装したのがあったと思うんだけど あれってテクスチャ重ねてるだけなの?
サンプルなんだからソースを確認しろよ
そんなことよりラブプラスやろうず
ラブプラスの悪魔
きちがいのフリしなくても元から頭おかしかったろ
>>300 ああ、データは膨大だよ。
BVHからとり込んだりして、かなり動きを細かく作ってるからね
これでも一応無意味な中間データの削除とかはしてるんだぜ
D3DXIntersectのレイって二つの一番近い面しか判定されないの?
間違った 2つの面があった場合近い方の面しか判定されないの?
カーソルがウィンドウの端でとまるんだけどfpsみたいに無限に右に動かしたりできないの?
>>318 おめえ円周率はいくつって習った?
言ってみろ
>>318 ちゃんと、DirectInputなりで「相対値でのマウス移動量」を取得すると、FPSみたいなこともできるぞ。
絶対値でやろうとすると、デスクトップからマウス飛び出ちゃったら困るだろ?
ダイレクトインプット使わなくても、毎フレーム マウスを中心に移動させてやればいいだろ
ウィンドウモードだとどうするの? 毎フレーム戻そうが、画面外でボタン押したら入力とられちゃうよ
D3DXFontでMSゴシックを指定して文字を出したら どんなに文字を大きくしてもアンチエイリアスがかかりません どうやったらいいですか?
>>326 クリッピングすればいいだけだろ
WinAPIの基本的なことはDirectXやる前に少しぐらい知っとけ
>>327 フォントが不適切ではないか。オプション(使い方)が間違ってないかを中心に再調査する。
わかった よく見るとアンチエイリアスはかかってた でもアンチエイリアスの質が悪すぎて、かかってないように見える PROOF_QUALITYでも同じだった 仕方ないから2倍のサイズに表示してリニアフィルタで縮小して使うか でもフォントのサイズを2倍にしても大きさって2倍にならないんだよな くそったれ
マウスカーソルを真ん中に戻すのは、ネガティブアクセルの原因になるからやめた方がいい。 DirectInputを使う場合も、バッファを十分に用意しておかないとネガティブアクセルが発生する。 XP以降ならRawInputが一番いい。 SDKのヘルプにRawInputでマウスを扱う説明あるから、それを参考にするといいかと。
>>330 D3DXCreateFontだったかでフォントの大きさを指定するときに
高さを基準に大きさを指定できるだろ
だからフォントサイズがどうとか関係ない
ポリゴンの平面に沿うように物を配置したいんだけど どうすればいいんでしょうか? 法線の傾きとって回せばいいのかなあと思いましたが その方法がわかりませんご教授願います
>>333 物とは3次元に属するので、3つの基本軸を持つとする。
物のローカル座標系でみたとき、+x方向をR、+y方向をS、+z方向をTとする。
そして、R、S、Tは長さが1であり、互いに直交する。※正規直交基底
ポリゴンの平面に沿うように物を配置する為には、
・R軸は変わらない。
・S軸は平面の法線と平行
・T軸はR軸と平面の法線の外積
となっていればいい。
それぞれ新しいRSTをR'S'T'、
回転行列をMとすると、
[R'] [R]
[S']=M[S]
[T'] [T]
これをMについて解くと、
[R']
M=[S'] * [R][S][T]
[T']
このMをワールド空間の変換行列にすればいい。
>>・R軸は変わらない。 >>・S軸は平面の法線と平行 >>・T軸はR軸と平面の法線の外積 ごめんごめん、これちょっと違うわ。 新しいR軸は、S軸と直交する範囲で、任意に決めてね、
○×に似たような記事があった気がする
>>335 ウィ
方向性が見えたんでなんとかしてみます
338 :
デフォルトの名無しさん :2009/09/21(月) 07:42:59
任意の3D座標(x,y,z)をカメラから見た2D座標(x,y)に変換するにはどうすれば良いですか?
>>338 ワールド変換 → ビュー変換 → 射影変換 → ビューポート変換
ワールド変換でワールド座標(ワールド座標)
ビュー変換でカメラ座標(カメラのローカル座標)
射影変換で同次クリップ空間(xyが-1〜1になるzは0〜1)
ビューポート変換でスクリーン座標(スクリーンの座標になる)
340 :
デフォルトの名無しさん :2009/09/21(月) 07:51:14
スクリーン座標の数値を取り出せる関数はありますか?
341 :
デフォルトの名無しさん :2009/09/21(月) 07:55:39
画像を動かせるすごい関数はありますか?
342 :
デフォルトの名無しさん :2009/09/21(月) 07:56:53
DirectXというのは画像表示できるんですか?
343 :
デフォルトの名無しさん :2009/09/21(月) 07:59:52
DirectXとC言語ではどちらの方が優秀なのでしょうか? ご教授お願いいたします。
>>340 D3DXVec3Projectこれかな?
>>345 Microsoft DirectX は Windows プラットフォームでハイパフォーマンス、ハイクオリティ グラフィックスを実現するための業界最高のテクノロジーです
DirectSoundの勉強中なのですが、セカンダリバッファの作成で躓いています DirectSoundデバイスの作成、協調レベルの設定、DSBUFFERDESC構造体の設定、WAVEFORMATEX構造体の設定は問題ないと思うのですが、 IDirectSoundBuffer *ptmpBuf=NULL; if(SUCCEEDED(pDirectSound->CreateSoundBuffer(&m_DSBD, &ptmpBuf, NULL))) { ptmpBuf->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*)pDirectSoundBuffer); ptmpBuf->Release(); } ここのCreateSoundBufferが成功せず、QueryInterfaceが実行されていないようです あちこち調べたのですが、原因がサッパリ分からず困り果てています 問題点をご指摘してくださると、大変助かります
よくわからんけど、NULLアドレス渡しても大丈夫なの?
scanf("%d", &n)のnのように、&ptmpBufの値から何かをするのではなく、CreateSoundBufferによって作られたデータを格納するのがptmpBufなので 恐らく問題は無いと思います。第3引数は、NULLでなければいけないようです
>>347 動くコードをコピーしろよ
そんなので悩むのは駄目
自分で書いて動かないなんてはプロでも結構アリガチ
そんなのどうせライブラリ作った人間しかわからないんだからはじめから動くコードを入れるしかない
お前のやりかただと一生かかってもゲームなんて完成しない
>>347 というかまずCreateSoundBufferが返してるエラーコードを調べるべきでは・・・
>>347 まず350が言ってるように他人が書いてチェックされた(できればDirectX公式の)サンプルコードをそのままビルドして確かめること。
サンプルが存在しないような世界ならともかくDirectXならいくらでもサンプルがある。
それからDirectX関係のAPIはありとあらゆるところでエラーが返ってくる可能性があるので、
SUCCESSEDチェックではなくてちゃんとエラーコードを取得できるようなコードを書くこと。
この2つをやらないと、いつまで経っても能率も品質も上がらないよ。
エラーコードを調べたところ、DSERR_INVALIDPARAMが返されているようでした 無効なパラメータが関数に渡されたようです つまりm_DSBDの値がおかしい可能性があるようですが、これはmsdnのリファレンスを丸々写しただけなのでこのままでは問題箇所が分かりません とりあえず、ちゃんと動くサンプルプログラムを探して、そこから何が悪かったのかを調べてみることにします
354 :
347 :2009/09/21(月) 17:27:04
すいません、原因が分かりました DSBUFFERDESCの設定がおかしかったようです m_DSBD.dwSize = sizeof(DSBUFFERDESC); と書くところを m_DSBD.dwSize = sizeof(DSCBUFFERDESC); と書いていました コンパイルは通ってしまっただけにこんな単純なミスで5時間以上悩んでいたのが悔しいっ…ビクビク 皆さん、助言どうもありがとうございました
>>354 DirectXに限らず、プログラム動かしててエラーが発生したら、
まずはエラーメッセージどおりに物事を考えること。
最初からDSERR_INVALIDPARAMというエラー内容にしたがって
引数がどうなってるかチェックしたらそんなに時間食わなかったはず。
プログラムは思ったとおりに動かない。
書いたとおりに動く。
DirectSoundとXAudio2ってどちらを学ぶべきですか?
>>356 断然XAudio2。
実装が圧倒的に簡単な上に、VistaだとどうせDirectSoundアクセラレーションが効かないので。
XAudio2はすばらしいのになぜXInputはあんなにガッカリなのか
XAudioはハードウェアに依存しないけどXinputはハードが対応しないと使えないからでは
いやそれはそうなんだけどなんで古いハード丸ごと切り捨て。 さらに現状はXBOX360のコントローラーしか対応パッドないとか論外すぎるだろ。
>>359 いや、だからなぜそういう仕様にしてしまったのか、ってことだろ
まあXBOX360コントローラーをPC用の標準コントローラー的な位置づけにしたいってとこだと思うけど
あれ10ボタン縛りだけどどうなんかね。 ゲームによってはあまったボタンをショートカットにふれたりして便利なんだが。
direct3d9でD3DXSPRITEを作成し、D3DXMatrixScalingをつかって行列を作成し テクスチャを張り付けて、縮小をしてるんですが xのみ縮小すると問題なくx軸方向に縮小できる、同様にy軸のみ縮小でも問題ありません ですがxとyを同時に縮小しようとするとなぜか画像が暗くなります(小さければ小さいほど暗くなる) 拡大では全く問題ありません、解決策をしってる方がいたら教えていただけると助かります
D3DXSpriteなんか使うなよ 普通に変換済みの頂点で描画したほうが楽だろ
>>362 昔PS2でキーボードマニアというゲームのUSB接続の専コンがあってだな
そもそもD3DXSPRITEは列挙子であって作成するものではない。
自分が使っているインタフェイスの名前すら確認しないような馬鹿は、 そもそもプログラムには向いていない。
>>363 通常の3Dメッシュを描画する場合なら、
トランスフォーム行列を適用した結果、頂点法線の長さが変わって
暗くなるというのはある。
ただし、D3DXSpriteは基本的にライティングをOFFにするので
これは起こりえないようだ。
ところで、Begin()に渡すD3DXSPRITEは、どう設定している?
>>367-368 そう言うな。ここは初心者板だし、
なかなか面白い事象じゃないか。
370 :
363 :2009/09/22(火) 10:25:42
>>364 ふつうに4角形ポリゴン作ってテクスチャはっつけたらできました
ありがとうー
>>369 どっかで見たソースほぼそのまま
pSprite->Begin(0);
pSprite->Draw( pTex, NULL, NULL, NULL, 0xffffffff );
pSprite->End();
だったと思うけどもう書き換えちゃたんでわからないです
あ、pSpriteはID3DXSpriteです
無理だな 描画ステータスに内部で何が設定されてるのかわからんし spriteなんて使うなってのは原因不明な事象にぶち当たったときに全く検討が付かないからだけどな 固定シェーダもこういうの多い 自分で研究しろw
ぐぐったらあったw D3DXSprite使ってるようなのにこれはきついなw 以下、BBXから転載 >いろいろ作業していましたが、 >どうやら、MIPMAPの設定で縮小時にMIPMAPの切り替えで、 >約半分の設定(縮小)の時にMIPMAPの小さいときの設定がされていなく、 >フィルターでLINEARを指定しているので、 >設定なしの(黒)のものとのフィルター処理をしていて、だんだん >暗くなっていってしまっていたようです。
: | ェェ ェェ |: :
SetviewPortって四角限定? 円とか三角は無理?
>SetviewPort そもそもそんな物はない
他の使いたいなあ
d3dx10_41.dllがないと表示されて実行できないのですが何をインストールすればよいのでしょうか?
自分の開発環境に合わせて再コンパイルすればエラーは出なくなるよ。
>>381 ここはプログラミングのスレなので、ゲーマー用のスレは別だぞと言っておく。
その上で、d3dx10_41.dllは特定のバージョンのDirectX(年数回配信される)にあるD3DXライブラリのDLLだ。
それくらいのバージョンだったら普通に2009年以降の最新のDirectX再頒布パッケージをインストールすればいいと思うよ。
だめだったらファイル名でぐぐってどのバージョンに入ってるか調べてくれ。
わかりました。最新のDirectX再頒布パッケージをインストールしてみます。 因みにゲームではなく、マルペケつくろーどっとコムというサイトで、 DirectX10版高速フォント表示サンプルが動かなかったんです。
ポリゴンの外周部分にアンチエイリアスかけるのってどうやんの?
D3D7ぐらいなら、エッジアンチエイリアスあっただろうから それ使えば?
糞レス入りました
2速に入ってるな
エッジアンチはソートが必要だから 使い物にならないとおもうんだが。
何不思議発言してんの? アンチエイリアス使う時点で後ろの絵が必要に決まってんだろw
ここで華麗にDirectXのバージョンをアンチエイジング
>>390 MSAAとかFSAAとエッジアンチの違い分かってないだろ・・・
シェーダーで描画しようとしている色が透明のときは 処理が無駄なので飛ばしたいんですけど どうやればいいですか?
return FLOAT4(0,0,0,0); これじゃ駄目なの?
396 :
デフォルトの名無しさん :2009/09/24(木) 07:41:20
>>396 肩の力抜けよ、知らないことはこれから知っていけばいい
じゃあ、D3D9でエッジアンチエイリアスをやるとして、
1、普通に描画
2、レンダターゲットをテクスチャにコピー
3、ワイヤーフレームでもう一回描画
このとき、シェーダでマルチサンプリング
これでどうか?
一回コピーが入るのがウザいが、D3D9では仕方ない
>>393 clip(-1)だろ常考
普通にMSAA使うのじゃダメなのか? RenderState設定するだけだし一番簡単だとおもうんだが。 つかD3D9ってエッジアンチできたっけ?
Xファイル読み込んで表示してみたのですが、 2004年December以前とその後以降でライティングの結果が変わりました 2004以前だとグーローシェーディングが滑らかにかかってるのが それよりはフラットに近い感じになっています。 D3DXComputeNormalsの結果が違うような気がするのですが、そういうことってあるでしょうか?
ありまくる っていうかD3DXはバグが多いから気をつけろ
え?D3DXって仕様変更よくあるの?
最近だとD3DXComputeTangentとかな
面がどのくらい傾いてるかをしらべたいんだけどどうすればいいんでしょうか? ポリゴンの法線の成分と垂直なベクトルの成分の内角を計算する・・・のかなあ
傾いてるっていうにはどっか基準があんだろ? atan2でいいじゃん
D3DXは、いろいろ変更するのはいいんだけど
それをアナウンスしないんだよなぁ。
例えば、しれっとフラグメントリンカ削除したりさ。
いや別にいらないんだけどさ、
What's Newにぐらい書いてくれてもいいのに。
>>405 そのとおり、普通は面の法線と比較対象ベクトルの内積を使う。
双方が正規化されていれば、内積の結果はcosθになり、
ぜんぜん傾いていないなら+1に、90度傾いていれば0に、
真逆を向いていれば-1になり、わかりやすい。
D3DXならD3DXPlaneDotNormalを使う。
>>407 え?今フラグメントリンカないの?
DX10で削除されたのは知ってるけど
立方体を描画するとして、それをどの位置にあっても同じ大きさ(厳密は違うけど)に するのは可能でしょうか? 例えば1mの立方体をどの位置に描画しても、視点から3mくらいの大きさに描画したいのです。 ただしパースは合ってるようにしたいのです。
正射影
>>411 D3DXMatrixOrthoRHを使ってみたのですが、CAD図とか
昔あった斜め上視点みたいになってしまいました。
これとはちょっと違うのです。なにかよい例えがあれば
よいのですが。すいません。
よくわからんけど、立方体との位置が常に3mになるように カメラを動かせばいいんじゃね
中心座標だけあわせて3mの位置に描画しか方法ないよな
論理的に不可能なことをやろうとしたってできるわけがない。
ビルボートの事を言ってる・・・わけでもなさそうだし
立方体が同じ大きさになるように拡大して描画すればいい 手作業で
遠くに行って小さくなる分拡大しながら表示すればいいんじゃね?
>>411 >>414 >>415 >>416 >>417 早々にありがとうございます。本屋に行ってました。
3DMaxとかCGソフトの本を眺め見ましたが例えば位置とか回転とかを
コントロールする図形を描画するには、どうすればよろしいでしょうか?
ソフトを触ったことがないのですがCGソフトでこれらの図形は、変更したい
立方体の位置に関わらず大きさが一定になるっている気がします。
常に3mの位置にあるように描画したいのではなく 常に画面に対し10%のサイズで描画したいってことかな
>>420 表現が適切ではありませんでした。すいません。
おっしゃる通り、常に画面(できればモニターの解像度)に対して
一定の大きさに描画したいのです。テクスチャーに描画して
2D描画してみましたが当然奥行きに対する向きが合っていません。
物体が移動したらカメラも移動させればいいだろ。
>>410 要するに、ここにアイテムがあるとかの記号的な描画をしたいということでいいのか?
Direct3Dにおいては基本的にポリゴンは1個ずつ描画していくものなので、あまり複雑に考える必要はないよ。
普通にカメラ空間でどの位置(XYZ)になるかを計算した上で、Z値を調整すればいいだけ。
パースを正しくというのは意味不明。カメラ空間上正しく描画されるのも正しいし、
何か特定の距離のパースを拡大・縮小されるのだって正しいさ。
>>410 (ビュー空間でのターゲットの Z 距離)/(3.0f)で
スケーリングすればいいんじゃないの?
要するに、カメラ座標に変換する前に、 カメラ座標原点と、立方体基準点の距離をとってから スケーリング行列挟めばいいんとちゃうの?
ぬおう、リロードしてへんかった。
混乱してしまいました。説明が下手なのと考えすぎというよりは無知っぷりで
無理に説明しようとしたためです。出直してきます。
MAYA PLEという体験版っぽいのを入れてみました。大きさを変更したい時に
表示される矢印があります。これは向きがありかすが、大きさを変更したい
オブジェクトがどの位置にあっても(正規化された?)大きさを維持しています。
これができれば自分のやりたいことは満たします。どこかにサンプルプログラムが
あればそこから原理がわかるのですが見当たりません。
また変なことを言っている気がします。すいません。
>>422 >>423 >>424 >>425 >>426 を参考に出直します。
ま、ちょっと難しい問題なんで、 このスレには荷が重いんすよ。 スケーリングすりゃいいのはわかった。 で、そのスケーリング係数はどうやって求めるの?的な。
>>429 だからさー
挑発して情報引き出すにしても、もうちょいマシな挑発はできないの?
スケーリングの係数なんて、MSDN見りゃ丸わかりなもん(あらゆる関数の計算式が公開されてるんだぜ?)、とっとと見に行けよ
そんなもん書いてねえよ
あれだろ?全ての変換行列掛けた後にオブジェクトのZ値だけ固定の値を入れてから普通に描画でできるじゃん
すいません俺ら無能なんで他所で聞いてもらえると助かります
だから、 ビルボードでのカメラ方向への回転の代わりに、 カメラとの距離の逆比例でのスケーリングに置き換えるだけじゃねーの。 もしかしたらもっとシンプルな方法があるかも知れんが。
オブジェクトそのものが拡大縮小されても それに合わせてオブジェクト全体が表示されるように ビュー行列を設定したいということでは?
もうほっとこうぜ。 相手するの馬鹿らしくなってきた。
そーな…
>>431 ビュー行列も、プロジェクション行列も式が公開されてますが・・・
439 :
429 :2009/09/27(日) 21:10:37
>>434 そういうお茶を濁したような
カスみたいな情報はいらないんだって。
だから、このスレの連中には荷が重いって言ってるっす。
実装できないとかwww
442 :
デフォルトの名無しさん :2009/09/27(日) 22:45:12
DirectXがダウンロード出来なくなっちまったが、どうしたの?
443 :
429 :2009/09/27(日) 22:45:56
俺は検討と検証は済んでる。 ハッタリご苦労さまっす。
検討と検証ご苦労様です
検討と検証が済んでるならあとはそのとおりやるだけです。 がんばってください。
>>439 いや、なんかメガネを自分のおでこにかけてるのに「メガネはどこだ!教えろ!」って言ってる状態だから、滑稽でしかないんだよ
もしかしてView行列とか、Projection行列の意味を知らないの?
また、基礎を知らない奴が出たのか? そういう奴が現れるたびに俺は何度でもこのコピペを貼るぞ 初心者の質問のほとんどがオブジェクト空間からスクリーン座標への変換の仕方を 知らないことからはじまると俺は思っている(よければテンプレに入れてほしい) 昔は宇治社中とかあったけどなw とりあえず変換ごとに座標系がどの空間に移るか考えたほうがいいぞ ワールド変換 → ビュー変換 → 射影変換 → ビューポート変換 ワールド変換でワールド座標(ワールド座標) ビュー変換でカメラ座標(カメラのローカル座標) 射影変換で同次クリップ空間(xyが-1〜1になるzは0〜1) ビューポート変換でスクリーン座標(スクリーンの座標になる)
>>446 何かがわかってるというなら、もっと具体的に書いてくださいよ。
例えば、単純に大きさを合わせると言うけど、何と何の何の大きさを合わせるつもりですか?
そこまですら考えてないんでしょ。だからハッタリと言うんですよ。
質問者の意図としてはもうワールドとか関係ないじゃん だから使うカメラが全然別なんだよ 単純にただそれだけでいけると思うよ @ワールド変換 →A ビュー変換 → BC射影変換ビューポート変換 だから ビュー変換で使うカメラ行列がいまのカメラの行列を使っちゃダメ 射影変換とびゅーぽーとも描画したいとこにあわせるからこれも違うもん用意することになると思う ってことでワールドにいる状態の物体を描画する方法で描画をするなら ABCを違うもんにしないとダメってすぐにわかるな また、もし、仮想空間に別の世界を用意してその描画結果を反映したいなら @ABCすべて違うものにしなくてはいけないってただそんだけだろ?
具体的にコードを書いてやらず説教するおまえらが好きだ もっとやれ
きもちわるい お前に好かれたくねえよホモ野郎
ここまで説明されてわからんとか素敵です
コード出るまで粘る気っぽいからスルーだな。
2chで調べ物をしたい時は「教えてください」って書いても なかなか教えてもらえない。 そういう時は、知ったかぶり風に間違ったことを自信満々に書く。 そうすると、ものすごい勢いでツッコミを入れてもらえる。 これを思い出したな
コード書いても座標変換のラッシュで意味を理解してないとなんもかんもわからんと思うけどな
457 :
429 :2009/09/28(月) 08:27:30
例えば、スクリーン座標系でメッシュを常に一定の幅(v_width_s)で表示したいとする。 大きさを合わせる対象とする為に、メッシュに合った 位置(v_pos_w)と半径(v_radius_w)を持った境界球を考える。 @v_pos_wを座標変換し、スクリーン座標系でのZ値(v_pos_s.z)を得る。 Aスクリーン座標系で2点[0,0,v_pos_s.z,1]、[0+v_width_s,0,v_pos_s.z,1]を定義し 逆行列で座標変換して、ワールド座標系での2点(w_pos0,w_pos1)を得る。 Bl=w_pos1-wpos0、メッシュをl方向にlength(l)/v_radius_w分スケーリングする。 以上、終わり
視野 ▲視野角 物体 視野角の半分の角度(直角三角形を作る)と物体の幅から、 三角関数で視野から物体までの適正距離を求めて、カメラをその距離に置く。 というのが自分的なやり方。
そもそも視野角が分かっていれば、余計な変換をかけなくても、 描画幅から距離を求めることも、距離から描画幅を求めることもできる。 アスペクト比と解像度は掛けるなり割るなりはするけど。
物体の大きさを変える為にカメラの位置を調節する方法は、 パースが狂うし、Zバッファの不整合が起きそうでお勧めしない。
この場合、どうせ距離は無視、パースはそれなりなんだから、 Z値を破壊しても問題ないんじゃね? どうせレンダリングは最後のタイミングにやらんといかんでしょ。
え、Z値無視でいいの? てっきり「壁の裏のアイテム」にでるマーカーは、壁に遮られるのかと思ったよ Z値無視なら2D描画でいいじゃんw
そもそも質問者が何をやりたいのかって部分が不透明だから混乱するんだよ。 本当に3Dでやる必要があるのかとか他との前後関係はどうするのかとか どういう意図で行いたい演出なのかとかが待ったく不明。
就活用に無駄に3Dで組みたい
>>460 観光で写真を撮るときに、被写体に対してカメラの位置を調整するだろ。
それと同じだ。
>>465 >例えば1mの立方体をどの位置に描画しても、視点から3mくらいの大きさに描画したいのです。
>ただしパースは合ってるようにしたいのです。
物体のサイズは固定にしたいが、距離に応じたパースはかけたいってことでしょ。
カメラとの距離を一定にしたら、常に同じパースがかかってることになる。
条件通りで、何の問題もない。
逆ケースが必要なら距離と幅から視野角を求めればいい。
条件通りの条件って何? あと、「○○だから問題ない」の○○が抜けてない? 逆ケースって何? ちょっと日本語が不自由過ぎやしないか
ちょっと前のレスすら読めない文盲には理解できない。
>ソフトを触ったことがないのですがCGソフトでこれらの図形は、変更したい
>立方体の位置に関わらず大きさが一定になるっている気がします。
そもそもこの挙動はターゲットに合わせてカメラをスナップしているんだから、
カメラ自体の位置を調整して条件通りなんだよ。
>>466 の方が日本語が不自由だろう。
カメラとのターゲットの距離を一定にするなんて誰が言ったんだ?
>MAYA PLEという体験版っぽいのを入れてみました。大きさを変更したい時に
>表示される矢印があります。これは向きがありかすが、大きさを変更したい
>オブジェクトがどの位置にあっても(正規化された?)大きさを維持しています。
これを読むと、カメラ空間内のオブジェクトの位置は一定ではないように見えるが?
大体、常にカメラとターゲットが一定なら、こんな質問は端から出ないわ。
>>カメラとのターゲットの距離を一定にするなんて誰が言ったんだ?
簡単にまとめるとこういうことだ。
メッシュを表示する時に、矢印オブジェクトを一定の大きさで表示したい。
↓
矢印オブジェクトとカメラとの距離を一定にすれば、
常に同じ大きさで表示されるでしょ。(
>>458 の方法)
↓
でも、メッシュの映像に違うカメラから撮った映像を合成する形になって、
パースや深度値に不整合が起きるでしょ。
例えば普通の3Dマップがあって、その中に宝箱を複数配置 そしてその宝箱がどこからでも一定の大きさに見える とかそういうのをやりたいんじゃないの? 遠くにあっても見えなくならないように
宝箱の上に3Dの矢印を出したい。 ただし宝箱が遠くても近くても、同じ大きさの矢印で表示したい。 2Dでは「壁の裏の宝箱の上に出ている矢印が、壁のせいで見えない」を再現できないのでダメ。
2Dでやっても3Dでやっても周囲のものより巨大に表示したら 見えないはずのものが見えることには変わりない気がするんだが そういうのやる場合って現在の視点からそれが見えるかどうか判定して 見えてたらそこになんらかのマークを2Dで書き込むとかってやるんじゃないか?
うるさいな。
>419 の話からずれてきてるぞ
もう質問者本人がいないんだから、伸ばすなよw
スクリーンショットを撮ってUPすればわかる。撮り方がわからないのか?
矢印キーで視点移動するプログラムつくったんだけど 移動中にそのウィンドウの上でカーソルを適当に動かすと描画がかくつく・・・ ウィンドウの外で動かした場合はなにもない これは何が原因なんだ?
ウインドウ内でカーソルを動かすと ウインドウにメッセージが飛んできて メッセージハンドラが動くから、それかな? でもそんなに重いとは思えないが・・
個人情報を、犯罪者をも含むような輩の中へ出すわけには行かない
頂点バッファを自分で確保して球を作りたいんですけど 良いアルゴリズムはありませんか
>>483 D3DXCreateSphereで作らせるか、ツールで作ってメッシュデータを読み込ませる。
確かに、2Dで円を描かせる簡単さに比べて2Dで球に内接するメッシュデータを作るのは簡単ではないわなぁ。
>>483 ポリゴンで球を作る場合によく使う方法は次の2種類
・緯度経度で分割(北極と南極だけ三角形になり中間は四角の面を張る)
・正二十面体などから再帰的に分割する
後者は指向性のないメッシュを構築できるが、ポリゴン数の細かい制御ができないのと
低ポリゴンだと期待したほど滑らかにならないのが欠点。
他には、緯度毎に経度を半分ずらすとか、リンゴの皮向きみたいにStrip1本で
繋げるとか色々あるけど、自分で実装して比べてみるのがいいかと。
金属の質感出したいんですけど どうすればいいんでしょ・・・?
環境マッピング クック・トランスの鏡面反射モデル 異方性ライティング 好きなのを選べ
489 :
デフォルトの名無しさん :2009/10/01(木) 19:57:23
理論はいいからコードで示してくれませんか?
うわあまた出た
>>489 背伸びすんなよw
自分にできることを一歩一歩こなしていけ
どうせ普通のライティングもよくわかってねぇんだろw
つーかその言葉でぐぐれば確実にソース晒してるサイトぐらい見つかるだろ
そんな時間かけたら就職活動に役立たないない お前らみたいに趣味でやってんじゃねーんだ
つ 「テクスチャ」
つーか実装の方じゃなくね? 要は鈍く光ってりゃ金属に見えるわけだ その方向で弄れば? ところでプラスチックの微妙に半透明な感じどーやって再現すっぺ・・・
シェーダーが始まった何年も前に論文とか読んだけど 車輪の再発明頑張ってください
毎度毎度の事ながらカオスだなあ つーかスプライト厨が帰ってきたのか?
質問なんですがFPSで人のオブジェクトが飛ぶ時 手足が実際のように回転したり叩き付けられてはね回ったりするのですが あれはどのようにしているのでしょうか? 読み込んだ時のメッシュコンテナに回転やら重力等の力をかけてるのか 元からそういう動きをアニメーションとして実装しているものなのか・・・ デッドスペースのような物ではバラバラになるオブジェクトを別に用意して 切り替えていると聞きましたが・・・ やっぱり後者で単純に済ましてるのかなあ・・・?
ラグドール物理でぐぐれ 端的に言うと、物理シム
やっぱそうなんすか・・・ わかりましたなんとかしてみます
Bulletにそのもののサンプルが入ってるから、コピペして使えばいい
立体映像を作成するためにカメラ2台設置してウィンドウを半分に分けて右側に右目映像、左側に左目映像 とやりたいのですがウィンドウを半分にわけるにはどうすればよいのでしょうか?
ウィンドウを分けなくても、ビューポートを左半分、右半分に設定すればいいだけじゃないか?
>>504 よければ詳しく教えていただけないでしょうか?
SetViewportで、ウインドウ全体ではなく左半分(もしくは右半分)を指定するんだ。
難しく考えなくても、まずはウインドウ半分にバックバッファの内容を描画すればいい。 そうしたら残った半分にもう一回描けばいいだけのことに気がつくから。
回答ありがとうございます なんとかやってみたいと思います
509 :
デフォルトの名無しさん :2009/10/02(金) 16:43:39
ブレンディングの設定で、RGBを加算、Aを乗算で 2つのテクスチャを重ねあわせる方法ってどうやるのでしょうか?? 教えてください
>>509 固定パイプラインの場合、2とおりある。
1.先にレンダーターゲットに1枚目を普通に書き込んでから2枚目を加算する。
2.レンダーターゲットに1枚目のテクスチャを指定して2枚目を加算で描画する。
[2]の方が高速だが、1枚目のテクスチャは破壊される。
固定パイプラインでも1枚目と2枚目の演算を別々に設定できるようなら(試してないんで分からない)
同時に書き込むことも可能だと思う。ただZオーダーによる優先順には注意。
シェーダーを使うなら、そのようなプログラムを書け。以上。
いやマルチテクスチャブレンディングの指定が知りたいんだろ、常考
512 :
デフォルトの名無しさん :2009/10/02(金) 18:13:31
>>510 レスありがとうございます。
用途としては、画一的なブレンディング用のグラデーションと
普通に用意した画像をブレンドさせたいと思ってます。
普通に用意した画像はほとんどがpngで、画像の縁が透明処理されていますので
ただの加算だと、その部分にまで影響が来てしまいます。
1の方法で描画しました。
>>511 その通りです。
エスパーさせてしまいすみません。
[ステージ0] D3DTSS_COLOROP D3DTOP_ADD D3DTSS_COLORARG1 D3DTA_CURRENT D3DTSS_COLORARG2 D3DTA_TEXTURE D3DTSS_ALPHAOP D3DTOP_MODULATE D3DTSS_ALPHAARG1 D3DTA_CURRENT D3DTSS_ALPHAARG2 D3DTA_TEXTURE [ステージ1] D3DTSS_COLOROP D3DTOP_SELECTARG1 D3DTSS_COLORARG1 D3DTA_TEXTURE D3DTSS_ALPHAOP D3DTOP_SELECTARG1 D3DTSS_ALPHAARG1 D3DTA_TEXTURE [ステージ2] D3DTSS_COLOROP D3DTOP_DISABLE D3DTSS_ALPHAOP D3DTOP_DISABLE
もはやシェーダーが使えないPCなんて存在してないんだから これを機にシェーダーに切り替えるのが正解
515 :
513 :2009/10/02(金) 18:30:26
ステージの順が逆かも。ひさしぶりで忘れてもうた。
516 :
デフォルトの名無しさん :2009/10/02(金) 19:38:46
ステージ0 RGB加算、α乗算指定 引数1:前のブレンディングステージの結果を使用(ステージ0の場合0xffffffffとなる) 引数2:ステージ0のテクスチャステージのテクスチャデータ ステージ1 色:COLORARG1をそのまま出力 α:ALPHAARG1をそのまま出力 ステージ2 出力の無効(初期化?) 513さんの回答をもとに調べてきました。 0と1が逆なんですかね? あとステージ2は何をしてるんでしょうか?
>>516 そう0と1が逆。
ステージ2は、ブレンディングステージは全部で8つあるんで、
ステージ1で処理を終了する為に設定する。
といってもデフォルトでDISABLEになってるんだが。
ということで、
>>513 でいうところの1->0->2が正しい設定。
どうも俺の記憶では、この順番が逆だった気がするんだよなぁ。
518 :
デフォルトの名無しさん :2009/10/02(金) 19:57:43
>>517 なるほど。
理屈がわかったので、あとはtry&errorでやってみます。
ありがとうございました。
すごく助かりました。
519 :
デフォルトの名無しさん :2009/10/02(金) 22:42:37
Direct3D9でマルチモニタが動きません。 ヘルプ通り、Direct3D9作成→窓1個作成→デバイス1初期化→デバイス2初期化→デバイス1Resetの手順でやってるんだけど、 デバイス1から描画しようとしてもバックバッファのクリアでInvalidCall、 デバイス2から描画しようとしても、PresentでinvalidCallになりまふ 画面解像度とか、一瞬変わるんだけど、すぐ戻っちゃう… マルチヘッドでは動くんだけど、画面4つ出す必要があってどうしてもマルチアダプタも動かしたいの… 教えて薫で申し訳ないですが、教えてください
スキンメッシュアニメーションを実装したいんですが ヒエラルキーの読み込み メッシュコンテナとフレームの作成 レンダリング はなんとか考えたんですが 他に考慮すべき物はありますか? というかいまいち指針がわからないので 指し示して頂けるとありがたいです
作って初めて見える景色があるということ
522 :
503 :2009/10/03(土) 10:17:19
SetViewport を使ってスクリーンの一部に描画はできたのですが シーン内に複数のビューを描画するときにSetViewport を繰り返して使うと 最後にSetViewportで設定したものしか描画されないのですがなにがいけないのでしょうか?
そもそもPresentを二回やれば、ビューポートを使う必要性が無い。
>524 思ったんなら試せよ
>>524 そりゃあなた、2台のカメラから見える異なる2つの景色を描画したいんだから、2回描画するしかあるまいよ
1つ質問させてください。 今現在、MicroSoftが封印しようとしているDirectX8を無理に使う利点はあるでしょうか? ・WindowsMEで動く。 以外に、描画速度や単純な処理の重さの問題が気になっています。 現在、初めてのDirectXでDX9を勉強しているのですが、今後固定機能の描画が DX10でなくなるとの事で、HLSLでの描画を学びました。 そして作ったものを古いPCでテストしたところ、プリミティブ一個の描画すらまともにできませんでした。 そこで固定機能に移行する際、気になったのがDX8とDX9の速度の違いです。 (単純にそのPCでDX8ゲーがつるつる動いて、同じようなことをしているはずのDX9ゲーがかくかくしたので) もしも大幅に違うのならば、がんばってDirectX8を発掘しようと思っております。 利点の他にも難点があれば、ご教示願いたいです。 ・仕様変更にかかわるエラーなど解決しないといけない。等でしょうか、、?
古いPCがどの程度古いのかは別としてプリミティブ1個も 出なかったって言い方するって事は初期化は成功しているんだろう。 つまりDirectXのせいじゃなく君のプログラムが悪くて表示されていないという事だ。 初期化すら出来ない場合はサポート対象外の環境という事になる。
>>529 例えばIntel GMA950みたいな環境ではVertexShaderがないから、
デバイスの初期化のときにソフトシェーダーを指定しておかないと描画されない。
しかも実行時エラーは出てこないので結構困ったりもする。
(たぶんPIXとかでなら見られるんだろうが)
その辺は確認した?
>>529 まずは実験環境を明確にすること。
同じようなこととはいったい何をどのようにしたのか明確にすること。
つるつる、かくかくとは、それぞれがFPSになったのか明確にすること。
以上をまずははっきりさせろ、話はそれからだ。
あやふやになっている物をあやふやで済ませようとする奴は、 プログラマには向いていない。
534 :
529 :2009/10/03(土) 22:12:16
すみません。最低限の情報を明記しておりませんでした。 >実験環境 古いソニーのVAIOです。 CPU:Intel MobileCPU PentiumV 1133MHz メモリ:256MB Mobility Radeon チップ:M6(LY) DAC:IntarnalDAC(350MHz) メモリ:16MB >初期化 確かに座標変換を行ったプリミティブは表示されませんでした。 ですが、変換済みプリミティブ(2D板ポリゴン)の描画自体は成功しました。 この辺りも良く分からないのですが、、ゲームを製作中で、速度は0.7FPSというところです。
>0.7FPS それは本当にHALで動いているのか?
それレベルじゃDirectX8にしたところで無駄だろ・・・。 つかそのレベルを対象にゲームなんて作ってどうすんだ・・・
537 :
529 :2009/10/03(土) 22:27:51
>あやふや 時間が無くて、なるべく無駄を省きたいと先走ってしまいました。申し訳ありません。 ゲームの実験状況はどう説明すれば良いものか、、、 DX8のゲームは60FPS出るのですが、DX9のゲームは大体40FPS程度です。 やっていることは大体70くらいのプリミティブで構成された3Dの背景と 2Dのオブジェクト100個程度描画されている状況でしょうか? 特別重くなるようなエフェクトは特にかかってないと思われますが、 どうしても曖昧になってしまいますね(汗) 一番知りたいのはDX8とDX9の描画速度の違いです。もしかしたら 自分の気づかないエフェクトがDX9のゲームにかかっているのかもしれませんので。
D3D8だろうが9だろうが、速いとか遅いとかは無いよ。 結局同じ機能を使う分には同じだよ。 ただ使える機能に違いがあるんで、差が出るとすればそこ。 D3D8は初めてのシェーダ搭載で、いろいろと未整備。 D3D9は主流だった期間も長いせいもあって、安定してるし 得られる情報も多い。あえて8を選ぶ利点はないよ。
539 :
529 :2009/10/03(土) 22:35:03
>>535 >>536 自分なりに考えたところではHLSLのエミュレートに
ものすごい処理を持っていかれているのでは?と思ったのです。
固定機能で実験してから質問したほうが良いでしょうか?
単純にDX8は速いのかどうか知りたかったので、、申し訳ありません。
もし実験してから出ないと答えが得られないならば実験してきます。
超大雑把な説明 その格ゲーの対応 PCの対応 DX8のゲーム 2倍速処理機能 ○ ○ ○ DX8 4倍速処理機能 × ○ ○ DX8 8倍速処理機能 ○ × × DX9 8倍速処理をしたいところだけどPCが対応していないので4倍。 その4倍は格ゲーが対応していないので2倍速処理に落ち着いた。 DX8のゲームは4倍速処理が出来るから格ゲーより結果的に速くなった。
541 :
529 :2009/10/03(土) 22:37:44
>>538 回答ありがとうございます!よく分かりました。
板を汚してしまい申し訳ありませんでした。
542 :
529 :2009/10/03(土) 22:45:09
>>540 分かりやすい説明細かな疑問まで晴れました。本当にありがとうございます!
>>540 恐ろしくわかりづらいけど、
HWで速いケースとSWで遅いケースを言ってるんだな。
細かく書いたところで意味がないから出た言葉じゃね? 絡む要素が多すぎるからむしろシンプルで分かりやすい。
ちょっと質問です。XP、Visual Studio 2005、Direct3D9 を使っています。 ゲームを作っているのですが、仕様上、fps固定ではなくできるだけ速く動かす必要があります。 ただし、画面の描画はディスプレイの垂直同期にあわせたいと思います。 つまり、 while (1) { while (垂直同期のタイミングが来るまで) { /* フレーム処理 */ } /* 描画処理 */ } といったことをしたいです。 この 「垂直同期のタイミングが来るまで」 の判定方法が見つかりませんでした…。 デバイスのステートとして D3DPRESENT_INTERVAL_ONE を使うと、 垂直同期を待っている間は何も処理できないので、垂直同期1回につき1度しかフレーム処理が行えず、失敗です。 また、D3DPRESENT_INTERVAL_IMMEDIATE を使うと、垂直同期を待たずに描画されてしまい、これも失敗です。 何か方法はないでしょうか? よろしくお願いします。
垂直同期のタイミングってものすごい短い時間だから タイミングがくるまで他の処理なんて組み方してたら永遠に描画できないよ。 1秒間の60回の垂直同期が行われるとしてティアリングを起こさないのは 帰線期間の間だけだから他の処理しつつ待つなんて時間的にシビアすぎて無理。 素直にスレッド使え。
垂直同期のタイミングで、ってのは 昔のDirectDrawでは、IDirectDraw::WaitForVerticalBlankを使えば可能だった。 D3D9に同じような機能は多分無いだろう。
と思ったらあった。
IDirect3DDevice9::GetRasterStatusでいける。
ただ
>>547 の言うように、有用かどうかは別。
550 :
546 :2009/10/04(日) 00:11:16
今まで D3DPRESENT_INTERVAL_IMMEDIATE で数百フレーム出ていたのが、
垂直同期とずれるのを避けるため D3DPRESENT_INTERVAL_ONE にした途端、
(当たり前ですが) 60フレームしか出なくて困っていました。
>>547-549 ありがとうございます!
>GetRasterStatus
試してみます。進捗があればまた報告させていただきます。
別スレッドで描画することについても検討してみます。
ありがとうございました。
>>547 スレッドでガチでWindowsのスレッドなんか使ったら奴等は
何秒単位で反応する仕様になってるの?
少なくともメッセージがこないと動かないわけだからそのラグはあるよね?
場合によっては無理なんとちゃう?
553 :
デフォルトの名無しさん :2009/10/04(日) 01:35:18
下記の3つの情報からカメラのパン・チルト・ロールって計算できるのでしょうか? 1.注視点の位置 2.カメラの位置 3.カメラの向きの上方を示すベクトル ヒントでもご存知の方いますか?
554 :
553 :2009/10/04(日) 01:36:44
ちなみにその逆の計算は知っています。
>>553 できるんじゃね?
アークタンジェント当たり使いまくればいけんじゃね?
>>550 最近は液晶モニタ用にブランク期間を削ったタイミングが使われていることがあって、
VBlankが物凄く短い環境もあるから、VBlank中に何かするような発想は避けた方がいいよ。
内部処理をできるだけ速く回しつつ、表示はモニタのタイミングに合わせたいなら、
内部処理と描画でスレッドを分けるのが一番いい。
558 :
デフォルトの名無しさん :2009/10/04(日) 07:34:43
シェーダの記述方法について質問です。 float4 Color : COLOR; このColorの中身についてなんですが、 Color.a とα値を参照しているサイトがあります。 RenderMonkey1.82をエディタとして活用している最中ですが このツールだと、 Color.w Color.x Color.y Color.z と出てきます。 エディタの予測が間違っているだけでしょうか?
DirectX11の初心者向けのコードを惜しげもなく公開しているサイトはありませんか?
>>557 0xfeeefeeeってのは、deleteされたかなんかして無効になった変数を示す。
要はそのプログラムがバグってるんだよ。
>>557 の試してみたけど、問題出ないなあ。
ファイルによるのか?
ってxファイルだけ流用か・・・
SetViewportで設定して描いたら、もういちどSetViewportして描けばいい
シェーダーのコンパイルのバージョンについて質問です。
「複数のジオメトリのインスタンスの効率的な描画」というページ
(
http://msdn.microsoft.com/ja-jp/library/bb173349 (VS.85).aspx)において
ハードウェアインスタンシングというテクニックは
3_0 頂点シェーダー モデルをサポートするデバイスが必要ですと
書かれているのですが、Instancingというサンプルのfxファイルには
technique THW_Instancing
{
pass P0
{
VertexShader = compile vs_2_0 VS_HWInstancing();
PixelShader = compile ps_2_0 PS();
ZEnable = true;
AlphaBlendEnable = false;
}
}
となっており、つまりVS2_0でコンパイルしているようなのですが
これにはどのような意図があるのでしょうか?
567 :
558 :2009/10/04(日) 16:42:21
>>566 シェーダー的には2.0でも動く。
対応された世代が3.0世代だから便宜上そうなってるだけ。
当然2.0対応ハードウェアでも動かないカードは沢山ある。
動くかどうかはCAPS次第。
ポリゴンの特定の点を動かすにはどうすればいいんですか? ポリゴンの頂点の並びから読み出して 頂点データを書き換えるのかなあ・・・?
>>571 あーやっぱりそうなんですか
わかりました
ありがとうございます
>>570 ヘルプには、vs_3_0からの新機能として
「頂点ストリームの頻度」が挙がっているけどな。
>>573 ATiはRadeonX1000系ではシェーダーモデル2.0止まりにしたけど
ドライバーでジオメトリインスタンスには対応したんだよ。
>>553 template<typename T> inline T square( T x ) { return x * x; }
void orientation_to_euler( const D3DXVECTOR3& dir, float& yaw, float& pitch )
{
____yaw = std::atan2( dir.x, dir.z );
____pitch = std::atan2( -dir.y, sqrt( square( dir.x ) + square( dir.z ) ) );
}
void orientation_to_euler( const D3DXVECTOR3& dir, const D3DXVECTOR3& up, float& yaw, float& pitch, float& roll )
{
____orientation_to_euler( dir, yaw, pitch );
____D3DXVECTOR3 v1, v2( 0, 1, 0 );
____D3DXVec3Cross( &v1, &dir, &v2 );
____D3DXVec3Normalize( &v1, &v1 );
____D3DXVec3Cross( &v2, &dir, &v1 );
____roll = std::atan2( -D3DXVec3Dot( &up, &v1 ), -D3DXVec3Dot( &up, &v2 ) );
}
google code search で見つけたやつをDirectX用に書き換えてみた
ヨーとピッチは正しいけどロールの値が怪しいときがある
576 :
519 :2009/10/04(日) 23:39:02
519ですが,DX9以前のマルチモニタに関して, 海外をググってもなかなか情報が出てこない・・・ もし参考文献・URLだけでもありましたらお願いします. スルーされたのに再度書き込み申し訳ないです.
何がしたいのかいまいちわからんけど。 窓4つつくってそれぞれに描画って話じゃなくて?
違うウィンドウに描画なんて楽勝でできるし 何を悩んでいるのか具体的によくわからないな
579 :
519 :2009/10/04(日) 23:52:13
> 577 フルスクリーンで4画面やりたいのですが, デバイスを2つ作る場合,同じWindowハンドルを渡さないといけないですよね? かつ,別々のアダプタじゃないと駄目ですよね. マルチヘッドでやる場合,違うWindowハンドルを渡さないと駄目ですよね? カード2枚,それぞれで2画面を出すとき,どうしたらいいんでしょう…
>>579 できないんじゃない?
4画面やりたいならカード4枚必要なんじゃない?
フルスクリーンで4画面ってそもそも4出力対応のビデオカード必須だとおもうんだが・・・。
582 :
519 :2009/10/05(月) 00:03:36
一部DualHeadを諦めてデバイスを4つ作成するバージョンでも試してみましたがダメでした… ヘルプにある ・フルスクリーンのデバイスと同じフォーカス ウィンドウを持たす ・どのフルスクリーンデバイスとも異なるアダプタを表す。 ・デバイス1作成⇒2作成⇒1をReset に従って初期化はOKだったんですが最初に初期化したデバイスをPresentした瞬間デバイスがLostします. どこかに良い情報ありますでしょうか.
583 :
519 :2009/10/05(月) 00:07:08
> 580さん, 581さん むりですか… orz 了解しました… じゃぁ諦めてDualHeadのPCを2台にします…
584 :
519 :2009/10/05(月) 00:08:57
大事な一行を忘れました ToT ありがとうございます!! > 577,578,580,581
とりあえず ・デバイス1枚モニタ2枚 ・デバイス2枚モニタ2枚 はいけんの? マルチモニタ アプリケーションでは複数のデバイスをフルスクリーンモードにすることができるが、 それは、これらのデバイスがすべて異なるアダプタのデバイスであり、 同じ Direct3D オブジェクトによって作成され、しかも同じフォーカス ウィンドウを共有する場合に限られる。
質問です 光の当たり具合によるコントラストは何によって再現しているのでしょうか? 法線ベクトルと光との角度?
587 :
519 :2009/10/05(月) 00:13:41
> 585 ・デバイス1枚モニタ2枚 ⇒OK ・デバイス2枚モニタ2枚 ⇒× でした.もし,後者の情報があれば解決できるかも…とは思っていますが. 後者のは一般的なようですが,あまりに一般的すぎてか,Webで情報を 見つけられませんでした. 同じフォーカスwindowのハンドルを与えているんだけど… とりあえず2画面に渡るおっきいwindow作ってハンドル与えればいいんですよね? そのあたりの情報がもしあれば紹介いただけると嬉しいです.
マウスを画面からはみ出さないようにしたいのですが どうすればいいんでしょうか?
>>586 >法線ベクトルと光との角度?
わかってんじゃん
>>588 それやってるゲームたまにあるけど
マジで切れそうになるほどウザイよ。
え?そうなの? いやあマウスの座標はとれるんだけど 画面外に出ちゃってボタンを押すと変なところ押しちゃうから 避けたかったんだけど・・・ しかたないからマウス使うのやめるか・・・
595 :
519 :2009/10/05(月) 00:39:41
> 593 そうですそうです.9は8と同じ方法でできそうです. 検索で出てきました, ・残りのセカンダリ以降のDirect3DDevice8オブジェクトは、 それぞれのデバイスウインドウにレンダリングする。 (D3DPRESENT_PARAMETERSのhDeviceWindowにセット) デバイスウインドウはフォーカスウインドウの子ウインドウでなければならない。 の,子windowじゃないと,てのを試していませんでした.やってみます. (この人は失敗しているようですが…)
596 :
519 :2009/10/05(月) 01:48:42
ダメデシタ. window作成時のパラメタに制限でもあるのかな… 子Windowの作り方がイマイチ分かっていない(とりあえずparentに設定するとかしてみました) のが原因な気もしますが… 画面は両方解像度も変わるし全画面になるし,windowサイズも変更されますが, すぐに全画面が解けてwindowが見えちゃう… 先日トライした時はデバイス2のクリア,Presentはできたのに,今回はそれすらもできませんですた もうちょっとWindowsのプログラミングを勉強してまいります
全画面じゃなく、画面解像度いっぱいのウィンドウにしちゃえば?
>>519 というか、Dx9だと1つのデバイスで複数のディスプレイのウィンドウに書けるんだが。
それぞれでフルスクリーンにするんだぞ(しないと使えない)
これをグループ化されたフルスクリーンというわけだが。
試したんだな? 試したな?
Dx8以前はどうか知らない。
ロール、プレイン、ゲーム! やったこと無い、ひ・と・も〜♪
すいません誤爆しました
601 :
519 :2009/10/05(月) 02:53:19
> 597 それでも要求は満たせるので,良いということは思いついたんですが, 知識欲求のためにwというか,できないはずはないという思いと, できないのが悔しいので… ありがとうございます.解決しなかったらウィンドウでやります! > 598 CreateDeviceが1つで良いということですか汗それは知らなかったです… ありがとうございます.試してみます.ちなみに試してなかった…ですorz. 全部のアダプタにCreateDeviceして,という情報に踊らされてた感じですか泣 それぞれでフルスクリーンにすると言うのがいまひとつ分からないですが… D3DPRESENT_PARAMETERSのwindowedにFalseつけてCreateDevice するものだと思っていました… 2枚目以降は手動でChangeDisplaySettingsExをするのでしょうか? そもそもWindowsプログラミングを始めたばかりなのですいません.
602 :
558 :2009/10/05(月) 07:25:39
回答を頂いて色々やってみたのですが、どうにもα値でマスクをかけることができませんでした。 エフェクトをかけたい画像、エフェクトの画像の表示は確認できました。 シェーダでもやってみたのですが、描画はできたのですがマスクがかかった処理が出来ません。 考えうるミスがあるようでしたら教えてください。 ピクセルシェーダの中身は float4 PS( float2 TexUV : TEXCOORD0 ) : COLOR { float4 EffectColor; float4 TextureColor; // テクスチャにサンプラーの設定を適用させた色を取得 EffectColor = tex2D(EffectSampler, TexUV); TextureColor = tex2D(TextureSampler, TexUV); // α値が0.0より大きい個所のみエフェクト適用 if (0.0 < (TextureColor.a * EffectColor.a)) { TextureColor.r = TextureColor.r + EffectColor.r; TextureColor.g = TextureColor.g + EffectColor.g; TextureColor.b = TextureColor.b + EffectColor.b; } return TextureColor; } としています。
>>598 マルチディスプレイって、どちらかというとマルチヘッドの方が特殊な例で
本来は複数のビデオカードを接続して使うもんだよ。
その場合は、ビデオカードの数だけデバイスを作成するもの。
2画面程度ならマルチヘッドで対応できるが、4画面以上となると現状では
複数のビデオカードを使って複数のデバイスが必要。
519はマルチヘッドでは既に出来ている。
>>519 マルチデバイスは経験したことないので推測で言うけど、テクスチャ等の
リソースはデバイスごとに独立しているものだから、マルチデバイスだと
それぞれのデバイスでテクスチャの作成が必要なはず。
その辺のリソース管理はちゃんとやってる?
604 :
558 :2009/10/05(月) 07:26:52
描画処理は ・エフェクトをかけたいテクスチャの描画 ・テクニック設定 ・Begin ・BeginPass ・シェーダへテクスチャを渡す ・SetTexture エフェクト画像のセット ・SetFVF ・DrawPrimitiveUP ・EndPass ・End という順番で行っています。 申し訳ないですが、原因が特定できないのでエスパー的な回答を求めています。
>>604 technichの定義に必要なフラグを書け。
606 :
519 :2009/10/05(月) 11:41:34
> 603 フォローありがとうございます. 仰る通りマルチヘッドは既にできました.が,4画面あるようなビデオカードでは 少々重いシーンをレンダリングしてるので,複数ボードにチャレンジしてる次第です. とりあえずデバイス毎にテクスチャやメッシュの作成をしてますが,ひとまず動作確認のため バックバッファのクリア→presentだけやってますが,それでも失敗しています. とりあえずDX8のSDKに複数デバイスのスクリーンセーバのサンプルがあるとの情報を得たので 落してみつつ軽く違いを見てみたのですが今ひとつわからず… まずはこのサンプルを動かしてみて,動くかやってみて,違いを良くみて,再度報告します. (なんで最新のSDKにはマルチモニタのサンプルは無いんだTT)
>>606 というか、1つのデバイスで全部描画させて、
残りはバックバッファからGDIなんかで転送かけたほうが早くね?
アニメーションの描画に再起関数使ってるんだけど もしかしてこれって遅くなる・・・?
マルチヘッド環境でデバイス2つ作成してマルチモニタを試してみたけど、
片方をResetするともう片方がLostしてしまうね。
ヘルプに
As a result, a multiple-monitor application can place several devices in full-screen mode, but only if all these devices are for different adapters, were created by the same Direct3D object, and share the same focus window.
という記述があるけど、all these devices are for different adaptersってのは
物理的に別のビデオカードでないと駄目ということなのかな?
>>606 デバイスを2つ作成する際に、異なるビデオカードになるように選択しても駄目かな?
AdapterOrdinalInGroupが0のアダプタを2つ選んでみて。
610 :
558 :2009/10/05(月) 14:00:14
>>605 すみません、調べてみましたが質問の意味がよくわかりません。
もう少し詳しく教えてもらっていいですか?
611 :
519 :2009/10/05(月) 14:04:57
> 607さん なるほど,その手もありますね.ありがとうございます. 両方動かせるようになったら,是非速度比較してみます. 大半プロジェクタなんでどの方法でも60fps出れば良いんですが… そのほうが簡単だしリソース節約できそうですね. ちなみに他の手段として,マルチヘッドのプログラムを使って, DualHead2Gox2なんかも考えてみました.正味4回レンダリングするだけでいいかな, と思ったりもするのです.(金で解決という裏ワザかもしれませんが…) どのみちマルチアダプタができると,それに越したことはないので, (いまとりあえず2x2画面が目標ですが,できれば最終的には6画面出したいのですorz 全画面同じ環境,異なる視点でのレンダリングです.) いきなりボード3枚ざしはドライバの問題とかソフトの問題とか山積みそうだったので まずは2枚からやってみたいです. やや(だいぶ?)特殊な状況ですいません.先に報告したサンプルで頑張ってみます.
612 :
558 :2009/10/05(月) 14:12:39
613 :
609 :2009/10/05(月) 14:41:21
もう一度実行してみたら、普通に動いた>マルチデバイスでマルチモニタ ドライバが腐ってるだけかなぁ。 マルチモニタの設定変えてると、おかしくなることが多いし。
614 :
609 :2009/10/05(月) 14:46:17
原因判明。 どうもDebug Runtimeだとうまく動かないようだ。
> 609 >片方をResetするともう片方がLostしてしまうね。 まったくおんなじ現象です. >デバイスを2つ作成する際に、異なるビデオカードになるように選択しても駄目かな? AdapterOrdinalInGroupが0のアダプタを2つ選んでみて。 それもやってみました… >どうもDebug Runtimeだとうまく動かないようだ。 っていうか,ええええええええ!! Debugだとだめですと…ちょっといま時間ができたので即効ためしてきてみます.
>>594 が分かる方、どなたかいらっしゃらないでしょうか?
>>610 お前は1から10まで説明されないと理解できないのか?
それは勉強してるとは言わない。話を聞いてるだけだ。
自分で調べろ。technique構文はHLSLで重要な意味を持つんだぞ。
>>594 再生しなおし→普通に再生しなおすだけ。
ループ→フラグをつけるだけ。
ヘルプちゃんと読んでるの?
619 :
558 :2009/10/05(月) 15:31:13
>>617 ピクセルシェーダとバーテックスシェーダをラッピングしたようなメソッドのことですよね?
だから直接アセンブラで記述することもできる、と理解しています。
私がわからないのは、テクニックの定義にフラグを使用しているのかどうかがわからないのです。
エフェクトのロード時にデバッグ用のフラグや最適化無しのフラグを立てたり等は出来るそうなのですが
そのことを言っているのでしょうか?
それとも、テクニックに複数のパスを作り、それを分けるフラグのことでしょうか?
不勉強で申し訳ない……。
620 :
558 :2009/10/05(月) 15:36:49
問題自体は解決できました。 修正した点は、 ・BeginPass後にSetTextureを呼んでいたのをその前に置く ・そもそも、シェーダの処理はエフェクトをかけたテクスチャを出力しているので エフェクトの描画を行う必要が無かったので テクスチャの描画に変更 ・シェーダの記述を変更 シェーダの記述は以下の通りです float4 EffectColor;// : COLOR; float4 TextureColor;// : COLOR; // テクスチャにサンプラーの設定を適用させた色を取得 EffectColor = tex2D(EffectSampler, TexUV); TextureColor = tex2D(TextureSampler, TexUV); // α値が0.0より大きい個所のみエフェクト適用 if (0.0 < (TextureColor.a * EffectColor.a)) { TextureColor.r = TextureColor.r * 0.5 + EffectColor.r * 0.5 * EffectColor.a; TextureColor.g = TextureColor.g * 0.5 + EffectColor.g * 0.5 * EffectColor.a; TextureColor.b = TextureColor.b * 0.5 + EffectColor.b * 0.5 * EffectColor.a; }
>>618 XAudio2のボイスは、普通に停止させると自動的に現在の再生場所を保持するので、その状態で再びスタートさせても途中からの再生になるんです
つまり、停止ではなく一時停止の状態なんです
なので、再生が終了したりといった任意のタイミングで、一時停止ではなく停止をさせる、もしくは再生位置を最初に戻す方法を探しているのですが、
ググったりMSDNを探しても見つからないのです
>>621 pauseじゃなくてstopかければいいじゃん。
駄目ダッター泣 どうやら私が相当へぼいだけのようです? ちなみにDebug→Releaseにしたら,フルスクリーンが解除されたりはしなくなりましたが, PresentでまだINVALID_CALLになりまふ…2枚x2画面でやってもダメポです… ResetかけてもINVALID_CALL… Presentの3番目をNULLにしても親窓にしても子窓にしても駄目でした… 基本,マルチヘッドでググったら最初に出てくるサイトのプログラムを弄ってるんですが. CreateWindowを2枚にして(位置はあまり関係ないですよね?), Parentに主窓,デバイス2のd3dppの設定に子窓を設定, ヘッド数を1に強制,デバイス2のCreateDeviceで主窓を設定, デバイス2作成後,デバイス1をReset,んで,あとはSwapChainうんぬんを飛ばして ClearしてPresentしてるだけなんですが… (ちなみにSwapchainを取ろうとすると既にLOSTしていてInvalidcall) 613さんと何が違うんでしょう…
>>622 Pauseは無くStopしかないのですが、Stopを実行すると上記の一時停止の状態になるんです
625 :
519 :2009/10/05(月) 17:48:21
そういえば書いていませんでした,VGAにはGF7900とGF7600使ってます. Windowsの起動時に画面乱れるし…相性もあるのかな… 余談ですが,先に指摘されていましたが,どういう条件か忘れましたが, 2つのデバイスで1つの画面(画面1)に 描ける状況になりました.なのになんで画面2に書けないんだろう…汗 さらにDX8SDKが見つからなくて先のサンプルも試せなかったです… まぁでも読んでみましたが明らかにおかしいところもわからなかったorz
>>624 確かにPauseはなかった。スマン。
だがStop時にSourceVoiceを止めて開放(Release)して、バッファも削除したらそれでいいんじゃないの?
別に迷うようなところじゃないと思うんだが。
>>620 そんなやり方じゃあ背景残したい場合にどうすんのよ。
>>626 えっと、Stop時にはソースボイスやバッファを削除して、再び再生するときにソースボイスやバッファを作り直すということでしょうか
なお、ストリーミング再生の部分は、スレッドを新たに作成し、その中でストリーミングの処理を行っているので、Stop時にそのスレッドを削除し、
再び再生するときにまたスレッドを作成するという方法を取ろうとしたのですが、ExitThread関数を実行した時点でエラーが出てしまい、どうにもうまくいきませんでした
629 :
558 :2009/10/05(月) 18:33:41
>>627 背景って残すものなんですか?
毎回描画してるんですが……。
長方形のポリゴンを繋げてミサイルの煙を表現しようとしています。 基準点を置いてそこを中心に対の点を置く、それを結んで描画しています。 ビルボード処理みたいなのをかけて出来る限り面がこちらを向くようにしたいのですが詰まっています。 「カメラ→注視点」のベクトルと「カメラ→基準点」のベクトルをD3DXVec3Crossを使い外積を求め(全てのベクトルは正規化済み)、 基準点を中心に求めたベクトルと、、その対に置いていけば出来るんじゃないかなと思ってやってみましたが上手くいかず。 その他色々試していますが似たような結果しか得られていません。 どなたかアドバイスを頂けると嬉しいですorz
631 :
575 :2009/10/06(火) 00:07:57
575で書いちゃったけど オイラー角ってジンバルロックとかあるから ロール角は求めないほうがいいね
8分木ってここで聞いていい話?
>>630 やったことねぇけどスクリーン座標にもってきてからつなげてみれば?w
>>632 ダメだ
そんなの紙に描いて自分でなんとかしろ
>>628 いや、スレッドはXAudio2が勝手に作るものだし……。
ExitThreadを明示的に呼び出すなんて論外。
ヘルプとサンプルをもう一度読み直せ!
>>629 お前はDrawPrimitive1発で終わるような画面描画しかせんのか?
636 :
628 :2009/10/06(火) 03:02:43
>>635 ありゃ、そうだったんですか…
http://msdn.microsoft.com/ja-jp/library/bb669177 (VS.85).aspx
ここで、ストリーミング再生には個別にスレッドを作る必要がある、みたいに書いてあったんでCreateThreadでスレッドを作成して、
その中でストリーミング処理を行っていました…
というか、そうしないと音楽再生中はひたすらwhile文で回すので、再生中は他のことが出来ないと思ったんですが
ちなみに、最後まで音を鳴らした後に、ループしてまた最初から鳴らす方法はこの方法でも解決しました
(ただ、指定した場所からループする、というようなことはまだ出来ないですが)
637 :
558 :2009/10/06(火) 12:35:37
>>635 いわんとすることがよくわからないので、
問題が起こった時に635さんの回答を思い出して描画パイプラインをもう一度見直します。
ありがとうござました。
>>636 そんなの、意訳を読んで誤解してるだけ。原文はこう。
http://msdn.microsoft.com/en-us/library/ee415791 (VS.85).aspx
Streaming audio data in XAudio2 is accomplished by creating a separate thread
for reading the audio data and using callbacks to control that thread.
creating a separate threadするのはXAudio2であってプログラマが用意する必要は無い。
組み込みでいくつかのコールバッククラスがあって、利用する際にはそれを継承したクラスを用意して使う。
その使い方が口酸っぱくかかれてると思うんだが?
>>637 確かに、背景という用語はちょっと誤解を招く表現だった。スマン。
先に描画したフレームバッファ上の画像データのことを言っている。
ポリゴン同士ならZバッファがあるから描画順が違ってても問題ないが、
αかけるならZバッファ使えなくなるだろ?
じゃあ半透過にするには背景(in_color)の色と混ぜないといけなくなる。
640 :
デフォルトの名無しさん :2009/10/06(火) 15:08:03
>>639 詳しい回答助かります!
確かに作成した画像の一部が被さるような描画を行うとおかしくなりますね。
今現在、ゲームのインターフェース部分でのみの使用なので
画像が被るような処理を行わないようになっています。
今後それ以外の用途が出た場合にプログラム側でZバッファで
描画する順番をソートするプログラムで回避しようと思います。
ありがとうございました。
>>638 なるほど、そうでしたか
ttp://msdn.microsoft.com/ja-jp/library/bb669177 (VS.85).aspx
ここの方法だと、再生が終了するまでwhileで回し続けていたので、終了するまで他の動作が出来ない→スレッドを作成して、その中で処理する必要がある
と思ってましたが、回し続けなくても、メインループの中で、コールバックがあったときだけ次のバッファにデータを入れれば良かったんですね
メインループの中で処理できるのなら、途中でストップ→最初から再生、なども簡単に出来そうです
>>614 なにがメインループや。コールバックと言ってるじゃないか。
全然人の話聞いてないだろ。
>>642 あ、てっきりコールバックは、条件を満たしたときにそれを知らせるだけかと思ってました
OnBufferEnd内でストリーミング処理を行えばいいんですね
あー、違う、コールバックを継承したクラスを作成すると、それがスレッドみたいな扱いになるんですかね だから、CreateEventとかしなくても問題ないと すいませんちょっと頭の中整理してきます
ああダメだやっぱり混乱してる CreateEventしなくていいわけないだろCreateThreadだ
DirectInputを使用している他のアプリに対して、ダミー入力を送りたいのですが どうすればいいのか、よくわかっていません。 フックするなどのキーワードが出てきましたが フックする方法も良く分かっていません。 何か参考になるものや方法をご存知の方いらっしゃいますか?
>>645 いや、イベントハンドルも基本的には要らないし。
いちいち付き合ってられんな。もうちょっと勉強してから書き込んでくれ。
648 :
デフォルトの名無しさん :2009/10/06(火) 23:21:18
DirectInputを使う必要あるの?
>>648 どういうことだろう。
他のアプリがDirectInputから情報を見てるから
そこにダミーの情報を送ってやれば良いと
考えているのですが。
650 :
519 :2009/10/07(水) 06:11:07
どうしても駄目ですね…マルチデバイスでマルチモニタができません… >> 609さん DualHeadのVGAでも,マルチデバイス出来ましたか? もし可能なら,参考になりそうな情報か,ソースを一部分でもいいので 頂けるとありがたいです…
動的な頂点バッファって、普通に考えて頂点バッファが2倍必要ですか? 1つ目:デバイス用 2つ目:アプリでいじくる用 デバイスから頂点を読むと遅くなるので コピーを渡す必要があり、結果、動的バッファで速度を重視するなら 頂点量が2倍になるという考え方は普通ですよね?
652 :
651 :2009/10/07(水) 12:47:00
>>651 いや・・・静的なバッファでもManagedを指定すれば
結局背後で自動的にメモリが確保されたりするし
かといって静的なバッファをDEFAULTするにも自分で
バックアップを用意しないといけないから結局2倍必要であり、
静・動関わらず、頂点データの領域はは2倍必要という事か・・
頂点バッファを読み込まなければならないようなプログラムを組むんだったら、 シェーダで何とかすることを考えた方が有用だろう。
654 :
609 :2009/10/07(水) 18:48:40
>>651 リアルタイムですべての頂点を不定形に動かしまくるなら話は別だが、
普通は頂点バッファの一部だけが変わればいいので、
すべての状態を表した1個の頂点バッファを用意して、
毎フレームIndexBufferを作り直している。
IndexBufferもWriteOnlyで1回確保して毎フレーム書き込んでるだけ。
これで何も問題ない。
>>655 確かにその場で書き込めばメモリ確保しておく必要ないし
IndexBufferを変えるのは考えていませんでした。
657 :
650 :2009/10/07(水) 22:19:52
>> 609 ありがとうございますっ!!感謝感激です. だうそできました!!そしてコードを読んでみました. やはりWindowハンドルの与え方まわりが違いそうです. 子窓にしなくてもできてるんですね・・・へるぷの馬鹿… 今日から出張中につき一週間ほどテストできないのが口惜しいんですが, ありがとうございます! Debugでも動くなら何よりです.参考に頑張ってみます!
>>630 カメラがどこを向いているかは関係ない。
カメラの位置とビルボードの位置の問題だから。
カメラの位置とビルボードの位置を結ぶベクトルを正規化したベクトルFから適当なupベクトルとの外積を使って直行基底を求める。
直行基底をなす、3つの単位ベクトルで回転行列を作る。
このとき、逆回転行列を求めたいので最初から転置しておく。
これで、ビルボードをカメラ方向に向ける回転行列が完成。
xAudioを使いたいのですが、xWMAフォーマットを使っておけば データ容量も小さくストリーミング再生も問題ないし、配布についても問題無しですか?
>>659 XAudioはXBox360専用。XAudio2がPCでも使えるほうな。
DirectX Audioというなら問題ないんだが。
Direct Show でWMVの再生ができることは確認したが、
音声はogg+vorbisを使えるようにしてしまってるからWMAは試したことないな。
他のやつ答えてやってくれ。
WMAの採用は基本的には問題ないが、OS単体で再生が保証されてるわけじゃないから
コーデックの別途インストールが必要になるケースが出るぞ。
>>660 XAudio2を使うのならxWMAの再生は保障されるんじゃないか?
>>661 MSDNちょっと読んでみたが、xWMAはWMAのサブセットで、
「XAudio2 と XACT3 の両方において、ソフトウェアで xWMA をデコードできるようになりました」って書いてあるね。
じゃあ大丈夫なのかも。
事実上別形式と思っておいたほうが安全そうだね。
>>662 そうだね。
WMAは普通はASFコンテナだけど、
xWMAはRIFFコンテナに突っ込んであるから、普通のプレーヤーで再生できなかったりするし(要はDirectShow経由で再生できない)。
>>659 あーそういや、指定位置に着たら指定位置に飛ぶようなループは設定できなかったっりしなかったっけ?
そういう曲使わないなら問題ないと思うけど。
>>663 そういうのはバッファをSourceVoiceで与えるときにフラグで指定できるけど、
正直めんどくさい……(まだ自分では対応させてない)
665 :
デフォルトの名無しさん :2009/10/09(金) 17:52:41
別アプリでDirectXで描画している画面に、図形などを表示したいのですが 別アプリのサーフェイスの取得 または 描画のフック が実現できるような関数あれば教えてください。 (サンプルがあるサイトとかもあると助かります・・・) うまく説明できないので実際あるやつだと ・DirectXを使うゲームを起動 ・frapsやdxtoryなど(DirectXの)動画を録画するツールを起動 ・ゲーム画面に fps(フレームレート)が表示される (←これと同じようなことをやりたい) 透明なウインドウを重ねただけだと、片方のウインドウしか動画に録画されないのです。
>別アプリでDirectXで描画している画面に書き込み なんかこのスレみてたらこんな質問が何回も出てくるけど、 何でこんなめんどくさいことばかりこいつらはやりたがるんだ? アプリからじかにハードウェアを叩けるのがDirectXのいいところなのに、 横から割り込めるようなチャチな作りだったら意味ないだろ。
キーボードとマウスの操作をゲーム画面に重ねて動画に保存したいからです。 なんでそんな動画を保存したいのか?って訊かれたら趣味・・かな。
668 :
デフォルトの名無しさん :2009/10/09(金) 19:31:51
XAudio2のことを解説してる書籍ってありますか?
669 :
デフォルトの名無しさん :2009/10/09(金) 22:27:16
待たせるなよ!
671 :
665 :2009/10/10(土) 00:23:05
>>670 すごい・・。やりたいことはこれに近いですね。もっとかなり簡易版ですが。
"API Hook"で少し調べてみます。ありがとー。
>>667 >キーボードとマウスの操作をゲーム画面に重ねて動画に保存したいからです。
ビジネスアプリでほしい場面はあるけど
それはそれでキャプった後で別でつけたほうが早いよ多分
だってどうせコメントだっていれなきゃいけないんでしょ?
>>670 ちゃんと影が落ちてたりするし、手調整じゃなくて
オートでやってるなら凄い技術だね。
ただシェーダ主体になってくると、簡単にはいかないだろう。
World変換行列がどれかすら判断する術がない。
DirectXにてポリゴンとベクトルの当たり判定をとっているのですがうまくいきません なにか関数の使い方等間違っていますか? 最適化などは後でやるのでとりあえず動くようにしたいです
第1引数:直線始点 第2引数:直線終点 第3引数:ポリゴンの座標1 第4引数:ポリゴンの座標2 第5引数:ポリゴンの座標3 BOOL Vec_Pol(D3DXVECTOR3 *v1, D3DXVECTOR3 *v2, D3DXVECTOR3 *p1, D3DXVECTOR3 *p2, D3DXVECTOR3 *p3){ //Planeを作る D3DXPLANE pln; D3DXPlaneFromPoints(&pln, p1, p2, p3); //無限平面との衝突点を算出 D3DXVECTOR3 o; if(NULL==D3DXPlaneIntersectLine(&o, &pln, v1, v2))return false; //ポリゴンと点の内外判定 D3DXVECTOR3 vec1, vec2, cross, temp; vec1 = *p1 - o; vec2 = *p1 - *p2; //外せきその1 D3DXVec3Cross(&temp, &vec1, &vec2); vec1 = *p2 - o; vec2 = *p2 - *p3; //外せきその2 D3DXVec3Cross(&cross, &vec1, &vec2); if(temp.x * cross.x < 0.0f)return false; if(temp.y * cross.y < 0.0f)return false; if(temp.z * cross.z < 0.0f)return false; vec1 = *p3 - o; vec2 = *p3 - *p1; //外せきその3 D3DXVec3Cross(&cross, &vec1, &vec2); if(temp.x * cross.x < 0.0f)return false; if(temp.y * cross.y < 0.0f)return false; if(temp.z * cross.z < 0.0f)return false; return true; }
677 :
デフォルトの名無しさん :2009/10/10(土) 06:28:00
XAudio2でwavファイルの音を鳴らすことって出来ないんですか? サンプルで見たこともない形式のファイルを読み込んでるんだけど
678 :
デフォルトの名無しさん :2009/10/10(土) 07:08:31
どうして無視するんですか?
土曜の朝に質問して即レスが来ると思う神経を疑う
レイ→命中したポリゴンの3頂点を取得→法線ベクトルと命中点の座標取得 ってやってるんだけど もしかしてレイによるポリゴン判定ってあまりやらない方がいいんですか?
>>682 2Dのシューティングで当たり判定がしばしば矩形になっているように、
当たり判定処理は描画してるポリゴンとは別に考えたほうが簡単になる。
3Dの場合ならいくつかの球体と考えればいいんじゃね?
>>682 どうしてもポリゴン単位でないとゲーム性に問題が出るつーならそうするが
そうれないなら速度的な問題を考慮して単純な形状で判定するのが基本。
685 :
682 :2009/10/10(土) 13:34:20
地面判定に使って上でボールがはねるように しようとしたんでこうなったんですが・・・ やっぱり速度的にまずいんですねえ・・・ どーすっかなあ・・・
>>658 ありがとうございます。
なんとか打開できました。
688 :
682 :2009/10/10(土) 13:54:20
というか地面との当たり判定ってどう言う方法が適しているんでしょ?
>>676 ちゃんと確認はしてないけど、
if(temp.x * cross.x < 0.0f)return false;
if(temp.y * cross.y < 0.0f)return false;
if(temp.z * cross.z < 0.0f)return false;
これは内積にしないと駄目じゃない?
例えば[+0.1,+1,0]と[-0.1,+1,0]のケースがはじかれる。
>>688 二分法
移動量ぶんだけ進めて、めりこんでたら半分戻して、まだめりこんでたら半分戻して、
めりこまなくなったら半分進めて・・・
というのを、欲しい精度までやる
>>688 マップの構造と用途によるなぁ
箱庭を主人公が歩く程度だったら地形判定用簡易ポリゴンを用意して
レイと簡易ポリゴンでいいと思うよ
箱庭で物理シミュとかやるんだったら球(や必要な形状)とポリゴンの判定とか必要じゃね?
これは大変だな
広いフィールドなら格子状の高さマップから平面の方程式だな
後はすべての地形を幾何学形状にして根性で当たり判定?
俺が知ってるのはこんなもんかなぁ・・・
3D空間上でソートを行わず半透明のポリゴン(テクスチャ)を正しく描画することは出来るのでしょうか。 Zバッファを有効にした場合、手前にアルファ値0.0に近い値で描画しているものがあるとその奥に描画されても見えません。 無効にすると当然前後関係が無くなり描画順になってしまいます。 描画しているものは雲や煙、レーザーやその他エフェクトと数が多いです。 雲と煙に関しては白黒なので合成方法を変えてやれば何とかなりますが 様々な色が乗っているエフェクトはどうにも出来ませんでした。 描画方法が個々で違ったり数が多かったりしますが、何とかしてでもソートさせないと駄目なものなんですかね・・・。
>>692 逆に半透明なオブジェクトを描画するときにZバッファを切ればいいんじゃね?
というか、いつも描画順でソートした状態で描画してるから、そんなことで悩んだことないな。
つかコリジョン関連はコレ1つで全部OK!みたいなものはないから ゲーム性やデータ構造とか欲しい精度とかにあわせて変更しつつ さらにそのゲームにあわせた細かい調整が必須。
>>693 >いつも描画順でソートした状態で描画してるから
平たく言うと何のソートもしてないってことか
>>694 正しいかどうか知らんが
そういう抽象的なアドバイスって
何かの役に立つの?
ソート不要の半透明は 不完全なD3D11の技術デモで 俺SUGEEEE!!!してるぐらいだから無理じゃね?
>>695 逆だ逆。Zバッファをろくにつかってない。
それで済ませてしまってる。
昔懐かしいPowerVRはソート不要で半透明できた気がする
700 :
692 :2009/10/10(土) 17:26:09
皆さんありがとうございます。 やはりシンプルには出来ないようですね。 とりあえず描画順をソートする対象を減らすことから対応してみます。
Zソートなら問題なし! PSはそうやってました
例えがあれだけど、ドラゴンボールのキャラの周りに出る「気」みたいなのはポリゴン単位でソートしないとまずいのかな
>>702 モノによるけどあんなのキャラ描画した上にかぶせるだけじゃね?
質問です 2D板ポリゴンを作成してテクスチャを一枚貼り付けることはできたのですが、 マルチテクスチャにしようとするとStage0だけ反映されてStage1以降が反映されません ・テクスチャはグローバル変数にLPDIRECT3DTEXTURE9を2つ作ってそこにファイルから読み込みました ・Stage設定とテクスチャのセットはポリゴンの頂点を決めた後に行っています ・ステージ0の設定は加算合成、色1テクスチャ、色2ディフューズ ・ステージ1の設定はα合成、色1テクスチャ、色2カレント にしてます 順序がおかしいのか、必要な手順が抜けてるのだと思いますが、分かる方お願いします もしくは簡単なマルチテクスチャのサンプルコードあったら教えてください
>>704 シェーダー使え。
というか、シェーダー使って例の本読みながらプログラム書いてたら、基本的な部分で迷うことはほとんど無くなったな。
現在文字の表示にGetGlyphOutline等を使ってテクスチャに書き込んで表示してるのですが これだと文字が太すぎてデバッグ用途に不便なのでデスクトップの文字みたいな 細い文字を使用したいのですがどうすればいいのでしょうか
>>707 お前馬鹿じゃねーの
例の本って言ったら例の本のことだろーが
711 :
704 :2009/10/11(日) 05:13:29
>705 すいません、意味がよくわかりません シェーダを使わないとマルチテクスチャは使えないんでしょうか? 2D板ポリゴン(三角形×2)の上に、2枚目のテクスチャを貼り付けたいだけなんですが
712 :
デフォルトの名無しさん :2009/10/11(日) 05:29:12
俺はDirectX9シェーダプログラミングのほうがいいと思うけどな
今切れ氏の本
>>711 その方法もこの本に書いてある
あとシェーダで書けばテクスチャステージとかレンダーステートとか
そういう面倒な設定をしなくても、普通にテクスチャ2つサンプリングして
サンプリングした色を足すなり乗算するなり簡単に出来る
>>704 言葉じゃなくて、その部分のコードを正確にそのまま書かないと
何が悪いか分からん。
固定機能でも8枚までテクスチャは貼れる。
>>711 >>712 が書いてるけどシェーダで組めるようになれば色々楽。
まぁそれまでが大変かもしれないけど、何れ覚えないといけないことなので早いに越したことはない。
まぁWindows7がそこそこ成功してDirectX11の時代になったら 固定機能パイプラインが無くなるからなぁ・・・。 Vista以降をターゲットでいいならDirectX11は古いビデオカードでも使えるしな。
くだらない質問なんだけどシェーダーって一回読み込んだら何回でも使えるんだよな? LPD3DXEFFECTをクラスに組み込んでオブジェクト数に応じた数をそろえるのって無駄だよな?
>>716 無くなったら過去の大量のゲーム類が動かなくなるんだが、
無くなると言うソースはどこにあるんだ?
>>718 いやとりあえず動くんじゃね?
だってあの機能ってエミュだろ?
>>717 そう無駄。
COMは参照カウンタ付きなんだから
普通にそれぞれ参照を持たせるのが吉。
>>718 Win7でD9D9以前が動けばモーマンタイだろ。
実際どうだかは知らんが。
>>718 実際、そういう環境の差異で動かなくなってしまう場合は多い
昔、Cドライブにデータを保存してたアプリなんてセキュリティが厳しくなったせいで
まったく動かなくなってしまったの多いしな
固定昨日のエミュレーションなんてげふぉ3の時代からやってる
>>722 >げふぉ3
これなんか差異がなかったっけ?
>>718 DirectX10から固定機能パイプラインはないぞ。
単にWindowsVsitaやWindows7上でも
過去のDirectX自体は動くから過去のゲームはそのまま動く。
2枚テクスチャがあったとして それがオブジェクトの違う部分に貼ってあるとします でシェーダーを実装して表示してみたら なんでかテクスチャの位置が入れ替わっているのですが これは何でなんでしょうか? ただ単にSetTextureの部分がおかしいのでしょうか?
>>725 1枚貼って様子見て、ついで2枚目を貼るという普通の開発手順を踏んでるよな? な?
そしたらそんな疑問は出ないはずなんだが。
すいません参考にしたサンプルから間違ってたようです でもトゥーンシェーダー組み込もうとしただけなのになんでこんな・・・
>>727 おい……板ポリに対してトゥーンシェーダーかけるなんて……冗談だよな……?
冗談と言ってくれ……。
マビノギに謝れ!
法線マップ用意すればもしかしたらちょっとは絵になるかもしんねー
板ポリならアニメ調の絵はって終わりだろ。 どこにトゥーンシェーダー介する余地があるんだ。
>>728 そのくらいつくってんだからわかるわw
車の形だよ
したらば上が青でタイヤが黒なのに逆になってんだよ
今調査中
>>731 なにいってるの?
バンプなら板ポリでもお日様の位置で陰が微妙に変わるだろ?
変なこというな
オンラインゲームを始める前にいろいろと調べてたのですが、 少しわからないことがあるので相談お願いします。 現在グラフィックカードHD4850の512MBをしています。 OSが、VISTAの64BITなのですが、ダイレクトXを導入することにより グラフィック(ベンチマーク)は向上するのでしょうか?
ここはプログラミングの質問をするスレですよ
>>733 ただの板ポリにバンプマップするのかよw
>>737 例え板ポリといえど、法線や深度など
必要な情報がそろっていれば、十分意味はある。
単にそれらを頂点で持つか、テクスチャとして持つかの
違いでしかない。
アンタの考え方は一昔前のもの。
>>737 デザイナの勝手だろ
奴等がそう作ればそう表示されるようになってるだけだ
ていうかちょっと使い方に驚くけど結構板ポリバンプ使うぞ奴等
そもそもの話が板ポリにトゥーンだった気が。
そもそも板ポリって質問と関係あるのか?
違うだろ 車のオブジェクトって言ってるし
>>743 馬鹿は頭に血が上ってるから自分と違う意見は全部同一人物なのさ
float4x4 matWVP; float4 VertexShader(float4 f4Position : POSITION) : POSITION { return mul( f4Position, matWVP );//3D変換 } float4 PixelShader() : COLOR { return float4(1,1,0,1); //黄色単色 } technique tecMinimum { pass P0 { VertexShader = compile vs_2_0 VertexShader(); PixelShader = compile ps_2_0 PixelShader(); } } っていうシェーダーなんですがD3DXCreateEffectFromFileによる読み込みの 段階で弾かれるんです、どこを直すべきなのかご教授願えませんか?
エラーメッセージの提示もなしで何をご教授なのだろうか
いやあ if( FAILED( D3DXCreateEffectFromFile(pDevice, _T("aaa.fx"), NULL, NULL, 0, NULL, &g_pEffect, NULL))) { MessageBox( NULL, "シェーダーファイル読み込み失敗", "", MB_OK); return E_FAIL; } とやってみるとダイアログが出るので読み込んでいないとしか・・・ こういうのってなにか足りないと読み込まないもんなんじゃないんですか?
(和訳)エラーメッセージはなんてでてるの?
HRESULTから文字列を取得できませんかそうですか
そもそも返り値ちゃんと見ろって話だろう。 HRESUT型でわざわざ返してくれるんだから。
>>746 とりあえず、関数名のPixelShader、VertexShaderは
予約語とかぶるから、別な名前にしたら?
つーかD3DXCreateEffectFromFileの最後の引数をNULLにすんな。
とりあえず D3DXCreateEffectFromFileの戻り値を調べるとか シェーダー内でコンパイルエラーが出てるなら 怪しいところ いったん全部コメントアウトしてどこで死んでるのか絞り込むとか 特別な知識がなくてもそれくらはできそうなものだけど
初心者スレでフルボッコかよwwwwwwwwww
戻り値・・・は-2147467259?
>>753 それだ!
VS PSにしたら動きました
馬鹿正直に英語にするんじゃなかった・・・
HRESULT: 0x80004005 (2147500037) Name: E_FAIL Description: An undetermined error occurred Severity code: Failed Facility Code: FACILITY_NULL (0) Error Code: 0x4005 (16389) だそうだ
会社でやったら恥かしくて失禁してるレベル
fxcに食わせれば直ぐにわかる内容ではあったな。
初心者スレだからしかたねえさ
ID3DXBuffer *compilation_errors = NULL; HRESULT hr = D3DXCreateEffectFromFile(d3ddevice, filename, NULL, NULL, 0, NULL, &effect, &compilation_errors); if(compilation_errors) { MessageBoxA(NULL, static_cast<char*>(compilation_errors->GetBufferPointer()), "", MB_OK); compilation_errors->Release(); } ?
VC++ならOutputDebugStringAのほうがいいけどね
XAudioのXAPOを使っていて、xapobase.libだけがリンクが通らないんだけど、 自分のアプリと関係する全部のライブラリをDLL版のランタイムを使うように直すしかないものでしょうか?
>>764 VSのディレクトリ参照でDirectXのディレクトリ参照を最優先にした段階で全体をビルドしてる?
DirectInput関係だったかでPlatformSDK側と干渉することがあるよ。
DXUTのサンプル、CutomUIで質問があります
IMEを使いたくてこのサンプルを弄ってるのですが、
以下のようにソースを改変しました
http://www1.axfc.net/uploader/Sc/so/45629.zip (変更したソース、実行ファイルが入ってます)
大まかにはF8キーが押されたときに
一旦終了処理を行い、再度スクリーンモードの全画面、窓を切り替えて
立ち上げなおすという処理を加えました。
これが問題なく動作する環境もあるのですが、
一部でフルスクリーンのとき限定でIMEに全角文字を打ち込むと??と表示されてしまいます
終了の処理等に問題あったらアドバイスいただければと思います。
詳しく見てないが、Comic Sansのフォントって日本語じゃないから、日本語部分をそのフォントで表示したら化けるの必須じゃね
説明不足してました、すみません 最初にフルスクリーンで起動すると、問題なく日本語全角入力することができます。 ウィンドウモードで起動し、フルスクリーンに切り替えた場合、 フルスクリーンで起動し、再度フルスクリーンで再起動させた場合 に入力がおかしくなってしまいます。 Comic Sansのフォントはサンプルがそれを使ってたのでそのまま使っていますが 全角で入力した部分だけゴシックっぽい文字で表示されるようです。 またMS ゴシックなどに明示的に変えても症状はかわりませんでした。
つーかまず、改変前はちゃんと動いてるのかどうか。
770 :
766 :2009/10/15(木) 02:07:32
改変前は問題なく動いています ソースを見てもらうのと分りやすいのですが、 WinMainの中でDXUTを使ってる部分を終了させ、再度DXUTを初期化して立ち上げ直すという処理を行っていて この立ち上げ直した際に、フルスクリーン限定でIMEに全角文字が入力できないという症状です。
>>770 さんとは関係ないけど
大量のポリゴン出すとDXUTのUI系テクスチャがバグる事があるんですが、同じ人いますか?
>>771 本当にテクスチャがバグっているのか、
Zバッファやステンシルバッファが汚染されて正しくかけないのか、
あるいはそれ以外の原因なのかによって話が変わってくるな。
>>772 う〜む・・確かに試した時にGOMプレイヤーだか何か起動していた気がするし
その関係かも知れません。
もう再現できないので分からない・・。
ご助言ありがとうございます。
今までプログラミングやってて、再現しにくいバグは全て読み込んだリソースがおかしいとかだったな
へぇ〜、そりゃあ狭い範囲のプログラミングだな。
バグのでるようなコーディングしてるからでござるの巻
はいはい バグじゃなくて仕様です
なにもオブジェクトを置いてないときの 背景の色ってどこでかえんの? 青一色なんだけど・・・
IDirect3DDevice9::Clear
DirectInputを使って、XBoxコントローラの左右トリガーの値を独立して取得するにはどうすればいいですか? XInputだと別々の値としてあるんですが、現状DirectInputだと一軸の+-としてしか取れなくて、 左右トリガーを同時に使うと相殺して0とかの値になってしまいます。
>>780 それはMSの嫌がらせ的仕様。
XBoxコントローラーのドライバをサードパーティー製に入れ替えれば取れないことも無い。
わりと有名なクソ仕様だよな。
783 :
781 :2009/10/17(土) 17:14:45
結局配布する場合は、ドライバをインストールさせるわけにもいかないし、 XBoxコントローラを検出したら、XInput使えってことになるんですかね。
784 :
780 :2009/10/17(土) 17:15:42
すみません。間違えました。783は781ではなく780です。
XInputはなぜかボタン数が10固定の制限があったりと いろいろXBox360型のコントローラー以外認めないですよ仕様があって鬱陶しいな。
頂点バッファだけでD3DPOOL_DEFAULTで インデックスバッファをD3DPOOL_MANAGED あるいはその逆とか 複数ストリームに頂点バッファをモデルとインスタンスとに分けて 描画したりする時もモデルだけMANNGEDでインスタンスを D3DUSAGE_DYNAMIC | D3DUSAGE_WRI-TEONLYのD3DPOOL_DEFAULT にするのはありですか?
どちらの書き方がより一般的でしょうか? //ソース1 if (FAILED(D3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &Device)) ) if (FAILED(D3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &Device)) ) if (FAILED(D3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &Device)) ) if (FAILED(D3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, HWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &Device)) ) return false; //ソース2 if (FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &Device)) && FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &Device)) && FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &Device)) && FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, HWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &Device)) ){ return false; }
DirectXと関係ないです
>>787 少なくとも後者はどのモードで起動しているのか分からない。
デバッグを容易にするためにも前者のほうがいい。
ただ、前者もここまで行数が増えるならカッコでくくらないと視認性に欠ける。
見苦しいからフラグを配列にブチ込んでfor文で回せば? 4時間前からDirectXの勉強始めた人間なんでテキトー発言だけど。
>>787 別にC言語としちゃあ間違ってないが、オレならそもそもそういったダダ書きは嫌だな。
引数を変えたい部分だけを残して残りを固定化したラッパー関数をまず用意する。
で、順にチェックしていって失敗したらエラー処理してreturnするように書く。
void InitD3dDevice() {
if(MyD3DCreate(D3D, ...))
return true;
if(MyD3DCreate(D3D, ...))
return true;
if(MyD3DCreate(D3D, ...))
return true;
if(MyD3DCreate(D3D, ...))
return true;
//全部失敗したのでエラー終了
}
DX11で作ろうぜ。どうせ趣味でやるなら楽なほうがいい。
俺ならまず処理内容と評価優先度を表すenumを作ったりする。 enum D3DDeviceConfig { D3DDEVCNF_HAL_MIXED = 0, D3DDEVCNF_HAL_HARDWARE, D3DDEVCNF_HAL_SOFTWARE, D3DDEVCNF_REF, D3DDEVCNF_MAX, // ループカウント };
794 :
786 :2009/10/17(土) 19:41:12
現実逃避するな
で、結局DirectX11はいつ出るの?
>>795 もうとっくにDirectX SDKに入ってるよ。
ただベータ版と違って正式版はどうもVistaでは動かない模様。
ちゃんと確認はしてないけど。
少なくともSlimDX経由では動かなかった。
>>789 >>790 >>791 参考になります。
こういった記述の多い条件分岐だと、書く人によって結構変わるんですね。
ひとつわからないことがあるのですが、
>>789 のモードとはなんでしょうか?
視認性の事ばかり考えていて、デバッグに関しては考えていなかったのですが
「モード」というものがわかると前者の方がデバッグしやすくなるんですか?
間にDXTRACE_ERRとか挟んだことないの? 失敗したときに何故失敗したのか分からないと 困ると思うんだけど
モードはHALなのかなんなのか、つまりどの呼び出しが成功したかってことだろ
>>796 さぁ早くDirectX11の解説サイトを開くんだ。
Dx10の話題ってあんまり聞かないけど おめーら使ってる?
DirectX11が出たから10は既に空気。 DirectX11で9以降に対応しているハードは動く。
俺はXPなんで10なんて使ったことあらへん。 つーかこのまま永遠にD3D9でいーよもう。 んで、ららびーが出たら完全ソフトレンダ化でD3D廃棄、 3D初心者総挫折っと。
むしろ、パイプラインがどんどん増えていってHLSLやらCompute Shaderやらで複雑化する一方の 今のDirectXの方が初心者総挫折だと思うけどな。 ソフトレンダ化でD3D廃棄なら、当然MSが代替SDKを出すだろうし。
というか、HLSLはきれいにまとまったchmヘルプやらはないのか!
DirectX3くらいのころ、Direct3DIMもRMも駄目だと息巻いて ソフトウェア3Dレンダー作ってた奴って世界で一人くらい生き残ってないの
>>804 パイプラインは複雑化したけど、頂点シェーダーとピクセルシェーダーだけで描画は出来るから
別にアレもこれもやろうとしなければAPI自体はいたってシンプルになってるとおもうぞ。
>>805 August2009にグラフィックだけに特化したchm入ってたぜ。
>>806 ある程度の年代以上ならいくらでもいるだろうけど、今はみんなD3Dでシェーダー書いてるんじゃないかね。
若い奴らの方がそういうのまったく出来ないんじゃね。
つーか、ComputeShaderなんて必要? GPUの仮想化が出来てるなら、 今までみたいに、何でもかんでもDX通さなきゃ駄目って 訳じゃなくなったんだろ。
まだビデオカードの性能に太刀打ちできる時代ならやろうとも思うが、 今となっては竹槍でB29と戦うようなものだからな。
ゲームの物理演算や乱立するGPGPU規格のまとめ役として必要だろ。 Win32APIにインターフェイスを用意したらDirectXとのデータの遣り取りが冗長になる。 GPGPUはCUDAやらBrookやら各社俺が俺が状態で一向に纏まらないし、 おかげでGPU物理演算が普及しないし。 Compute Shaderがあれば、BulletのGPUメーカーに依存しないGPUアクセラレーションの可能性が見えてくる。
あと5年ぐらいすれば淘汰されてどれ学べばいいかはっきりするんじゃね それまではCUDAとCompute ShaderとOpenCLを平行してやるしかないだろ。 まぁBrook+は要らんとしても。
XFILEからのアニメーションデータの読み込みが時間がかかるんで 既に読み込んであるアニメーションデータをバイナリデータでテキストに 吐き出しておいて、実行時に読み出そうと思ってるのですが、そういうのって 可能でしょうか? 割りとこういう質問すると「独自形式やれよカス」とレスがつけられるんですが 俺の力じゃ無理だ。
可能だろうけどあんまり変わらないのでは? モーションが一種類で同じ動きをするオブジェクトが複数あるって事?
それならバイナリデータのまま出力してそれを読み込まないと速度かわらなくね?
815 :
812 :2009/10/18(日) 18:05:13
>>814 ああ、そっかXFILEってバイナリデータ書き出しがサポートされてましたね。
訳の分からない質問してごめんなさい。
XFILEのテキストモードでの書き出し見る限り階層構造とかロード時に内部で
動的にくみ上げてるものだと思いましたが、バイナリモードのXFILEでやりとりすれば
自分が質問したことは普通にやってくれちゃってるのかも。
(つまりDirectXで扱いやすいように展開された状態でバイナリデータ書き出しされていると)
という事はXFILEの書き出しや読み込み時にバイナリさえ指定してしまえばこれ以上早くアニメーションをロードするのは難しいって事ですかね。
うーん。
アニメーションデータは、全部必要なのかな? 補間される事、表示同期のコマ数と同じか? 最適化される部分が色々あると思う。
バイナリデータでテキストに吐き出しってなんじゃそりゃ
間違っても行列でサンプリングされたモーションデータなんて使うなよ。 モーションブレンドが阻害される上に、無駄にでかくなるだけだから。
>間違っても行列でサンプリングされたモーションデータなんて使うなよ。 >モーションブレンドが阻害される上に、無駄にでかくなるだけだから。 これってどういうこと? 大抵LightWaveから書き出してるけど、その際はファイルサイズを抑えるために行列(Matrix)で書き出してる。 行列データだから拡大や移動なんかの普段使われないデータも入ってるから 無駄って事でFAなんだろうか?
要素をキーフレームではき出せば、サンプリングしなくても途中は補完出来るだろ。
影の描画ってどうすんの? 光源からオブジェクトを貫通した光が次に命中する部分を 黒くするようにすれば良いんだろうけど どうすればいいんだろ?
┌―――――――――┐ ┌――┐ |DirectX 影 | |検索| └―――――――――┘ └――┘
お前のケツを貫通させてくれたら 教えてやってもいい
オブジェクトのZ位置をステンシルバッファに書き込んで、 影が必要なオブジェクトをライトの方向に拡大してステンシルバッファにみに書き込み、 交差した位置のバッファを対象に、その位置を暗く塗りつぶす。
ただしオブジェクトは隙間がでないように、接合部分にポリゴンを追加しておく。
今時ステンシルは無いわ
とりあえず氏ね
830 :
デフォルトの名無しさん :2009/10/18(日) 22:16:45
コードを貼ってもらえなきゃ実装できませんてか
これってあれだろ 「分からないなら書き込まないでください」 とかいって情報を引き出そうとする下等テックニック ぐぐれカスと答えればおk
初心者スレ全否定ww
自分が何を分かってないかすら解ってない人間にものを教えるのは不可能 こういうアプローチで試して見ましたがうまくいきませんでした、なぜですか? という質問ならいつでも歓迎
テクスチャ描画用の板ポリ複数枚を一つの頂点バッファとインデックスバッファでまとめて DrawIndexedPrimitiveというのは普通だと思うのですが その際、任意の板ポリを描画しないだとかのオンオフはどのようにしていますか? 私は動的なバッファの場合、ポジションを画面外にするか0にするかとかしか思いつかんです。 静的なバッファならどうにもならないような・・・。
まだ初心者の頃はオブジェクトと光源位置からベクトルだして その方向にぶっつぶして黒くすることでやってたわ ただ角度のある物体には出来なくて悩んだなあ ところで二つのオブジェクトが近いとポリゴンが縞々に なるって見えるんだがこれはなにが原因なの? 一応配置を何とかしてるけど出来るなら解決したい どうすべきか?
>ところで二つのオブジェクトが近いとポリゴンが縞々に 誤差範囲内に入っているとしかたない。近くないようにデータを工夫する
>>835 物を教えるのは不可能と偉そうに言う前に
>>824 に突っ込んでやれよ
Z位置をステンシルに書き込むって
シャドウマップとステンシルシャドウをごっちゃにしてるんですか?ってよ
お前ら本当につかえないカスだな
ググって勉強してきたのかえらいぞ
841 :
837 :2009/10/18(日) 23:10:18
>>838 あーやっぱ無理か
調整で何とかすることにするわ
>>837 Zファイティング (Z-fighting) という現象
Zバッファの精度不足でZ値が丸められてしまい、
場所によって実際より手前になったり (Z値が切捨てられたり) 奥になったり (Z値が切上げられたり) して縞々になる
なるべく近クリップ面を遠くにして遠クリップ面を近くにすると、1個のZ値が担当する範囲が狭くなって精度が上がるので、
少しマシになるかもしれない (ならないかもしれない)
↓影ならGPGPUでレイトレやれと初心者に言う高飛車な回答者
↑ null
ブラックライトでええねん
テクスチャに投影してプロジェクションシャドウとかでいんじゃねぇの
>>836 基本的に、ON/OFFは毎フレームIndexBufferを書き直すことで表現する。
そのためのIndexBufferだ。
また、描画順を入れ替えても問題ない場合なら、切り替えたいメッシュを前側なり後ろ側なり集めて
DrawIndexedPrimitiveの描画Primitive数を変更するという方法でもいい。
初心者だったら シャドウマップかシャドウボリュームでぐぐって 自分で使いやすいほうを使えばいいと思うよ どっちも一長一短だからどっちが良いとはいえないし
>>847 ありがとうございます。良く分かりました。
850 :
デフォルトの名無しさん :2009/10/19(月) 09:25:18
普通にシャドウマップしか選択肢ないだろ 他の方法はソフトシャドウが出来なかったりしてだめすぎる シャドウマップなら指数シャドウマップとかバリアンスシャドウマップとか あとPCFもあるし ていうか最近のゲームでシャドウマップ以外はほとんど使われてないだろ
いまはGPUパワーでごり押しできるからシャドウマップが主流ではあるけど DirectX11が主流になればシャドウボリュームが盛り変えすかも知れない テッセレータとジオメトリシェーダで影の負荷を大分減らせそうな気がしてるんだが
シャドウボリュームはデータ作成の時点で面倒だからもう流行らない
データで持つんじゃなくて 頂点の生成をジオメトリシェーダで動的にやるって話じゃ? DX10が流行らなかったからあまり認知されてないみたいだけど
閉じたモデリングが面倒
閉じていない中途半端なモデリングなんかしたら、 影の生成以前に角度によってあり得ない穴が開いているように見えるだろ。
仮にシャドウボリュームを今のGPUでやるとしたら どれだけGPUにやらせることが出来るのかな? @境界エッジの抽出 Aシャドウボリュームの作成 Bシャドウボリューム描画x2 @〜BまでCPUの介入無しに行えたら、結構いいかも
シャドウボリュームがカメラにめり込んでる状態が非常にメンドイ
基本的な質問で悪いが、ちょっと教えてくれ。 フルスクリーンモード(Windowed=FALSE)のときに、モーダルダイアログを表示したいと思っている。 そのまま表示させるとフレームが塗りつぶされちゃってダイアログが見えなくなるんだが、 (マウスの反応そのものはしているようだ) フレーム描画をやめるだけで普通に表示できるようになるんだろうか?
>>857 カーマックが考案した方法なら、カメラがシャドウボリュームの中に入っても平気だよ。
逆にファークリップでシャドウボリュームが切られるとおかしくなるが。
>>858 GDI surfaceとFlipの問題があるので、たんに描画をやめるだけでは駄目。
IDirect3DDevice9::SetDialogBoxModeを使えばいい。
スキンメッシュで手足の部分に当たり判定がある オブジェクトがあるじゃないですか あれの実装って手足のメッシュコンテナのOBBを作って メッシュの動きにあわせてOBBを回せばいいんでしょうか? それとも他の方法があるんでしょうか?
別にOBBじゃなくて回転を考えなくていい球でやるのが簡単 ただ、確かセガだかが特許とってるはずだから商用利用の場合は注意
>>861 それでもいいとおもうが
細かい動きをするメッシュだと全部に作られちゃうから
そこんとこ考慮した方が良いと思う
前にロボの指にまで作っちゃったことあったからな・・・
>>859 思考実験すると、ファー以外にもビューボリューム全面でクリップが必要な気がするが
そのカーマックの方法ってどういうの?
>>862 多関節なら、球を使っても回転を考えなきゃならん気がするが。
つーか、そんなしょうもないもんで特許なんて取ってるの?
(VRシステムとかで取れるぐらいだから普通にありそう)
ちょっとセガが嫌いになった。
カーマックリバースとか懐かしすぎるだろ てか今更ステンシルシャドウか
>>864 スキンメッシュを行ってる以上すでに
各ボーンのワールド行列は全て計算済みのはず
あとはこの位置に球があると仮定して当たり判定を行うだけ
この程度の特許まだましな方
セガは調べるともっとどうでもいいことに特許はいっぱいとってる
あと、これは別にセガに限った話ではないので
特定社を中傷する意味で書いたわけでないのであしからず
>>864 カーマックの方法は、Z failでステンシルを更新する方法。
更新の仕方も逆で、シャドウボリュームの裏面でインクリメント、表面でデクリメント。
普通の方法では、シャドウボリュームの手前側の面がステンシルを更新した部分に
影ができるが、カーマックの方法は手前の面が更新しなかった部分に影ができる。
だから、ボリュームの中に視点が入っても大丈夫。
詳しくは「カーマック シャドウボリューム」「カーマックリバース」あたりでググるか、
DOOM3の技術解説でも読んで。
>>860 ありがとう。そのメソッドを呼んでみたけど、それ自体でInvalidCallが帰ってきちゃうなぁ。
デバイスの初期化周りを再検討中……。
870 :
デフォルトの名無しさん :2009/10/21(水) 01:17:00
( ^ω^)むほほ
質問です 2Dの、例えばオセロの盤面のような画面を作る場合、 マスごとにポリゴンを作るのと、一枚の大きなポリゴンにするのと、どちらがいいのでしょうか
一枚
873 :
デフォルトの名無しさん :2009/10/21(水) 16:20:34
常識的に考えて、処理する頂点は少ないほうがいいだろ
はじめまして、DirectXの参考書のサンプルコードを入力して、動作確認行っています。 ビルドはできるのですが、実行時エラーが出て動作しません。 サンプルは以下の部分でエラーでとまります。原因は何が考えられるでしょうか?
エラーは?
876 :
874 :2009/10/21(水) 16:36:59
// ビューイング行列の初期化 D3DXMatrixIdentity(&m_view); D3DXMatrixLookAtLH(&m_view, &D3DXVECTOR3( 0.0f, 0.0f, -6.0f), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f)); // シェーダプログラムの読み込みとコンパイル LPD3DXBUFFER errors = 0; D3DXCreateEffectFromFile(pD3DDevice, TEXT("basic.fx"), 0, 0, D3DXSHADER_DEBUG, 0, &m_pFX, &errors); if( errors){ return E_FAIL; } // シェーダプログラムへテクニックへのハンドルの取得 m_hTech = m_pFX->GetTechniqueByName("BasicTech"); ここで止まる! // シェーダープログラムのグローバル変数のハンドルの取得 m_hWvp = m_pFX->GetParameterByName(0, "g_wvp"); m_hColor = m_pFX->GetParameterByName(0, "g_color"); return S_OK; ------------------------------------------------------------------- デバッガ出力 D3DFWSample.exe の 0x00a02311 で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。 D3DFWSample.exe の 0x00a02311 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
877 :
デフォルトの名無しさん :2009/10/21(水) 16:40:29
シェーダー側のプログラムにミスがあるんじゃないの? fxc.exeで試してみろ
878 :
874 :2009/10/21(水) 16:59:15
fxc.exeの使い方はわかったのですが、HLSLファイルとはそのファイルでしょうか? それらしきファイルとして、下記コードでbasic.fxというファイルがあるのですが、 これでしょうか?
>>876 「0x00000000 を読み込み中」ってことはm_pFXがNULLになってるっぽいね。
D3DXCreateEffectFromFileは本当に成功してるのか?
errorsじゃなくて戻り値のHRESULTも見たほうがいいと思うよ。
// グローバル変数 float4x4 g_wvp; float4 g_color; // 頂点シェーダ void BasicVS( float3 in_pos : POSITION, out float4 out_pos : POSITION, out float4 out_color :COLOR0) { // 座標変換 out_pos = mul(float4(in_pos, 1.0f), g_wvp); // 頂点の色の決定 out_color = g_color; } // ピクセルシェーダ void BasicPS(float4 in_color : COLOR0, out float4 out_color : COLOR0) { // 入力された色情報をそのまま設定 out_color = in_color; } // テクニック宣言 technique BasicTech { pass P0 { vertexShader = compile vs_3_0 BasicVS(); pixelShader = compile ps_3_0 BasicPS(); } }
ぬるぽ
882 :
874 :2009/10/21(水) 17:20:22
>>881 サンプルプログラムを入力して、ビルド、実行させているだけで、
中身はあまりよくわからないです。
具体的に原因を指摘をお願いします。
そのサンプルをうpするか書いた本人人に聞けよ
>>882 どれを聞いてるのかな。
>>880 はHLSLだよ。
basic.fxは実行時どこに置いてる?
>>874 その動かないサンプルコードとやらをこの場ではお前しか持ってないのに
その挙動を人に尋ねるというのか?
そんなコンセンサスが得たいなら聖書でも読んでろ。
助言を得たいなら助言が得られるだけの詳しい情報を書け。
単純にfxファイルの置き場所がおかしいんでないの
だな。errorsに何も返ってないってことはコンパイル処理まで達してない。
888 :
874 :2009/10/21(水) 20:19:19
>>884 >>886 助言ありがとうございます。
fxファイルの置き場も、参考書のとおりにやっています。
Visual Studio 2008を使ってますので、その画面で説明します。
「ソリューションエクスプローラ」のプロジェクト名の直下にファイルを
置いています。
サンプルプログラムのcppファイルは「ソースファイルフォルダ」に
hファイルは「ヘッダファイル」に入れました。「リソースファイルフォルダ」
には何も入っていません。
889 :
デフォルトの名無しさん :2009/10/21(水) 20:22:31
ファイルの位置ってのは、普通にエクスプローラで見た時のファイルの場所のことだぞ
とりあえず参考書名とやってる章とプログラム名書きやがれ
>>882 >中身はあまりよくわからないです。
>具体的に原因を指摘をお願いします。
何?その横柄な態度
自分で考えるつもりがないならさっさと止めろよ
892 :
874 :2009/10/21(水) 21:29:35
>>889 basic.fxをC:\にありました。
よろしくお願いします。
>basic.fxをC:\にありました。 日本語でOK
"C:\\basic.fx"でD3DXCreateEffectFromFile呼び出せばいいんじゃね つか戻り値見れば、何が問題か特定できるだろ
日本人じゃなさそうだなぁ・・・
オレンジ君・・・?
要は.vcprjとか.slnとかのファイルと同じとこに.fxがあれば、ファイルパスの問題は無いと思う (ファイルパスに全角文字が含まれると問題あるけど)
898 :
874 :2009/10/21(水) 22:35:08
>>890 書籍名;DirectXシェーダプログラミング
仕組みからわかるゲームエフェクトテクニック
ページ:008から024まで
開発環境の準備とプロジェクトの作成
P18のサンプルプログラムの実行ができない。
よろしくお願いします。
900 :
874 :2009/10/21(水) 22:44:42
D3DXCreateEffectFromFileの引数を"c:\\basic,fx"にすると
実行時エラーはなくなりました。
ただ、この関数でエラーが帰り、次の行でreturnされました。
該当のコードは
>>876 使っている参考書は、VS2003,VS2005を前提に書かれていますが、
私はVS2008でサンプルプログラムの実行しています。
それが原因でエラーがでることはないでしょうか?
>>900 errorsに、エラーの詳細が書いてあるよ。
>D3DXCreateEffectFromFile 関数 >戻り値 > > 成功した場合は、D3D_OK を返す。 > > 失敗した場合は、次のいずれかの値を返す。 > D3DERR_INVALIDCALL メソッドの呼び出しが無効である。たとえば、メソッドの引数に無効な値が設定されている場合などである。 > D3DXERR_INVALIDDATA データが無効である。 > E_OUTOFMEMORY MicrosoftR Direct3DR が呼び出しを完了するための十分なメモリを割り当てることができなかった。
>"c:\\basic,fx"にすると 「,」 _,._ ( ゚Д゚) ガシャ ( つ O __ と_)_) (_()、o:。 ゚*・:。
DirectX初心者質問スレであってプログラミング初心者質問スレじゃないんだけど
日本語初心者のスレでもないしな
906 :
874 :2009/10/21(水) 23:16:23
907 :
デフォルトの名無しさん :2009/10/21(水) 23:53:55
バーテックスシェーダは動作するのですが、ピクセルシェーダがどうしても動作しません。
>>874 がみてる本と同じものを見てるので、fxファイルは
>>880 と同じものです。
引数名の頭を大文字にしたり、ピクセルシェーダの出力型?をCOLOR0からCOLORにしたり、
いろいろやっているのですが、バーテックスシェーダで出力される色が画面にでてしまい、
ピクセルシェーダをとおってないような挙動をします。
D3DXCreateEffectFromFileは正常終了しており、errorも見ています。(.fxにわざと間違いを書くと、errorに情報が出力されるのも確認してます。)
私のグラフィックスボードが少し古く、ハードウェアでPSに対応しておらずVSにしか対応してないので、
D3DDEVTYPE_REFフラグで、以下のように初期化も行ってます。
g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice )
何か教えてもらえると助かります。よろしくお願いいたします。
>>907 >880のシェーダーって頂点の色そのまま出すだけのシェーダーに見えるけど
>>908 説明不足でした。
実際には
>>880 から少し修正してます。以下に張り付けます。
VSの色出力にtexcoord情報をかけてますが、そのような色の三角形が画面に出力されてます。
PSを通ったら、白色の三角形が表示されるはずなのですが。
float4x4 g_wvp;
float4 g_color;
void BasicVS(float3 In_pos : POSITION, float2 In_tex : TEXCOORD0,
out float4 Out_pos : POSITION,
out float4 Out_color : COLOR0,
out float2 Out_tex : TEXCOORD0
)
{
Out_pos = mul(float4(In_pos, 1.f), g_wvp);
Out_color = g_color * In_tex.x;
Out_tex = In_tex;
}
float4 BasicPS(float4 In_color : COLOR0, float2 In_tex : TEXCOORD0) : COLOR
{
return float4(1.f, 1.f, 1.f, 1.f);
}
technique BasicTech
{
pass P0
{
VertexShader = compile vs_1_1 BasicVS();
PixelShader = compile ps_1_1 BasicPS();
}
}
910 :
デフォルトの名無しさん :2009/10/22(木) 00:34:38
>>909 HLSL使うならピクセルシェーダーは2.0以上でコンパイルするべきじゃないの?
1_1なんてもうサポートされてないだろ
912 :
デフォルトの名無しさん :2009/10/22(木) 00:45:18
>>910 ,
>>911 ありがとうございます。
一応、2.0や3.0も試してるのですが、さっぱりなんです。
VSからの色出力には、.fxファイルの変更に応じて反応があるのですが…。
SetRenderStateとかで何か重要なパラメータを設定してないのか?
とかもいろいろ考えてますが…なかなかそれらしいものが見つからずです。
913 :
871 :2009/10/22(木) 00:52:12
>872-873 回答どうも そうすると、一枚のポリゴンに何十というテクスチャを貼ることになるのですが、 シングルパスで描画できるんでしょうか? それともやはりマルチパスでやった方が良いのでしょうか?
>>912 REFモードのサンプルもねー状態でやってんの?
あったらまずそれを動かせよ
>>913 > 2Dの、例えばオセロの盤面のような画面を作る場合、
オセロ盤はテクスチャ1枚、板ポリ1枚で済むでしょ?
>そうすると、一枚のポリゴンに何十というテクスチャを貼ることになるのですが、
どういうこと?
ゲーム進行に合わせて盤面を書き換えていかないといけないから、ってことじゃないの?
MultiSampleTypeにD3DMULTISAMPLE_4_SAMPLES等の値を指定してやることで アンチエイリアスがかかるのですが、露光表現等のピクセルシェーダの エフェクトを使うために一度モデルをテクスチャに描画する必要がある場合に これらの設定でのアンチエイリアスが無効になってます。 これって解決の方法があるんでしょうか? できれば露光表現もアンチエイリアスも併用したいのですが。 分かりやすくいうと。 バックサーフェイスにモデルを描画するとアンチエイリアスがかかる。 テクスチャにモデルを描画するとアンチエイリアスがかからん。
>>917 もしNVだったらバグでAAされない事がある。XPで発生する。
コピー先とコピー元のサイズを違うようにすれば何故か回避される。
同一サイズの場合なんらかの、インチキスケジューリングが発動する模様。
やってるとは思うがレンダ後の映像を得たいなら非マルチサンプリング化も忘れずに。
919 :
871 :2009/10/22(木) 02:08:21
>915 オセロの盤面がマスごとに白丸や黒丸を置かれるように、 マスごとに状況に応じてテクスチャを貼り付けたいわけです その場合の描画処理はどういう手順にするのが効率が良いのかを聞きたくて質問しました わかりにくくてすいません
●ごとにポリゴン置けばいいじゃないか? 自由に置けるしアニメーションもできる。 わざわざ一体化させる意味がわからん。
921 :
871 :2009/10/22(木) 02:16:54
つまり、複数のポリゴンを作って描画した方がいいということですね わかりました
全マスに置いたときを考えると ○●□をマスごとおいたほうが描画処理軽いなたしかに
テクスチャのアルファ部分だけをフェースカラーで塗りつぶしたいときは、 ピクセルシェーダでアルファ値で条件分けして出力を変えればいいんでしょうか? (テクスチャの透明でない部分はテクスチャの色をそのまま出力したい) もっと簡単な方法はありますか SrcBlend = SRCALPHA; DestBlend = INVSRCALPHA; でやればできるのかと思ったら、テクスチャの透明でない部分がフェースカラーと混ざってしまうので
924 :
デフォルトの名無しさん :2009/10/22(木) 08:32:29
素直に二回プリみれよ
>>917 テクスチャにMSAAの指定があるのはDirectX10からだぞ。
DirectX9でやりたいならMSAA指定のサーフェイスと深度バッファ作って
レンダリング後にStrechRectでテクスチャに転送ってやらないとダメだぞ。
デバイス生成時のMSAAの設定は「バックバッファサーフェイス」への設定でしかないぞ。
926 :
917 :2009/10/22(木) 10:20:14
>>925 テクスチャへのMSAAはDirect10からなのですね。
ありがとうございました。
927 :
デフォルトの名無しさん :2009/10/22(木) 13:50:56
/ ̄\ r ┤ ト |. \_/ \ | __( ̄ | 彡 | __)_ノノハ@ < >>ゲッツ!!! ヽ___) ノ‘д‘.) / ̄\ . > ⌒ヽ | ├ r / へ/ \_/ .| / / |  ̄)__ | )) レ ノ ヽ_(__ | / ミ (___/ / /| / /( ( 、 \ | | 、 \ サッ ! | | \ \ . | / \ ⌒l | | ) / ノ )゛゛゛゛゛゛ し'゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛ (_/
すみません関数の引数で2D座標を1つの変数で受け取りたいんですが D3DVECTOR2とすると定義されていない識別子と警告が出ます。 DirectX9でd3d9.hとd3dx9.hをインクルードしているのですが・・。 2D座標を1つの変数で受け取るにはどうすれば良いでしょうか?
D3DXVECTOR2
>>929 Xが抜けてたんですね・・ありがとうございました。
せめてヘルプくらいダウンロードしようよ・・・
932 :
デフォルトの名無しさん :2009/10/22(木) 18:46:19
MSDNじゃだめなん?
ドキュメントブラウザじゃなくて、普通のWebブラウザで見れる形式でDLってできる? MSDNライブラリ
DirectSoundを使いたいんだけど IDirectSound8 *g_pDSound; DirectSoundCreate8(NULL, &g_pDSound, NULL); ってのと LPDIRECTSOUND8 g_pDSound; のどっちが正しいんですか? なぜか下の方は g_pDSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL); でエラーが出るんです これはもしかして持ってる資料が古い・・・?
エラーコードを書きたくない理由は?
面倒くさい
だるい
えーとエラーは 0x00416858 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。 あとは・・・hWndに式を評価できないとでているんですが 妙だな他のは問題ないはずなんだが・・・
眠い
IDirectSound8* = LPDIRECTSOUND8 LPDIRECTSOUND8 g_pDSound; DirectSoundCreate8(NULL, &g_pDSound, NULL); が正しい
941 :
934 :2009/10/22(木) 23:30:55
あーそうなんですか ちょっと資料調べてみます もしかするとかなりショボイミスをしてる気がしてきた すいませんでした
もしかして、”下の方”ってのは、宣言文を置き換えただけじゃなくて、 DirectSoundCreate8を呼ばないってことなのか
シャドウマップに収めるZ値って 普通の透視変換のやつじゃ駄目かな? ライトに近いほど精度高くなるって意味なさそう。 みんなはどうしてる?
944 :
デフォルトの名無しさん :2009/10/22(木) 23:59:36
普通にLSPSM使えばいいじゃん
すみませんDirectX9でなのですが、 バウンディングボックスからD3DXVec3Projectでメッシュに対応する2D座標を作っているのですが バウンディングボックスのmin max値は正常に出力できていて そこからカメラ横回転を4分割(90度毎)。 縦を水平以上か以下かで2分割の計8分割し どの3D頂点が2D座標のどの最大/最小値になるかリストを作って計算しているのですが、 2Dのxの最大値と最小値が入れ替わっていたり 2Dのy座標が角度によって入れ替わったりとアベコベな状態になってしまいます。 2日程無理やり数値が合うようにならないかあれこれ試しているのですが上手く行きません; バウンディングボックスから正しい2D座標を割り出す計算式は有ったら紹介して下さると助かります orz もしかしてD3DXVec3Project使ってるのは自分くらいで他の方法で実現するのが定番だったりするのでしょうか;
正直日本語が分からん お前の頭の中ではそれで完結してるのかもしれんが 他人に理解してもらうにはもう少し努力が必要
言葉が抜けてますね・・すみません orz なんとか無理矢理補正する方法を見つけたので ブラックボックスが出来たような嫌な気分ですが・・実装は出来ました。 失礼しましたー・・ orz
948 :
858 :2009/10/23(金) 14:13:00
SetDialogBoxMode()を正常に呼び出せるようになった。 なんとD3DDeviceの初期化時に画面モードをA8R8G8B8にしていたのが原因だった! X8R8G8B8にしたら問題なし。 ただ描画を止めている間、再描画が行われないので他のウィンドウで隠れた部分がつぶれてしまうな。 WM_PAINTのハンドラを実装するのが面倒に感じたので、 いったんビットマップでゲーム画面のキャプチャを作成して PixtureBoxに貼り付けて表示させることにした。 Win32APIで直接書いてるならここまでやらなくてもいいけど、 さしあたりこれでも速度上の問題はないのでよしとする。
すみません。 メッシュコンテナからバウンディングボックスを生成する関数は無いでしょうか? D3DXFrameCalculateBoundingSphere()なら見つかるのですが・・。
D3DXComputeBoundingBox
>>948 SetDialogBoxModeをTRUEにすると、Presentでダイアログが上書きされなくなるから
描画を止める必要はないよ。
>>950 やっぱりメッシュコンテナから直接ボックスってのは無いんでしょうね。
ありがとうございました。
リソースの作成に関してヘルプにほとんどのアプリケーションはD3DPOOL_MANAGEDが 良いみたいな事を書いてあったので疑問に思ったことを質問させてください。 D3DPOOL_MANAGEDを指定するとビデオ メモリーとシステム メモリーの両方にメモリが確保されるようですが これを使うメリットってデバイスリセット時の自動復旧だけなんですか? だとするとデバイス失効時の対処が苦にならない場合は静的なバッファであっても D3DPOOL_DEFAULTで作成した方が速度の面でもメモリの面でも 有利という事ですか?
MANAGEDにしておけばビデオメモリが足りなくなっても何とかしてくれるかもね。
>>953 色々と制限があるぞ。例えば一部初期化方法を除いてロックできないとか。
それが分かっているなら好きにすればいい。
プログラミングは自由なものなんだから。
D3DPOOL_MANAGEDはIDirect3D9Ex以降で使えない
D3D9では素直にD3DPOOL_MANAGEDを使っておく方がいいよ。 頑張って作っても複雑怪奇なシステムに仕上がるし、どうせ将来性がない。 D3d9前提ののシステムをVista以降に向けてリファクタリングする過程で9Exを通過し、 そこでMANAGED不要になっておくのが吉。
>>955 >色々と制限があるぞ。例えば一部初期化方法を除いてロックできないとか。
確実に使い方が分かっていない。
出直してこい。
色々とレスありがとうございます。
>>954 今までビデオメモリが足りなくなるという状況は考えていませんでした・・・。
そういう場合、普通は確保時に失敗するんでしょうね。
仮にMANAGEDが自動で何とかするとしても描画毎にシステムメモリとビデオメモリを
往復しないといけないので毎回デバイスをリセットするのと同じように重くなる気はします。
>>955 MANAGEDには制限がありますが、DEFAULTはそれに比べフリーですよね。
>>956 まじっすか?レガシー気味?
>>957 将来性がないっていうのは、複雑奇怪なシステムを作った場合の話ですよね?
私はリソース管理をDXUTを通して行なう予定なので
リソース管理におけるMANAGEDとDEFAULTの複雑さは変わらないし
描画シーンの管理としては動的なバッファを多用するほうが楽な気がします。
960 :
953 :2009/10/23(金) 22:15:46
皆様のレスに答えながらHELPを読み直した結果を、 自問自答っぽいくなりますが、まとめてみます。 >静的なバッファであってもD3DPOOL_DEFAULTで作成した方が >速度の面でもメモリの面でも有利か? DEFAULTで作成したバッファはMANAGEDで作成したバッファより 速度重視の領域に置かれやすい。 逆に言えば動的なバッファ用にその領域を残しておくのが吉。 もしも動的なバッファを作らなければMANGEDがその領域を使うだろうし。 そしてMANAGEDが使うシステムメモリもRAMを奪うわけではないので メモリの面でMANAGEDがネックになるとも思えない。
結局、DEFAULTのリソースがひとつでもあれば それ用の管理機能が必要になるし、 その管理機能があればMANAGEDはいらないし。 多少凝ったことをすればDEFAULTは外せないし。
エフェクトファイルが複数ある場合、1つのテクニックで書き直さないといけないのでしょうか? トゥーン+映り込み(環境マッピング)+バンプの3つのエフェクトファイル(.fx)があってそれぞれ単体では正常に動くのですが、 同時に2つ以上を使いたい場合どうなるのかと思いまして。
964 :
デフォルトの名無しさん :2009/10/23(金) 23:33:13
質問させてください。 VC++2008ExpressEditonを使ってDirect3Dを触っているのですが、 .ddsファイルを点灯表示するプログラムを作りました。 しかし、exeの相対パス上に.ddsファイルがないとエラーで終了してしまいます。 exeに.ddsファイルを組み込む方法はないのでしょうか?
>>964 普通にexeにリソースとして放り込んでおけばいいんじゃね?
D3DXでリソースを読み込むAPIだってあるんだし。
DirectX関係ないし? >exeの相対パス上に.ddsファイルがないとエラーで終了してしまいます。 意味が分からん exeと同じフォルダにddsがないと落ちるって意味なのか?
967 :
デフォルトの名無しさん :2009/10/24(土) 00:01:59
関係ないかも DirectX使う上で外部にあったらじゃまなファイルを exe内に取り込むVC++的技があるんじゃないかな〜・・・と思いまして
あーHSPみたいに必要なファイルをまとめたいのね シェーダーをソースに書くってのは出来るけど・・・
リソースで埋め込む方法も知らないなんてどんだけ素人なんだよ!
埋め込むのはいいけど データが増えると数100MBとか数GBのexeが出来上がるけどいいの?
EEだとリソースの管理できないのでテキストで.rcファイル作ってビルド時にrc.exeを外部プログラムの実行できるようにすればいい 作るほうはDirectX関係ないのでここじゃ説明しない
二つに分ければ50MBだな
973 :
デフォルトの名無しさん :2009/10/24(土) 00:57:44
左様ですか お作法的には外だしが基本ということですかね。
>>962 2つのエフェクトファイルを同時に使うということ?
それは無いな。include使えばいい。
DirectXでリストボックスの代わりに使えるようなものがSDKのサンプルの中にあるでしょうか? あったら実装する方法を教えてください
大抵のサンプルのデバイス設定はリストボックスになってるだろ お前の目は節穴か
977 :
975 :2009/10/24(土) 10:30:10
設定のとこはプルダウンメニューっぽいですが、 ボタンを押さずリストボックスだけ利用する方法があるのでしょうか? あるのなら実装方法を教えて欲しいのですが DXUTguiとDXUTsettingsdlgにあるのだろうとは思いますが、 どこが使われているのか分かりません
あ、プルダウンメニューじゃなくてドロップダウンリストぽい、でした
よく分からないけどCDXUTListBox classってのが見つかったので、 多分これですよね 詳しく見てみます
DirectSoundでwavを再生しようと思うんですが LPDIRECTSOUNDBUFFERに音楽データーを書き込むわけですから 音一つにつきバッファは一つずつ用意した方が良いんでしょうか?
はい
>>980 オンメモリ再生したいのかストリーミング再生したいのかで話が変わってくるんじゃね?
ていうか今時ならXAudio2使ったらどうよ。
983 :
980 :2009/10/24(土) 18:38:00
オンメモリって一回全部読むやつですよね じゃあそれです Xaudio2か・・・健闘してみます
何度も実行しているうちにテクスチャが表示されなくなるんですけど これはもしかして終了時に解放してない部分があるって事なんでしょうか?
何度も実行してるのかコードの一部なのかプログラム自体なのかで話が変わってくるだろ常考。 なんで質問する子は舌っ足らずなのばかりなのか……。
わかってりゃしつもんしねーよあほ
988 :
985 :2009/10/25(日) 00:13:18
毎度毎度出現する貴様はだれだ?
>>986 はあ
プログラムのスタート時にXファイルを読み込んで
終了時にデータを破棄しているんですが
実行→終了を繰り返しているうちにオブジェクトのテクスチャが消え
真っ白になってしまうんです
やはり何か解放忘れがあるからこのような症状が出るんでしょうか?
>>985 とりあえず、リソースの開放と取得のタイミングでログを書き出して眺めてみたら?
リソースリークはトレースして解析するのが基本。
でも毎回思うんだけど この辺に関してVCが役立たずすぎる リークにしてもせめて確保したソースの場所ぐらい newやdelete、createやreleaseに仕組みを入れてもいんじゃねぇか? デバッグバージョンぐらいにはよ
Managed DirectXでも使えばいいじゃないか。 見捨てられてるけど
>>992 すでにそれがなにもんかすらわからねぇよw
それは無知なだけ
>>994 じゃあ、これからManaged DirectXって流行るの?
>>988 Xファイルのテクスチャが複数あるのに1つしか解放していないとかよくあるミスはまさかね。
テクスチャを読み込んでいる部分がメモリ破壊されていて、偶然上手く動いているという面倒な原因もあるから注意ね。
まぁ、テクスチャやXファイルなんかは管理するクラスを作っておいて、
最悪実行終了時に全解放する関数を走らせるのが無難かな。
Xファイルだとそこらの解説サイト通りに組み込むと使用するテクスチャが同じなのに別々に読み込む無駄が出るし。
与謝蕪村って誰? → お前無知だな → え、この人って流行るの? そんな時代もありました。
DirectInputでジョイスティックの軸入力の分解能とか取得できますか?
>>991 そういう機能ってVC6の頃からあるよ。
VCは悪くない。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。