【C++】 DirectX初心者質問スレ Part28 【C】
1 :
デフォルトの名無しさん :
2010/03/16(火) 00:16:48 ※回答する人も、質問する人も必ず読んでください これらに当てはまる人のための質問スレです。 1.C/C++は多少理解している。 2.最近DirectXを始めたばかり 3.SDKを見ても、Googleで検索しても、いまいち理解できない人 4.余計な雑談は不要ですよ 【 回答してくださる方 】 ・ できるだけ優しく質問に答えてあげてください。 ・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。 「ググれ」「SDK見れ」以外の回答でおながいします。 ・ 神ですら理解不能な質問は無視して下さい。 【 質問する方 】 ・ どんな事で躓いているのか明確にしよう。 ・ 長くならないなら躓いている部分のコードを晒してみれ。 ・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。 ・ 回答して貰ったら、出来るだけお礼もしよう。
3 :
デフォルトの名無しさん :2010/03/16(火) 19:16:58
質問です。 立方体をポイントリスト、ラインリスト、トライアングルリストで描画しようとしているのですが、 ポイントもラインもポリゴンも真っ黒になってしまいます(背景は青色) 頂点フォーマットは (D3DFVF_XYZ | D3DFVF_PSIZE | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ) の形式で、描画直前に頂点バッファをロックしてdiffuseの値を確認してもちゃんと入ってます。 カラーは0x44ff00ffのような感じで入れて、色々変えてテストしてるんですが、 半透過で表示した場合、最初の44の所を色々変えると、ちゃんと透過の濃度は変化しているので、 カラーは確実に読んでると思います(ただし真っ黒からどんどん薄くなる感じです。赤や青に出来ません) こういう状況を見て、「あー、これは多分あそこがおかしいんだな」と推測がつく方おられますでしょうか? 現状詰んでます。宜しくお願いします。
>>3 SetRenderState(D3DRS_LIGHTING, FALSE)
あと、D3DFVF_PSIZEがなんで入ってるの?
質問です。 板ポリのUV座標(画像内座標)の指定をピクセル単位でやりたいのですが、 何か上手い方法はありませんか?
>>5 そう言うピクセルシェーダーを書けばいいじゃん
板ポリの大きさとテクスチャの大きさを渡せば、シェーダー内でUV値出せるだろ
7 :
3 :2010/03/17(水) 02:55:50
>>4 有難うございます。色が表示されるようになりました。
PSIZEはポイントスプライト表示の時の大きさ格納用に入れてます。
8 :
デフォルトの名無しさん :2010/03/18(木) 00:00:50
質問です DirectX9cを使っています 画像表示、文字表示、キーボード入力をしようとしました コンパイルは通りましたがメイクをすると 外部シンボル ×××が未解決(・・・・MAIN.OBJ が参照)と表示されます ×・・・D3DXCreateSprite、D3DXCreateTextureFromFileA、D3DXCreateFontA の3つです キーボード入力を除くとメイクは問題なし またに画像表示、文字表示を除くとメイクは問題なし ですがキーボード入力+画像表示 or 文字表示でメイクが通らなくなり困っています ソースファイルはmain.cppのみです どなたかご教授お願いします
キーボード入力を除いた版は実行すると画面に画像は出る? コンパイラが最適化して根こそぎ削られてたりして
どれもd3dx9.libが必要だけど、ちゃんとリンクしてる?
いったんクリーンしてリビルドで治るやも
プロジェクトごとうpした方が早くないか
変な質問すみません、 3Dの着せ替えシステムを実装したくて、現在モデルをそれ用に加工しているのですが、 「着せ替え時はメッシュコンテナのポインタを入れ替える事でできる」 と以前お答えを頂いたのですが、スキンメッシュの話で 「ボーン構造と頂点数が同じじゃないと駄目」といった話を聞き不安に…。 つまり、入れ替えるモデルは全て頂点数が同じじゃないと駄目なのでしょうか? 別にそんな事はないのでしょうか?
15 :
9 :2010/03/18(木) 20:59:35
>10 >キーボード入力を除いた版は実行すると画面に画像は出る? >コンパイラが最適化して根こそぎ削られてたりして 表示されています BCC Developerのプロジェクト設定で「最適化しない」にしています >11 必要な*.libは*.dllに変換しリンクしています #pragma comment( lib, "d3d9.dll" ); #pragma comment( lib, "d3dx9.dll" ); #pragma comment( lib, "dinput8.dll"); #pragma comment( lib, "dxguid.dll" ); >12 クリーンというのは、以前作られている*.obj等を削除する事でしょうか? 削除して試してみました >13 BCC Developerの環境でもアップしていいのでしょうか?
#pragma comment( lib, "d3d9.lib" )
>>14 そんなの実装する側次第だから、自分で何とかすれば良いだけの話。
>>15 BCCはよくしらんけど、どゆこと?
>必要な*.libは*.dllに変換しリンクしています
18ですが、↑は自分で調べられそう。いろいろあるんですね。無視してください
20 :
14 :2010/03/18(木) 22:55:49
>>17 ありがとうございます。実装次第で大丈夫なんですね。
知らない仕様かと思いあせってました。感謝っ
21 :
9 :2010/03/18(木) 23:05:54
解決しようと色々いじってたら 環境が変になった DirectX SDKから落しなおしてきます
22 :
9 :2010/03/19(金) 01:34:26
環境の再インスコ(バージョンアップ)+環境再設定で無事解決しました。
解決内容
・DirectX 9.0 SDK October 2004 → DirectX 9.0 SDK October 2005に変更
・October 2004では*.lib→*.dllの変換ができたができなかった
明日PC起動後もう一度試してみます
・変換できなかった為、おそらくロシア人の方が用意してくれている
BCC Developerに変換しなおした*.libと配布用*.dllをDLし配置
※変換されているのはDirectX 9.0 SDK Update (April 2007)後日再度SDKをアップ予定
ttp://www.clootie.ru/cbuilder/index.html#DX_CBuilder_SDKs ・BCC Developerのデフォルトライブラリ先・インクルード先設定を修正
・コンパイル→メイクで問題なく実行ファイル生成し、動作も問題ありませんでした
質問に答えてくださった数名の方ありがとうございました
後日、変換に関してとDirectX 9.0 SDK Update (April 2007)に変更後に関して記述します
23 :
デフォルトの名無しさん :2010/03/19(金) 05:38:51
>>14 アニメーションは同じままってことだよね?
その場合、ボーンは同じじゃないと、アニメーション時に破綻しちゃうのでは?
さすがに頂点数は違っても、スキン情報もちゃんと連動して変更すれば大丈夫だと思う。
24 :
デフォルトの名無しさん :2010/03/19(金) 14:45:30
スキンメッシュにシェーダーをかけたいんですが これはスキンメッシュの各部分に普通のシェーダーをかけるようにすればいいのけ?
>>24 そうそう
フラグメントリンカ使えば動的にスキンメッシュの部分だけ作れるよ
質問です。 Direct3Dでゲームを作っているのですが、 デバイスロスト対策部分を現在開発中です。 ※テクスチャをレンダリングターゲットにしています 一応、基本的なロスト対策は出来ている状態です。 ・フルスクリーン⇔スクリーン ・フルスクリーンAlt+Tab が、ここでCtrl+Alt+Delを押すと、 デバイスの再生成に失敗します。 いろいろ試した結果、Ctrl+Alt+Delで表示されるウィンドウ表示中に デバイスを生成すると、失敗するようです。 Ctrl+Alt+Delで表示されるウィンドウ表示中は処理を保留したいのですが、 このウィンドウが表示されていること検出する方法を教えて下さい。
そんなん問題になったことないけどな。 D3DERR_DEVICELOST ・いったんメッセージループへ戻り(必須)、TestCooperativeLevelがD3DERR_DEVICENOTRESETを返すのを待つ。 ・D3DPOOL_DEFAULTリソースの破棄は可能 D3DERR_DEVICENOTRESET ・Resetする。 の手順は守ってるか?
28 :
26 :2010/03/20(土) 13:03:39
>>27 返信ありがとうございます。
自分のソースを確認したところD3DERR_DEVICELOSTになった後、
TestCooperativeLevelがD3DERR_DEVICENOTRESETを返すのを待たずに
再生成していました。
回答の通りにソースを書き直したところ、解決しました。
ありがとうございました。
自分で、簡単なモデラーを作ろうと思っているのですが、頂点の選択部分がうまくいきません。 実際の頂点と WM_LBUTTONUPから取得したマウス座標(lefttopとrightbottomのx、y)から変換したlefttopなどの変数とずれが生じてしまいます。 自分の考えとしてはビュー変換→プロジェクション変換し、スクリーン座標系にに頂点、マウス位置を変換すれば単純に比較が可能だと思ったのですが、 どうしたらうまく選択できるのでしょうか。 bool verManage::IsSelectV(D3DXVECTOR3 lefttop,D3DXVECTOR3 rightbottom,int num){ D3DXVECTOR3 pos(verX[num],verY[num],verZ[num]); D3DXMATRIXA16 matProj,matView,matWorld; D3DXMatrixIdentity(&matWorld); pDevice->GetTransform( D3DTS_PROJECTION,&matProj); pDevice->GetTransform( D3DTS_VIEW,&matView); D3DXVec3TransformCoord(&pos,&pos,&matView); D3DXVec3TransformCoord(&pos,&pos,&matProj); D3DXVec3Unproject(&lefttop,&lefttop,&Viewport, &matProj,&matView, &matWorld); D3DXVec3Unproject(&rightbottom,&rightbottom,&Viewport, &matProj,&matView, &matWorld); D3DXVec3TransformCoord(&lefttop,&lefttop,&matView); D3DXVec3TransformCoord(&lefttop,&lefttop,&matProj); D3DXVec3TransformCoord(&rightbottom,&rightbottom,&matView); D3DXVec3TransformCoord(&rightbottom,&rightbottom,&matProj); if(pos.x>lefttop.x&&pos.y>lefttop.y&&pos.x<rightbottom.x&&pos.y<rightbottom.y)return 1; return 0; }
30 :
デフォルトの名無しさん :2010/03/21(日) 00:36:01
デバイスロストについての質問です デバイスロストが起こった場合、 発生前に使っていたリソース(D3DPOOL_MANAGEDが使えないもの)を再構築しなければならない とのことなのですが 動的に生成、破棄されるクラスの中にリソースを入れてある場合、 デバイスロストが発生した時点で、再構築しろというメッセージを各オブジェクトごとに送らなければなりません 素人の私の考え方だと、 「現在生成されているオブジェクトのリスト(いくつかのポインタ)を作っておいて、 それで各オブジェクト(すべてが同じクラスのオブジェクトとは限らない)に再構築しろというメッセージを送る」 こんなイメージが漠然と描かれるのですが、 もっと楽、または適切、または効率が良い方法があれば教えていただきたいです
>>29 まさかと思うが、浮動小数点型を float == float 見たくしてないよな?
違うならば、ズレとはどの程度かを言いたまえ
>>29 そのコードが何をしたいのか意味が分からない。
3歩進んで2歩戻るようなことしてるし。
D3DXVec3Unprojectいらんだろ。頂点をD3DXVec3Projectで画面座標に変換しろよ。
34 :
9 :2010/03/21(日) 22:46:05
遅くなりましたが報告 *.lib → *.dllの変換は不可 DirectX 9.0 SDK Update (April 2007)に換えてみたが 今の所問題はなさそう 以上、 名無しに戻ります
35 :
29 :2010/03/21(日) 22:47:50
D3DXVec3TransformCoord(&pos,&pos,&matView);
D3DXVec3TransformCoord(&pos,&pos,&matProj);
D3DXVec3Unproject(&lefttop,&lefttop,&Viewport, &matProj,&matView, &matWorld);
D3DXVec3Unproject(&rightbottom,&rightbottom,&Viewport, &matProj,&matView, &matWorld);
D3DXVec3TransformCoord(&lefttop,&lefttop,&matView);
D3DXVec3TransformCoord(&lefttop,&lefttop,&matProj);
D3DXVec3TransformCoord(&rightbottom,&rightbottom,&matView);
D3DXVec3TransformCoord(&rightbottom,&rightbottom,&matProj);
を
D3DXVec3Project(&pos,&pos,&Viewport, &matProj,&matView, &matWorld);
に買えただけでうまくいきました。
>>32 ,33 マウスクライアント座標と頂点の比較のし方が分からなかったので、
一度ワールド座標に変換、その後D3DXVec3Unprojectでスクリーン座標にするという
方法にしました。ただそれだと、1.0fほどX座標に違いが生じてしまっていました。
とりあえず、うまくいきましたので、お礼をさせていただきます。
D3DXVec3ProjectとD3DXVec3Unprojectを真似してみた。 SSE2を無効化してもD3DXVec3Unprojectに誤差が出る。完全に同じは無理だった。残念。 で、これをみるとわかるが、D3DXVec3Unprojectの結果をD3DXVec3Projectしても元には戻らないね。 D3DXVECTOR3 * MyD3DXVec3Project(D3DXVECTOR3 * pOut, CONST D3DXVECTOR3 * pV, CONST D3DVIEWPORT9 * pViewport, CONST D3DXMATRIX * pProjection, CONST D3DXMATRIX * pView, CONST D3DXMATRIX * pWorld) { D3DXMATRIX matWVP = *pWorld * *pView * *pProjection; D3DXVECTOR3 vTmp; D3DXVec3TransformCoord(&vTmp, pV, &matWVP); pOut->x = pViewport->X + (1.0f + vTmp.x ) * pViewport->Width * 0.5f; pOut->y = pViewport->Y + (1.0f - vTmp.y ) * pViewport->Height * 0.5f; pOut->z = pViewport->MinZ + vTmp.z * ( pViewport->MaxZ - pViewport->MinZ); return pOut; } D3DXVECTOR3 * MyD3DXVec3Unproject(D3DXVECTOR3 * pOut, CONST D3DXVECTOR3 * pV, CONST D3DVIEWPORT9 * pViewport, CONST D3DXMATRIX * pProjection, CONST D3DXMATRIX * pView, CONST D3DXMATRIX * pWorld) { D3DXMATRIX matViewport( pViewport->Width * 0.5f, 0, 0, 0, 0, -(pViewport->Height * 0.5f), 0, 0, 0, 0, pViewport->MaxZ - pViewport->MinZ, 0, pViewport->X + pViewport->Width * 0.5f, pViewport->Y + pViewport->Height * 0.5f, pViewport->MinZ, 1.f); D3DXMATRIX matWVPVp = *pWorld * *pView * *pProjection * matViewport; D3DXMatrixInverse(&matWVPVp, NULL, &matWVPVp); D3DXVECTOR3 vTmp; D3DXVec3TransformCoord(&vTmp, pV, &matWVPVp); *pOut = (D3DXVECTOR3&)vTmp; return pOut; }
右手座標系のデータを読み込んでスキニングしようとしたんですけど うまくアニメーションされません。スキニングしない場合は正常に表示されます。 もしかしてボーン行列の掛け算の順序とかも変えないといけないんでしょうか?
読み込み時に左手座標系に変換して何が間違っているのか確認しろ。
>>38 ヘルプに書いてあるように、
三角形の頂点の順序を反転し、システムが前から見て時計回りにたどれるようにする。つまり、頂点が v0、v1、v2 であるとすると、Direct3D に v0、v2、v1 として渡す
をすればいいんですよね?
>>36 >>D3DXVec3Unprojectの結果をD3DXVec3Projectしても元には戻らないね。
俺も自分のライブラリで作ってみたが、別に元に戻るみたいだが。
戻らない理由も特に見当たらないし。
まあただ、逆行列の精度が悪くて誤差は凄いけど。
以下のように初期化をした後でD3DPOOL_MANAGEDフラグを付けてVertexBufferやTextureを作ろうとすると 必ず失敗(hr = -2005530516 D3DERR_INVALIDCALL)します。D3DPOOL_DEFAULTでは失敗しません。 サンプルサイトの通りにやっているつもりだったのですが、どこが悪いかご指摘願います。 環境は Win7 Ultimate x64 開発ターゲット x86(32bit) VGA Radeon 5870 1GB VertexBufferやTextureの作成コードは InitD3D9Ex(hwnd); m_pDevice9Ex->CreateVertexBuffer(sizeof vertices1, D3DUSAGE_WRITEONLY, m_FVF1, D3DPOOL_MANAGED, &m_pVB1, NULL); m_pDevice9Ex->CreateTexture(640, 480, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &m_pTX1, NULL); DirectX Caps Viewerでは、D3DCAPS2_CANMANAGERESOURCEがNoとなっていますが、これは関係ありますでしょうか?
CComPtr<IDirect3D9Ex> m_pD3D9Ex; CComPtr<IDirect3DDevice9Ex> m_pDevice9Ex; bool InitD3D9Ex(HWND hwnd) { try { THROW_IF_FAILED( Direct3DCreate9Ex(D3D_SDK_VERSION, &m_pD3D9Ex) ); if (createDevice9Ex(hwnd, D3DDEVTYPE_HAL, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED)) { return true; } else if (createDevice9Ex(hwnd, D3DDEVTYPE_HAL, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED)) { return true; } else if (createDevice9Ex(hwnd, D3DDEVTYPE_REF, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED)) { return true; } else if (createDevice9Ex(hwnd, D3DDEVTYPE_REF, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED)) { return true; } } catch (std::runtime_error& e) { ::OutputDebugStringA(e.what()); } return false; }
bool createDevice9Ex(HWND hwnd, D3DDEVTYPE DeviceType, DWORD BehaviorFlags) { UINT ct = m_pD3D9Ex->GetAdapterCount(); for (UINT i = 0; i < ct; i++) { D3DPRESENT_PARAMETERS pp = getD3DPresentParameters(i, DeviceType); HRESULT hr = m_pD3D9Ex->CreateDeviceEx(i, DeviceType, hwnd, BehaviorFlags, &pp, NULL, &m_pDevice9Ex); if (hr == D3D_OK) { return true; } } return false; } D3DPRESENT_PARAMETERS getD3DPresentParameters(UINT Adapter, D3DDEVTYPE DeviceType) { D3DCAPS9 caps; THROW_IF_FAILED( m_pD3D9Ex->GetDeviceCaps(Adapter, DeviceType, &caps) ); D3DDISPLAYMODEEX dm = { sizeof D3DDISPLAYMODEEX }; D3DDISPLAYROTATION rot; THROW_IF_FAILED( m_pD3D9Ex->GetAdapterDisplayModeEx(Adapter, &dm, &rot) ); D3DPRESENT_PARAMETERS pp = {0}; pp.BackBufferWidth = ::GetSystemMetrics(SM_CXSCREEN); pp.BackBufferHeight = ::GetSystemMetrics(SM_CYSCREEN); pp.BackBufferFormat = dm.Format; pp.SwapEffect = caps.Caps3 & D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD ? D3DSWAPEFFECT_DISCARD : D3DSWAPEFFECT_COPY; pp.Windowed = TRUE; return pp; }
45 :
42 :2010/03/23(火) 11:00:13
失敗して何の問題があるんだ? それで正常動作だろ。
48 :
42 :2010/03/23(火) 13:37:02
>>46-47 すみません、ありがとうございます。
使い勝手のがいいので、DX9C日本語chmを見て使っていたので、乗ってませんでした。
初歩的なミスでした、ありがとうございました。
Exすっ飛ばして10に行ったから調べてないんだが ExはWDDM?動作だからデバイスロストなんてしないしリソースもうまいこと管理してくれるけどVista以降って認識でいいのかな
ちょっと調べれば分かることをなんて聞くの?
DXUTのコントロールって重いですか?
2kgくらいだったかな
>>30 デバイスロストに対応するべきクラスは、
class ICallbackLost{
static list<ICallbackLost*> s_list;
ICallbackLost()
{
s_listに追加;
}
virtual ~ICallbackLost()
{
s_listから削除;
}
virtual void lost() = 0;
virtual void reset() = 0;
}
クラスを継承するといい。
>>30 >>53 メソッドをpublicにし忘れた…
他にも色々つっこみどころはあると思うが、概念的として読んでくれ
DirectSound8の IDirectSoundBuffer8 で、 WEVデータを短い間隔で連続して鳴らすと途中で聞こえなくなるんだけど 原因分かる方教えていただけないでしょうか。 // バッファ作成 void init(){ desc.dwFlags=DSBCAPS_GLOBALFOCUS; dsObject->SetCooperativeLevel(hWnd, DSSCL_NORMAL); dsObject->CreateSoundBuffer(&desc, &s, NULL); s->QueryInterface(IID_IDirectSoundBuffer8, reinterpret_cast<LPVOID*>(&dsBuffer)); s->Release(); } // 音を鳴らす // シューティングの射撃音みたいに短い間隔で連続で呼び出す void run(){ dsBuffer->SetCurrentPosition(0); dsBuffer->Play(0,0,0); } WAVEFORMATEXの取得とかバッファの書き込みは問題ないはずです
10年くらい前、SoundBlasterの糞ドライバが憎まれていた時代の非公式テクニックだが、 DirectSoundのバッファが小さいと問題出るので、バッファの最小限のサイズを決めて 余白は無音で埋めるというのがあった覚えがある。最小サイズは1024byteか4096byteだったような気がする。
>>56 ありがとう
試しにバッファサイズを +4096 してみたけど解決しなかった
どうもDirectInputの入力で音を鳴らしたときに途切れる現象が発生する。
普通にループだけで0.2秒おきに鳴らしても問題なかった。
どっかでメモリ壊してるのかも
59 :
57 :2010/03/23(火) 23:56:47
>>58 差し替えたら問題なく再生できた
ファイルに原因があるのか、WAVEFORMATEXの取り方がおかしいのか・・・
Dx9EXって使う人っているんだなぁ。 あれ使うくらいならDx11使う方が遥かにいいと思うけど。
最近のゲームって文字表示のシステムってどうなっているんでしょうか? 漢字は当たり前ですが、、、
Vista以降でもDXVAやEVRやらの動画系やWPFとかが いまだにD3D9を要求してくるからねぇ。 仕方なしに使う場面も結構あると思うよ。
D3Dのカリングだと、反時計回りのポリゴンを描画しないとあるんですが、 TRIANGLESTRIPの場合、1枚目の頂点を時計回りで定義すると2枚目は反時計回りにならないですか?
>>63 別に頂点順にポリゴンを形成しなければならない道理は無いじゃん
0-1-2, 1-3-2, とかで処理してると思えない?
>>53 ありがとうございます!
なるほど・・・イメージが沸いてきました
この考え方で試行錯誤してみますっ
66 :
65 :2010/03/24(水) 06:39:16
手探りですが、こうしました #pragma once //デバイスロストを各オブジェクトに伝える機能を付加する抽象クラス #include<list> using namespace std; namespace DXRenderer{ class ICallbackLost { public: ICallbackLost();//ここでリストに登録 ~ICallbackLost();//ここでリストから削除 static void ReleaseResource();//各オブジェクトのリソース開放 static void RestructuringResource();//各オブジェクトのリソース再構築 virtual void Lost() = 0;//開放処理を書く virtual void Reset() = 0;//再構築処理を書く protected: static list<ICallbackLost*> s_list; }; }//DXRenderer あとは継承させて2つの仮想関数の中身を書いてあげれば、うまく望んだ動作をしました ありがとうございました!
>>66 念のため言っておくが、デストラクタにvirtualつけ忘れてんぞ
何これコンテナとデータが一体になってんのか リスト持ってる管理側とクラス分けたほうがよくないか? 俺がstatic嫌いなだけかも知れんが s_listがprotectedなのには理由があるんだろうか class LostManager { class ICallbackLost; list<ICallbackLost*> s_list; public: void AddResource( ICallbackLost *data ){ s_list.push_back( data ); } void ReleaseResources();//各オブジェクトのリソース開放 void RestructuringResources();//各オブジェクトのリソース再構築 ~LostManager(){ ReleaseResource(); } public: class ICallbackLost { virtual void Lost() = 0;//開放処理を書く virtual void Reset() = 0;//再構築処理を書く }; }; 見当違いだったら須磨祖
ああすまんs_listがprotectedなのは分かった
Direct3Dは1アプリケーションで2つ扱うことがない(できなくはないが、やるなとMSが言っている)から、staticで十分かと。
気分の問題程度だよね。
あとs_listはprivateでいいよね。
あと、
>>68 のはせっかくコンストラクタとデストラクタで登録/削除処理してたのに、自前で登録関数呼ぶことになっちゃうよね。
趣旨理解してないぞ
なんでLostManagerのデストラクタでReleaseResource呼んでるんだ・・・? 意味不明すぎる ReleaseResourceが呼ばれるのは、D3Dがデバイスロストした時だろ…
ごめん理解してなかった 余計なお世話でしたね
IDirect3DTexture9* tx1 = ...; IDirect3DTexture9* tx2 = tx1; tx1->AddRef(); このテクスチャがロストした場合は、tx1で再構築すればtx2では再構築する必要ありませんか?
だめ。
つ
ttp://marupeke296.com/DXG_No52_DeviceLost.html 〜CreateTexture関数にポインタのアドレス渡すでしょ?
tx1で再構築すると別の空間に作られてそこを参照しなおすから、tx2とは参照先が異なる
IDirect3DTexture9* tx = 〜;
IDirect3DTexture9** tx1 = &tx;
IDirect3DTexture9** tx2 = &tx;
これならtx1,tx2はそのままで使えるけど、アクセスは面倒なことに・・・
ピクセルシェーダーでアルファ値無しのテクスチャの黒成分をアルファ値として出力するにはどう書けばよいですか?
>>70 デバイスロストはDirect3D単位で起こるものではなく
Direct3DDevice単位で起こる。
Direct3DDeviceは、例えばビデオカードが2枚刺さってれば
ふたつ作ることもありうる。
つまり、staticのリストはNG。デバイス毎にリストを保持するのが正しい。
>>67 指摘ありがとうございます!
virtualなのですが、このクラスでは、
リストの中に入っているポインタを使ってdeleteをせず、
派生させたクラスで個別にdeleteを呼ぶためにリーク類は起きない、
ということでつけていません(確認済み)
なのでデストラクタの実態にはリストから削除という命令を書いているという形です
>>68 >リスト持ってる管理側とクラス分けたほうがよくないか?
たしかにおっしゃる通りかもしれません
もういちど考えてみます!
>>70 >あとs_listはprivateでいいよね。
まったくその通りです 修正します
ご指摘感謝です!
>>76 なるほど・・・そのパターンは考えていませんでした
勉強になります
しかしとりあえず今回は一番多いパターンのビデオカード1枚という形で、
組んでいくことにします
>>75 意味不明
アルファ値無しのテクスチャの色成分はRとGとBだが
黒とは、RとGとBの値が0の時を指す
カラーキーと同じように、黒の時にアルファ100%とするなら
条件分岐が使えるバージョンなら
out.a = 1;
if ( tex.r == 0 && tex.g == 0 && tex.b == 0 ) {
out.a = 0;
}
こんな感じ
81 :
80 :2010/03/25(木) 00:52:49
若干文章ミスりましたOTL
>>79 レスどうも。。。
RGBを0〜1にしたいということです。
調べたんですがこれで求まるらしいですねG = g*0.59 + r*0.3 + b*0.11;
最初からグレースケールって言えよ・・・
>>82 それをどう解釈したら「黒成分をアルファ値として出力」になるんだよww
>>82 日本語が不自由っていうレベルじゃねえぞwwwwwwwww
精子からやり直せwwww
そんなにおかしいかな?
黒成分ってのは結構おもしろかった カラー画像をグレー化する変換式は1通りの決まった正解があるわけじゃないよね
「黒成分」ってのは減色混合における黒インク量のことか?
CMYKだとKが黒成分だよね
黒成分ワロタw まぁ、言いたいことは分かる。 輝度(Y)、グレースケールなどなど、言い方はいろいろあるね。
いずれにしろアルファは全く無関係なのは確か。
Direct3D9で2D表示を行っています 現在は頂点をスクリーン座標で指定し、ビューポートの逆変換によって表示しています Z軸の回転は問題ないのですが、 X軸Y軸の回転の場合縦横に縮小した感じではなく、 奥の辺は短く、手前の辺は長く(画面外に出ると思いますが)なるようにしたいです スクリーン座標からいったん仮にワールド座標を求めてそこで回転させるとかしかないでしょうか? なにか良い方法があればよろしくお願いします XYZ軸の回転が全て0の時は画像とスクリーンのピクセルが一対一になるようにしたいです
>>92 World空間ではなく、View空間まで戻して回転させる
変換行列 = 逆Viewport行列 * 逆Projection行列 * 回転中心まで移動行列 * 回転行列 * 逆回転中心まで移動行列 * Projection行列 * Viewport行列
↑を各頂点に掛ければいい
面倒そうなところは、回転中心まで移動行列だけど、、
これも似たようなプロセスで事前に求めておくしかないかなぁ
商用ソフトをPIXでデバッグすると何してるか分かるね 結構プロテクトかかってると思うけど
突然流れと関係ないことを喚く馬鹿っていったい何なんだろう?
2chに流れもくそもないかと
しかも質問スレで何言ってんのかと
directxスレここしかないし
周りに話す人間がいないから、情報価値がゼロの話でも、 つぶやかずにはいられなかったんだよ。
GeForce FX 5000系をバックサポートするときに注意すべき点って分かる人いる? バーテックス/ピクセルシェーダ2.0で動かしてるんだが、 どうもこのその板では動かないっぽいんだが手元にない。
バックサポートってなに? バックスタブみたいなもん?
>>101 後方互換性を維持するためのサポート。
新しい工業製品が旧世代での古い機能を満たすように考慮すること。
103と5000系動作を保証することの関係性が分からない
今常駐ツールを作っていて、ユーザーがゲームをプレイ中だったらポップアップとか出さずプレイの邪魔をしないようにしたいんだけど アクティブウィンドウがDirectXゲームか否かを判断する方法ってある?
>>106 Direct3D/DirectDrawデバイスをエクスプルーシブモードで
開こうとすると失敗することで判定するw
まあ、最近ときどきある、フルスクリーンもどきな動きをする『ウィンドウモード』のゲームだとだめだけど。
>>106 アクティブウインドウがゲームでなくても、邪魔になるようなポップアップは
出すべきじゃないと思う。
>>104 ハードとプログラムの受け渡しって何がしてると思う?
ドライバによって、同じ古いグラボでも対応する、しない&動く、動かない機能があるが
動作検証って、グラボと各Verのドライバでするわけ?
ドライバ位は最新を前提にしないと、現実的に動作保証なんてしてられないだろ
>>107 ウィンドウモードだとDirectX経由のアプローチで何かしらの情報を得るのは難しいですかね
>>108 普段は必要とされてるけど、ゲーム中は黙ってて欲しい微妙なバランスの物があるのです
ポップアップはその一例で、ユーザーのプライオリティ変化に自動的に追従できる所はしたいと言う話です
ついったーくらいあんとですねわかります
エロゲーをフルスクリーンでプレイしている時にポップアップしてくる avastには殺意が沸くが、そういうのを目指してると
カメラでプレイ中のプレイヤーの顔をとって判断すればいいんじゃない
サーフェイスとレイヤーの違いがわかりません。 どういう不に考えればいいのですか?
日本語に訳せばわかるだろ
J-POPのユニットとアニメの格好をする人・・・?
頂点バッファのリストアについて質問です。 デバイスロストしたら頂点バッファも作り直さないといけないですよね、 その場合もういちどファイルから頂点を読んでいって頂点バッファに書き込みという作業が必要になるんですか?
>>118 ありがとう
めんどくさいからD3DPOOL_MANAGEDで作ります
>>119 D3DPOOL_MANAGEDが使えるものは全てそれでいい。
俺らが小手先使うより、MSのプログラマが作ったもののほうが優秀だからな
122 :
デフォルトの名無しさん :2010/03/30(火) 17:28:10
>>122 俺もブロック解除ってやったら表示されたわ
お、おれもおれもー
おれもいれてー
みんなDXUT使ってる?
(;´Д`)
>>125 右のページはブロック解除すれば表示されるけど、
左側は
>>122 の言うとおりキーワード検索(機能しない)しか出なくない?
132 :
122 :2010/03/31(水) 00:27:14
>>131 そうなんだ、今までのDirectX SDKのマニュアルでは、左側は目次と検索、キーワードなんかがあったけど
今回のは検索しかない、しかも機能がちゃんと動いていない。
検索すると、検索結果に「無題」(たぶん検索語句が含まれるページのタイトル)がいくつかリストアップされる
だけどそのページに移動出来ない。
川西さん頑張って!!!
ちょっとわからないので質問させてもらいます。
今スロットゲーム的なものを作ってる途中なのですが
流れとしては
『ランダムにスロットに画像表示
キーが押されたら画像がそろっているかの確認処理
そろっていたらその画像に応じて所持コイン増加
はずれだとコイン1枚減少』
のようにしているのですが
コインの増減処理のとき
なぜか2回処理されて(コイン1枚減少が2回行われる
しまいます。
WaitTimerが関連してるような気がして調べてみたものの
わかりません。
↓ソースです。初心者なので汚かったりするかとおもいます
http://uproda.2ch-library.com/lib231205.zip.shtml
コインを0.5枚減らすようにすればいいのさ
L88のcountを立てる為の条件式は キーが押されている限りtrueになる。 trueのフローの中にコイン減処理が入っているから、 キーが押されている限り、コインが減っていくんじゃないの?
L88のelse文を f(key & PAD_INPUT_A){ count = 1; if(ghandle[basyo[0]] == ghandle[basyo[1]] && ghandle[basyo[1]] == ghandle[basyo[2]] ){ hantei = 1; switch(basyo[0]){ case 0: getc = 50; break; case 1: getc = 40; break; default: getc = 10; break; } }else{ c = 1; } } if(c == 1)coin = coin-1; c = 0; にしてみましたが結果変わらないです WaitTimer中もキー入力は受け付けるみたいです。 別の方法を考えています
まぁ、そのなんだ。その質問は完全にスレ違いだ。 DxLibはDxLibであって、DirectXではない。 gamedevに「DXライブラリ総合スレッド」ってのがあるから、 そっちでも行ってくれ。
つーかロジックの問題だろ
>>138 そりゃ、その変更じゃ何も変わっていないんだから
結果も当然変わらん。
whileループ1回目でL45のkeyに値が入ってから、
whileループ2回目で改めてkeyに値を入れるまでの時間は殆ど同じだ。
それが原因。対応法としてはL45をL87に移動することだが、
もっと根本的にコードを見直した方が良いと思う。
以上スレチ失礼。
アルファチャンネルのある画像Aから画像Bにフェードインさせたいのですが、どうすればいいのでしょうか? アルファチャンネルが無い画像(四角い画像)なら、BをAの上に頂点色も適用しつつ上書き描画すればいいだけなんですが。 Aをアルファ25%、Bをアルファ75%にすればいいやと最初思いましたが、 それだと背景の色が出てしまい出来ないことに気づきました・・。 シェーダーを使うと古いビデオカードでは動きませんし、テクスチャの内容を書き換えるのも重いようなので避けたいです。 800x600の画像を1024x512のテクスチャの左上に置いているのですが、1fpsになってしまいます。
シェーダも使えないような古いグラボの人は、PCでゲームを買って遊ぶ習慣のない人であり、 顧客になりそうもない人。商売なら相手にする価値が無い。 たぶん趣味の自作ライブラリを鍛えたいという用途だと思うが、だったら 全部ソフトウェアで処理すればいいと思うよ。いまどきのCPUなら エロゲーの凝ったフェードイン・アウトくらいできちゃうよ。
145 :
142 :2010/03/31(水) 23:20:25
>>143 全く同じ形状をしている画像同士なら、それで出来ると思います。
そうではなく、2枚の画像は異なった形状をしていて、
「画像Aをフェードアウトさせつつ画像Bをフェードイン」させたいんです。
146 :
146 :2010/03/31(水) 23:29:42
>>144 すいません、レスついてたの気がつきませんでした。
じゃあシェーダーを使って処理するようにしようと思います。
よく考えたら、
自作ライブラリではなくオープンソースのを少し改変して使ってるので
他にOpenGLとソフトウェアのレンダリングエンジンがありました。
スペック低いPCの場合はそっち使ってもらえばいいですね。
RTTが使えるなら
常にレンダーターゲットのテクスチャに画面描画を行っておいて、
それをもとにフェードインすればいいかもしれません。
(でもそこまでしないで素直にシェーダー使った方が楽か)
? フェードインアウトしている間、画像Aのα+画像Bのα=1を維持して 下の背景を透けさせないようにしたいのか?
148 :
142 :2010/03/31(水) 23:35:49
>>147 その通りなんですが、何かいい方法があるんでしょうか
Direct3Dを使ったエロゲで、目パチ口パクでアニメがフェードしながら切り替わってるだろ。 あれはテクスチャをロックして、直接書き換えてるんだが。 その方が2枚のテクスチャを重ねて頑張ろうとするより簡単。
>>148 片方のアルファ値の減少量を
もう片方の画像の増加量にする
画像Aと画像Bをマルチテクスチャブレンディングで合成すりゃいいんでないか?
よくよく考えてみると
>>142 は結構難しい問題かもな
つーかロジックの問題だろ
何をしたいのかよくわからんが
>>150 で出来るだろ
馬鹿は黙っててください
>>154 よくわからないのなら、静観していなさい
よいですね?
もしかしてマルチテクスチャで出来る? ステージ0 左 D3DTA_DIFFUSE 右 D3DTA_TEXTURE COLOR D3DTOP_MODULATE ALPHA D3DTOP_MODULATE ステージ1 左 D3DTA_TEXTURE 右 D3DTA_CURRENT COLOR D3DTOP_BLENDTEXTUREALPHA ALPHA D3DTOP_BLENDTEXTUREALPHA
うん
142は たとえば、テクスチャABで同じ色の場所の場合 ブレンド値が変化しても A*a + B*(1-a) = A(=B) になるようにしたいんでは? それだと157だとできなくない? シェーダー使うかロックするしかないのでは?
>>142 の「背景の色が出てしまい」ってところがキモだな。
勝手に意訳すると、AとBはそれぞれ異なる形状でアルファ抜きされているが、
AとBが両方とも不透明な領域ではAからBへのブレンド中に背景を一切透過させたくない、
という要望のようだ。
これは少々トリッキーな処理が必要な気がする。
>>160 そもそも何をやりたいのかがいまいち分からん
単純に背景透過させたくないなら、背景の描画を最後にするって方法もある
テクスチャのフォーマット変えたり、マスク用意したり、 アルファテスト、ステンシルテストとかでどうにかできないのかな 使用してる画像や書いたコードどんなんだろ
別の形状をしているものの 重なってる部分の背景を出したくないとして じゃあ、重なって無い部分はどいうしたいんだ? 背景が透けてていいのか?
背景の見えないフェードっつーのがさっぱり理解不能なんだが 裏が透けないフェードなんて存在し得ないだろ つーかフェード中にABが重なる部分の背景を白抜きすりゃいいだけの話だろ 難しく考えすぎなんだよ
>>163 そこは透けていいんじゃないかね。
重なってない部分はブレンド値の変化とともに「A→背景」または「背景→B」と変化し、
重なっている部分だけは背景を混入させずに「A→B」と変化させたいのではなかろうか。
片方の画像が不透明なら不透明画像を後からブレンドすればいいんでない? 完全に正しい結果が欲しいならシェーダー使うしかない希ガス
ちなみにAとBのαの変化はどこでやってるんだろう? 頂点カラー? それともロックして書き換えてるんの? それによっても違うと思うんだが
シェーダー書けば一発な気がするけど 固定機能で一応考えて見た AとBで重なる部分は透けない 重ならない部分は透けると仮定して 合成用のテクスチャを用意して レンダリングターゲットに指定しαを0でクリアしておく(重要) そこに対し // αとカラーの合成方法を分離する SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_ZERO);//α値は書き込まない SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_ZERO); でBの色情報だけを描画しておく。αは0のままなので描画結果は表示されない (これをしておかないとたぶん最後にBを描画するときにAの抜きカラーがブレンドされてしまうはず) SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_ONE); SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_ZERO); でAをα値aで描画する(Aの色情報とα値を上書きする) 最後に SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_ONE); SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_ONE); でBをα値1.0-aで描画する (AとBの色情報をブレンドしBのα値を加算する) 出来あがったテクスチャを通常描画する で、どうよ?
本当にシェーダーでやれって感じだな しかし実際問題重なってる部分は透過させないって必須なのか? クロスフェードにそんなに何秒もかける訳ないし 実際動かして見たら透けててもそんなに気にならんと思うのだが… 背景の後ろでフレーム外の仕事しててユーザーには見せられないとか?
本人が
>>146 でシェーダーでやりますって言ってんだからもういいんじゃね
ごめんなさいスルーしてました
スペキュラ色付けた後にアルファブレンドすると光にまでアルファかかっちゃうんですけど どうしたらよいでしょうかね、、、
>>146 - AxorB 領域にAとBをアルファ描画
- AandB 領域にAを不透明描画
- AandB 領域にBをアルファ描画
かしら。
マスク処理はステンシルか、Zバッファで代用ね。
>>146 を
シェーダーでやる方法って具体的にどうやるんですか?
気になります
わかる方いれば教えてください
それは四則演算がどうたらこうたらのレベルになるんじゃないか?
>>174 AのテクスチャとBのテクスチャの両方のアルファ値が0.0より大きい場合にアルファ値の出力を1.0にするだけ。
あとは普通に合成しちゃえばいい。
ふと思ったが、AとBのポリゴン(四角形)自体はまったく同一なのだろうか。
>>142 にはそういう条件は書かれていないが。
ポリゴンが一致してるなら、シェーダで2つのテクスチャに同時にアクセスして
>>176 のような感じで処理すればできそうだね。
AとBのテクスチャ素材のアルファ抜きにアンチエイリアスが入っていたりする場合は
もう少しロジックを工夫する必要がありそうだけど。
>>178 >>145 はアルファ抜きの形状が異なるって意味じゃないの?
ポリゴンの頂点位置まで異なるとは言っていない気がする。
180 :
デフォルトの名無しさん :2010/04/02(金) 13:57:45
もういいじゃん 本人いないんだし
固定機能にしろシェーダーにしろ 合成用のレンダリングターゲットは必須じゃね? そこを省こうとするから面倒なだけで
142帰ってきて!!!!!
DirectX11で質問です。 DXGIの機能、Alt+Enterで画面のモードの切り替え(フルスクリーン⇔ウィンドウ)を使いたいのですが、うまくいきません。 なぜか、一瞬だけ切り替わってすぐに戻ってしまいます。 全自動でバッファサイズの調整、ウィンドウの変更などをやってくれると思っていたのですが、自分でも変更しなければならない部分があるのでしょうか? もしくは、開発環境の問題ですか? わかる方、よろしくお願いします。 ソースコード(一部) /* 省略 */ SwapChainDesc.Flags=DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; /* 省略 */ result=D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, pD3DFeatureLevel, 6, D3D11_SDK_VERSION, &SwapChainDesc, &g_pSwapChain, &g_pD3DDevice, &D3DFeatureLevel, &g_pD3DDeviceContext); if(FAILED(result)){ /* エラー処理 */ } /* 省略 */ result=CreateDXGIFactory((const IID){0x7b7166ec, 0x21c7, 0x44ae, {0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69}}/* IID_IDXGIFactory */, (LPVOID *)(&pFactory)); if(FAILED(result)){ /* エラー処理 */ } result=pFactory->MakeWindowAssociation(hWnd, 0); if(FAILED(result)){ /* エラー処理 */ } 開発環境 OS Windows Vista コンパイラ gcc
16進数の羅列で考える気が失せた
>>183 Windowsに強く依存するDirectX開発でgccを使うなんてマゾとしか思えん。
ただで済ませたいならVisual Studio 2008 Express Editionに必要なSDKを加えて開発するのが正道。
ソースコードが間違っているのか開発環境に誤りがあるのか判断ができないのでは答えようがない。
183です。アク禁の巻き添え食らったので、代行してもらってます。 とりあえず、画面の切り替えに成功したので(たまに失敗するけど)報告 WndProcでAlt+Enterを拾って、 BOOL state; g_pSwapChain->GetFullscreenState(&state, NULL); g_pSwapChain->SetFullscreenState(!state, NULL); return 0; を実行したらうまくいった。 たまに失敗するのは、これはたぶんDXGIの画面切り替えが始まってから 一定時間内にstateの変更を実行できなかったときだと思う。
>>186 DX11ではなくDX9の話だが、
Firefox3.6以降が別に起動している時にフルスクリーン表示に切り替えようとすると失敗する場合があるな。
フルスクリーン表示へのリセットに失敗するのではなく、
そのすぐ後にアプリケーションのフォーカスが失われてしまう。
Firefoxを閉じるとすぐになおる。
188 :
デフォルトの名無しさん :2010/04/03(土) 23:41:34
Xファイルを読み込んでdrawsubsetで描画すると、メッシュが表示されるべき形の部分が 完全な真っ白になってしまいます。 テスト的な描画なのでD3DRS_LIGHTINGはFALSEにしてあります。 ライトはまだ設定していません。 メッシュのマテリアル情報もデバッガで覗きましたが、セットしているD3DMATERIAL9構造体の 中身は Diffuse(0.8 0.61 0.57 1) Ambient(0 0 0 1) Specular(0 0 0 1) Emisive(0 0 0 1) Power 5 でテクスチャはありません。 ライトは無いけどライティングをFalseに指定しているし、マテリアルに設定した色ではなく、 真っ白になってしまうのが納得いきません。何故真っ白になるのでしょうか?
>>188 とりあえずサンプルのMeshesの
Tiger.xと差し替えてみて表示されるかどうか確かめて見たら?
前に似たような質問で
マテリアルカラーじゃなくて
頂点カラーが頂点フォーマットに含まれててそっちと乗算されてたとかあったな
>>188 それじゃあ、Xファイルに問題があるのか
プログラムに問題があるのか分からないから
xファイルかソースをうp
191 :
デフォルトの名無しさん :2010/04/04(日) 00:46:43
>>189 Tigerを表示してみたところ、全く正常に表示されました・・・
が、そもそもTigerはテクスチャを張っているので、マテリアルカラーは関係ないような気がしますが、
一応表示処理はマテリアルカラーを除けば正常だと思います。
>>190 すいません。エロエロなのでアップ出来ません。
乳首等をカットしてうpしてください
>>191 じゃなくて
Meshesの方で問題のXファイルを表示してみたら、というハナシ
194 :
デフォルトの名無しさん :2010/04/04(日) 01:26:33
>>193 試してみました。ちゃんと肌色や黒やピンクで表示されています。
195 :
188 :2010/04/04(日) 01:59:28
解決しました。 D3DRS_LIGHTINGをFALSEにしていた部分をコメントアウトし、 D3DRS_AMBIENTを0xffffffffにしたらサンプルと同じ表示になりました。 D3DRS_LIGHTINGをFALSEにした状態でD3DRS_AMBIENTをいじらなくても、 直接頂点を頂点バッファに入れてDrawIndexedPrimitiveする時には正常に頂点色で表示されていたので、 同じ感覚でやれるはずだと思い込んでいました。 メッシュのdrawsubsetだけは仕様が違うということでしょうか?
D3DRS_LIGHTINGを切ったら真っ白になるのは当然じゃ? ライトをセットしないのとライティングを切るのはまったく違うことだぞ
>>195 頂点カラーとマテリアルカラーはまったく違う
頂点カラーはその名の通り頂点の色
マテリアルカラーは光を何色で反射するかの設定
xファイルの場合
頂点カラーがデータに含まれてない場合
デフォルトの頂点色0xffffffffで動作するので
ライト切ったら白のまま
>>195 まー使えるAPIがそろってるD3DXもD3DXMesh系だけは自作するって話をよく聞くからなぁ。
とりあえずPIX for WindowsでD3DXMeshの挙動を調べることをおすすめする。
199 :
188 :2010/04/04(日) 02:15:14
>>197 分かりやすい説明有難うございます。納得しました。
>>196 >>198 色々なアドバイス有難うございました。
PIX for Windowsについてもググってみます。
よりスケベな絵になるようがんばってくれ!
質問です。 自分はC/C++でWin32APIを使ったコーディングはそこそこ慣れていて たまに自分用のソフトを作ったりもするのですがDirectXはまったく初めてです。 とりあえず書籍やググって見つかるサイトなどを参考にテストコードを書いてみたのですが、 BeginScene がFAILEDになってしまい、描画処理が開始出来ません。 この BeginScene、失敗する条件ってなんなんでしょうか。よろしくお願い致します。 環境:WinXPSP3、DirectXSDK Ver9.0c
EndSceneを呼ぶ前にBeginSceneを再コールしたとかでもないかぎり失敗はしないと思うが…
>>201 device->Present(...)との対応ができていないというのが考えられる。
それから、DirectX初心者ならいきなりコードを書き始めない方がいいよ。
DirectX SDKにサンプルが山ほどあるので、
とりあえず簡単そうなものからビルドして動かして眺めてみるといい。
超凡ミスの予感 ソースうp
初心者にありがちで 勝手に失敗箇所をBeginSceneに限定ちゃってるだけで 実は全然違うところでミスしてそう
まずDeviceがちゃんと作れてるかが気になるなぁ。
207 :
201 :2010/04/05(月) 21:13:06
いま帰宅しました。そしていきなり解決しました。
すみません、お察しの通り超凡ミスでした・・・ww
原因は、ウィンドプロシージャ内、WM_SIZE で IDirect3DDevice9 の Reset を実行し、
さらにそこで InvalidateRect 。レンダ処理を WM_PAINT においていた為でした。 ※実行順序
お騒がせしました。
>>205 いえ BeginSceneの結果がFAILEDになっていた事は確認済みで、その理由が不明だったのです。
最初、WM_PAINT にレンダ処理を置いていたのも重ねてミスでした。※現状はメインループ内に移動
お騒がせしました。
208 :
142 :2010/04/06(火) 00:13:38
シェーダーでlerpを使用して補間すればいいかと思いましたが、
輪郭部分が汚く見える気がします。こんな安直なやり方ではダメなんでしょうか。
ゲーム画面を常にレンダリングターゲットに描くようにしておいて、
RTT + 画像A、 RTT + 画像Bをクロスフェードさせた方がいいかもしれません。
return lerp(tex2D(Texture0, texCoord), tex2D(Texture1, texCoord), transition);
>>173 画像にはアンチエイリアスがかかってるのでダメです・・。
>>168 申し訳ないんですがまだ試せてません。
2回目の描画で「Aをα値aで描画する(Aの色情報とα値を上書きする)」
となっていますが、D3DBLEND_ONE、D3DBLEND_ZEROの組み合わせだと1.0で描画することになるのでは?
>>208 3Dの世界はな、光も陰もアルファも、みんなバラバラに指定するんだ。
シェーダー関数の中だけ見てたって正しいコードは書けないぞ。
>>208 なにがしたいのかいまいちわからないから、Aだけ、Bだけ、フェード中、の3つの画像とか示せない?
>>208 168じゃなけど
D3DBLEND_ONEは係数1.0の意味だからα*1.0だぞ
なんかブレンドの仕組みを理解してない予感
>>208 .xyzに関してはlerpでいいけど
.w(α値)は加算するかどちらか片方が0以上なら1.0にするとしないとだめなんじゃ?
テクスチャのA32R32G32B32Fのフォーマットについて質問なのですが 書き込んだ値が勝手が0〜1にクランプされます なぜでしょうか
>>214 カラーテクスチャはそういうシロモノだから。
>>208 これでどうだ!
float4 A = tex2D(Texture0, texCoord);
float4 B = tex2D(Texture1, texCoord);
float4 result;
result.rgb = (1 - t) * (A.a * A.rgb) + t * (B.a * B.rgb);
result.a = 1 - ((1 - t) * (1 - A.a) + t * (1 - B.a))
return result;
tは遷移用の0〜1のパラメータね。(
>>208 のtransitionに相当)
このシェーダのあとに通常のフレームバッファブレンディングで
SRCBLEND = ONE, DESTBLEND = INVSRCALPHA として背景とブレンドする感じ。
(result.a の "1 - " を外して DESTBLEND = SRCALPHA としてもいい。)
result.rgb の計算における (A.a * A.rgb) と (B.a * B.rgb) の部分は、
もし元素材のRGB成分にαが既に乗算されている(いわゆるpre-multiplied alpha)なら
それぞれ A.rgb と B.rgb で置き換えてくれ。
(PNGとかTIFFとかフォーマットによってアルファの解釈に流儀があるんだよね。)
>>216 の続き
シェーダの計算を場合分けしてみると、
A.a == 0, B.a == 0 ⇒ result.rgb = 0, result.a = 0 (背景そのまま)
A.a == 1, B.a == 0 ⇒ result.rgb = (1-t)*A.rgb, result.a = 1-t (Aから背景へ遷移)
A.a == 0, B.a == 1 ⇒ result.rgb = t*B.rgb, result.a = t (背景からBへ遷移)
A.a == 1, B.a == 1 ⇒ result.rgb = (1-t)*A.rgb+t*B.rgb, result.a = 1 (背景を混ぜずにAからBへ遷移)
となって、おそらく要望を満たしている。
αが0〜1の中間の場合も破綻しない計算式になっているので、
アンチエイリアス部分もたぶん問題ないと思う。
合成の順序が違うからちょっとわかりにくいけど、結果的には、
>>208 の言う「RTT + 画像A、 RTT + 画像Bをクロスフェード」させた場合と
まったく同じ計算式になっています。
>>214 のブレンディングまで含めた式
(1 - t) * (A.a * A.rgb) + t * (B.a * B.rgb) + ((1 - t) * (1 - A.a) + t * (1 - B.a)) * [背景]
RTTに個別に描画してからクロスフェードの場合
(1 - t) * ((1 - A.a) * [背景] + A.a * A.rgb) + t * ((1 - B.a) * [背景] + B.a * B.rgb)
test
すみません、現在
http://rina.jpn.ph/~rance/directx8/index を参考にDirectXの勉強をしています。
上記ホームページの第4章の画像の描画(テクスチャ・マッピング)の項目あたりなのですが、
例えば20×20ピクセルのbmp画像を横200×縦400の範囲に敷き詰めて表示したい場合
どうすればよいのでしょうか?
InitVertex関数と配列を組み合わせるのかとも思ったのですが、
組み合わせ方がわかりません。
考え方が間違っているのでしょうか?
もしいいやり方があったら教えてください。
>>219 やりたいことがイマイチ不明
お前さんの頭の中にはイメージあるんだろうけどそれじゃ伝わらない
とりあえず4章の終わりまで進めてから出直したほうがいいんじゃね?
20×20の画像が任意のものであれば
そのInitVertexを横10×縦20回呼べばいいだけだし
まったく同じ画像の繰り返しでいいなら
テクスチャのアドレッシングモードをD3DTADDRESS_WRAPにして
InitVertex内でtu=1.0とかtv=1.0とかになってるところの値を増やせばいい
>142は 背景+αチャンネル付き立ち絵Aから、背景+αチャンネル付き立ち絵Bへ奇麗にクロスフェードさせたいって事なんでしょ エロゲの会話シーンみたいな
>>215 t-potではA32R32G32B32Fを使って座標を保持しているプログラムがある
自分のプログラムでも少し前に組んだやつだとクランプされてない
>>142 は自分の言いたいことだけ言って
聞かれてる条件について完全にスルーだからもう放置でいい希ガス
状況が不明すぎて答えられないし
またこのまま1週間放置とかなんじゃね?
>>220 >>221 すみません、
20×20の画像を1個としてこれを繰り返して
横10個×縦20個として同じものを並べて表示したいということです。
とりあえずもう少し調べて考えてみます。お手数おかけしました。
>>225 基本的にはUV値を0.0〜1.0の範囲より広げて指定するだけでいい。
テクスチャの拡張はいろんなパターンがあるから必要な方式を指定してあげること。
>>226 ありがとうございます。参考にして考えます。
HLSLのサンプラー型で、 「sampler」と「sampler2D」の違いって何なんでしょう?? 今まで何となしに「sampler」を使っていた(2Dテクスチャのみ)んですが、 「sampler2D」というものもあることを知って不思議に思いました。 今まで「sampler」だったところを「sampler2D」に変えてみても、特に挙動は変わりませんでした。
XNAとの互換用とかじゃね?
Sampler1Dというのがあってだな
Core2 Duoを使ってるんですが、マルチスレッドのプログラミングは一切していないのに、 CPU使用率は100%近くになります。(1コアだけ使用のプログラムはだいたい50%) これはDirectXのライブラリ内でマルチコアを考慮した動作をしてくれてるからでしょうか? コア数が多いほど性能は上がる傾向にあるのでしょうか?
オープンソースでフリーのゲーム開発してるのですが。
http://sourceforge.jp/projects/freetrain-exav/ 自分こないだ開発リーダー引き継いだばかりで、DirectXが全然分からないんです。
C#部分はある程度分かるんですけど。
で、これDirectXの機能としては2DのDirectDrawとDirectAudioを使ってるぐらいで
全然3D機能は使ってないんですけど。
DirectAudioのラッパー部分にバグがあるらしく、しばしばエラーを起こして異常停止
するという報告が上がってきてるのですがどう対処していいのか分からず。
エラー起こしてるのは、
trunk\lib\DirectXWrapper\DirectAudio.cpp
のなかの483行目あたりがHRESULT からの例外: 0x88781165だそうで。
wrapper::SegmentState^ wrapper::Performance::playExclusive( Segment^ seg ) {
IDirectMusicSegmentState* state;
handle->PlaySegment(seg->handle, 0, 0, &state);
return gcnew SegmentState( this,
state, //handle->PlaySegmentEx( seg->handle, 0, 0, nullptr, nullptr ),
GetMusicTime(handle) + GetLength(seg->handle) );
}
わからないでしょうか。
HRESULT: 0x88781165 (2289570149) Name: DMUS_E_TIME_PAST Description: The time is in the past, and the operation can not succeed. Severity code: Failed Facility Code: Unknown (2168) Error Code: 0x1165 (4453)
またおまえか と思ったら別スレでの出来事だった
質問です。 DirectXサンプルのスキンメッシュをいじり倒して、概ね理解はできてきたと思うのですが、1点気になることがあります。 D3DXMESHCONTAINER_DERIVED::pBoneOffsetMatrices これなのですが、オフセット行列をコピーしているようなのですが、そのコピー箇所を引用すると // get each of the bone offset matrices so that we don't need to get them later for (iBone = 0; iBone < cBones; iBone++) { pMeshContainer->pBoneOffsetMatrices[iBone] = *(pMeshContainer->pSkinInfo->GetBoneOffsetMatrix(iBone)); } こうなっています。 コメントを訳すと「後でこれらが必要にならないように、各ボーンオフセット行列を取得しておく」と読めるのですが、 別にpSkinInfoは解放せず持ち続けるようです。 pBoneOffsetMatrices自体は確かに描画の時に使っているのですが、別にその時 *(pMeshContainer->pSkinInfo->GetBoneOffsetMatrix(iBone)) を使えばいいのではないかと思います。 pSkinInfo->GetBoneOffsetMatrixでとれる行列は、何かしらが原因で変化してしまったりするのでしょうか? (変化してしまうから、変化する前に控えをとっているのでしょうか?) それとも、GetBoneOffsetMatrixの呼び出しが超遅いとかでしょうか?
>>237 メッシュが複数あるとき使わないボーンもあるからじゃないの?
>>235 がそのエラーメッセージなら、多分単にメッセージに書かれている通りだと思うんですけど。
意味がわかりませんか。
DirectXったってただの関数、ただのAPIですから、メッセージをヒントに
いつも開発してる時のように追いかけたら。
>>238 レスありがとうございます
ただ、ちょっとご指摘の内容が理解できないのですが…。
すいません。
複数メッシュ時の挙動は、今ちょうどやっているところですが、やはりメッシュ毎にpMeshContainer(の中身)が生成されるため、
pMeshContainer->pSkinInfo->GetBoneOffsetMatrixを必要になるたびに呼べばよさそうな感じです
241 :
234 :2010/04/08(木) 19:45:48
エフェクトオブジェクトって描画オブジェクトごとに作っても そんなにコストかからないですか?1つを使いまわしていちいちSetValue()するのもアレかと思いまして。。。
大量のキャラが出るゲームでなければ体感差はでないから それが無駄や面倒臭くないというならやればいいじゃない。 普通は用途で分けるだろ。キャラ用・地形用・ポストエフェクト用・ビルボード用・etc
エフェクトの定数セットは比較的軽い処理だがエフェクト切り替えは重いという事だけは言っておこう
すみません質問です。 CDXUTXFileMesh というクラスがどこにあるか、どなたかご存知の方はいらっしゃいますでしょうか この名前でググった所、多分 DirectX SDK (Novenber 2008) 内にある DXUT 関連だろうという所まではたどり着いたのですが、 これが宣言されているヘッダや lib などが見つかりません。 よろしくお願い致します
246 :
245 :2010/04/09(金) 14:18:06
すみません、解決しました。 場所: ※デフォルトのパスでインストールした場合 C:\Program Files\Microsoft DirectX SDK (November 2008)\Samples\C++\DXUT\Optional ここにある SDKMesh.h / SDKMesh.cpp
だめだ、DirectX9+Bullet2.76 でサンプルをコンパイルしようとするとどうやっても通らない詰んだ
やった事:
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=28 ここにあるサンプルを頂いて VSC++2008Express でコンパイルして動作を見てみようとした所、
Bullet公式に 2.67 はもう存在しなかったので、最新の2.76 を入手してビルドした。
ところがサイトの説明にあるようなディレクトリパスが存在しないので探した所、
Bullet公式に書かれていた3つのLibを探し出し、それをリンクするようにし( BulletCollision.lib, BulletDynamics.lib, LinearMath.lib )
ヘッダもパスを通した
ところが上記サンプルがコンパイル出来ず、調べた所 CDXUTXFileMesh が見つからなかった。
が、探したらそれだけDirectSDKの別のSample中に置き去りにされていたので、それを拾ってプロジェクトに含めた。
ところがそれでコンパイルすると、今度はリンカが、多重リンクになっているとエラーを吐いて死亡。
>MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _printf は既に LIBCMTD.lib(printf.obj) で定義されています。
など数件
なのでMSDNにあった対策をしてみた所、
http://msdn.microsoft.com/ja-jp/library/6wtdswk0 (VS.80).aspx
今度は Bulletのlib側で acos などが未定義と、700件以上のエラーが出て死亡。
これはもう、あのサンプルはコンパイル出来ないので諦めろ、という事でしょうか
>>248 それ、俺も通らなかったけど、実はBullet公式じゃなくて、
統合3DCGソフトBlenderに含まれているBullet2をリンクしたら出来たぜ
https://svn.blender.org/svnroot/bf-blender/branches/volume25 これをチェックアウトしてビルドして、
build\msvc_9\libs\extern\mtdll\debug\Bullet.lib
これをリンカに通し、
Blender25\extern\bullet2\src
これをincludeパスに足せばいける。 2.76 だと確かに内容も変わっているし、2.67 だと一部のファイルが無かったと思うが、
そもそもそのサイトの人は BlenderのMonkeyモデルをデモに使ってるくらいだからもしや・・・と思ったらビンゴだった。
なんか色々やってたのかもな。 とりあえず、乙
FVFで D3DFVF_XYZRHW | D3DFVF_TEX1 を指定して作った 三角2枚のシングルテクスチャのスプライトを使ってUIを作ろうとしているのですが、 重なりの制御が描画順でしかできなくて困っています。 具体的には、 m_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); でクリアした後、頂点のz座標に 0 より大きい数値を指定したスプライトが描画されません。 0やマイナスを指定すれば描画はできますが、当然前後関係は考慮されずに描画順のみ考慮されます。 何かいい方法はないでしょうか? なんでこんなことをしたいのかというと、Radeon XPRESS 200のPCで UI要素200個の描画をするととんでもなく遅くなってしまったので、 ステートの設定を最小限にしたいと思って試したのですが、望む結果が得られませんでした。
D3DFVF_XYZRHW は座標変換済み=投影後(つまり2D状態)だから、Z値とか意味無くなるんじゃなかったっけ? D3DFVF_XYZ じゃないとダメというか、意味無いような
>>252 トランスフォーム後にZテストしてラスタライズしているのではないのでしょうか?
>>251 そもそもZバッファ作ってる?
D3DRS_ZENABLE、D3DRS_ZWRITEENABLE、D3DRS_ZFUNCはどう設定している?
rhwの値をどう設定している?
252はトンチンカンなこと言ってるので無視でいい。
>>251 正直ステートを多少減らしたぐらいじゃそんなに変わらないと思う
その200個のUIを一つの頂点バッファにまとめて一回で描画するとか
別のアプローチを考えた方が建設的かと
>>251 >m_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
D3DCLEAR_ZBUFFERのフラグが抜けてる
>>255-257 ありがとうございました。
原因は
>D3DCLEAR_ZBUFFER
でした。
そして、
>>256 実は、UI要素の描画を1000アイテムにしても大して速度低下がなかったので、遅いのはほかに原因がありそうでした。
WM_PAINTでクライアント全アイテムを再描画しているのですが、
リサイズがものすごく遅かったので、描画が遅いものだと勝手に判断してしまっていました。
>WM_PAINTでクライアント全アイテムを再描画 ココが問題
サウンドドライバが腐ってる
262 :
260 :2010/04/10(土) 22:14:01
プログラムのミスでこのエラーはありえないですか?
ありえるだろそりゃ
ドライバがロックしたメモリページを開放し忘れたってエラーでアプリケーションが何をしろってんだよ
いくら解説が豊富だといってもDirectSoundはレガシーです。とくに初心者は問題を解決しようとするより別の手段を探してください。 をFAQにしてくれ
2Dビルボード処理を関数ごとに分けてやっているんだが、 なぜか呼び出す行を変えたり、引数を持たせただけで変な方向に動いてしまう これってナニが悪いの?
たぶん糞設計が悪い。どう悪いかはソースがうpされない以上、他人には分からないので自分を責めてください。
>>267 エスパーしてみると
多分、行列計算を理解出来てないと見た
>>268 ソースなんて見るまでもないだろ。
呼び出す行を変えたり、とある辺りでほぼ
>>269 のエスパー内容で確定
もう一度数学Bからやりなおせば解決
よっぽど鈍な子でもない限り計算間違いでそんな動作しないだろ 固定機能でやってて行列のセットの仕方になにか誤解があるんじゃね?
>固定機能でやってて行列のセットの仕方になにか誤解 行列は理解してるが、関数仕様が分ってないレベルなら 行列のセットの仕方が間違ってると気が付くのが道理では? それを気がつけないのを、行列を理解出来てないと言うのでは? 世の中にはよっぽど鈍な子の、遥か斜め上を行く子がいっぱい居るのが現実ですよ
DirectX11で開発しているのですが、RasterizerState の生成に失敗する原因がわかりません。 ビデオカードは、HD5870。OSはWindows7 x64。 D3D_FEATURE_LEVEL_9_1 D3D_FEATURE_LEVEL_9_2 D3D_FEATURE_LEVEL_9_3 の時、生成に失敗でその他レベルは成功します。その他の生成フラグを変えても変化はないです。 CComPtr<ID3D11RasterizerState> RasterizerState; D3D11_RASTERIZER_DESC r_desc; r_desc.FillMode = D3D11_FILL_SOLID; r_desc.CullMode = D3D11_CULL_BACK; r_desc.FrontCounterClockwise = FALSE; r_desc.DepthBias = 0; r_desc.DepthBiasClamp = 0; r_desc.SlopeScaledDepthBias = 0; r_desc.DepthClipEnable = FALSE; r_desc.ScissorEnable = FALSE; r_desc.MultisampleEnable = FALSE; r_desc.AntialiasedLineEnable = FALSE; HRESULT hr = m_Device->CreateRasterizerState(&r_desc, &RasterizerState); hrはE_OUTOFMEMORYが返ります。テストのためにデバイスを生成して、上記のコードだけを実行するようにしても同じ現象が再現します。 レベルの制限の様な気もしますが、それについて書かれている資料を見つけられません。 レベル毎の制限についてのドキュメントか、何か情報があれば教えてください。
dx11知らんけどCreateRasterizerStateでググったら DepthClipEnable must be TRUE.とかなんとか
ありがとうございます。DepthClipEnable = TRUE で一応はS_OKになりました。 10Level9 ID3D11Device Methods 10Level9 ID3D11DeviceContext Methods そのまんま制限仕様が書かれてますね orz
質問です。現在 WindowsXPSP3, VisualC++2008Express で開発しています。 下記クラスを作成/利用したコードを、デバッグモードで実行すると、 free のタイミングで 「ヒープが壊れています」 と言う旨の例外が発生し、実行が停止してしまいます。 wcscpy_s の辺りに何か不安を感じるのですが、一体何がいけないのでしょうか。 よろしくお願いいたします。 class Test { private: TCHAR *strBuf; public: Test() { } ~Test() { if(strBuf) free(strBuf); // ← ここで「ヒープが壊れています」と出て中断してしまう } void setStr(const TCHAR *lpStr) { size_t len = (wcslen(lpStr)+1) * sizeof(TCHAR); if(strBuf) strBuf = (TCHAR*)realloc(strBuf, len); else strBuf = (TCHAR*)malloc(len); memset(strBuf, 0, len); wcscpy_s(strBuf, len, lpStr); } };
277 :
276 :2010/04/12(月) 03:15:56
すみません、誤爆しました。
>>277 コンストラクタでNULL突っ込めばなおるよ。
ハ_ハ
('( ゚д゚∩ なおるよ!
ヽ 〈
ヽヽ_)
DXTC圧縮されたDDSファイルはどのタイミングで解凍されるのでしょうか? A:ホストプログラム側でCreateTexture系関数で読み出したとき B:VRAM上ではまだ圧縮状態で、圧縮のブロック単位でGPUのキャッシュまでロードし、 GPUで解凍しながら処理する
281 :
279 :2010/04/12(月) 21:39:47
>>280 おお。
すると、メモリ帯域的にだいぶ負荷が下がりますね。
解凍にかかる負荷以上に、ボトルネックになりがちなメモリアクセス量を少なくできることによる
速度改善が期待できそうですね。
使用テクスチャの圧縮は積極的に行っていこうと思います。
ありがとうございました。
でもアルファチャンネル付きの画像でアンチエイリアスとかかかってる部分が DXT3にしてもDXT5にしてもあんまり綺麗に出ないよね 細部が良く見えないところはどんどん圧縮しちゃってもいいと思うが
283 :
279 :2010/04/12(月) 22:15:08
>>282 なるほど・・・
DX11では新しい圧縮がサポートされて、品質がだいぶ改善されるようですね。
DX11が浸透するまでは、ご助言通り、使いどころに注意ですね。
D3DXCreateTextureFromFileExでは、読み込む画像のサイズとは異なるサイズで読み込むことができますが、 これを利用して、ユーザーの環境に合わせて読み込む画像サイズを変え、負荷を調整する といったことは効果的なのでしょうか? 例えば、テクスチャファイルは高解像度のものを1枚だけ用意し、ユーザーが 「テクスチャ品質:高」に設定すれば、そのままのサイズで読み込み、 「テクスチャ品質:低」に設定すれば、縮小して読み込む、といった具合です。 縮小処理のため、ロード時間は増えてしまうかもしれませんが、許容範囲であれば 配布時に複数解像度のテクスチャをいちいち用意しなくてもよくて良いと思うのですが。
ジオメトリシェーダでできることは、DX11で追加されるテッセレーションステージでできるように思うのですが、 それでもこのシェーダがパイプライン上にあるのは、DX10との互換を保つためなんでしょうか? それとも、テッセレーションステージでできなくて、ジオメトリシェーダでできることがあるのでしょうか?
加算合成で画像を表示するために下のように書いたのですが、合成されません。 どうすればよいのでしょうか。 g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); g_pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); g_pD3DXSprite->Draw(img[imgID],&rectImage, &D3DXVECTOR2(1.0,1.0),NULL, 0.0f,&D3DXVECTOR2(imgX, imgY), 0xffffffff);
市販・同人合わせて、日本のゲームで高スペック仕様なんてみたことねーですね。 みんな貧乏性なので、標準でも全然ok。帯域がどうとか自己満w。 まあ自己満でよければテクスチャを1/2や1/4に縮小するモードでも付ければって感じです。
>>285 別々のレンダーターゲットに別々のカメラから見た絵を
描こうとしたら基本的にはGSを使うしかないわけだが。
テッセレーターは細分化するのが役目であって、
描画先の指定や細かい制御は出来ないよ。
ポストエフェクトはいちいち描画しなくてもCSで出来るようになったのは便利だね。
>>286 ID3DXSprite::Beginはレンダリングステートを特定のものに書き換えるぜ
ここで通常合成に変えられちゃってるんじゃ?
BeginとEndの位置はどこよ?
290 :
284 :2010/04/13(火) 07:38:30
>>287 カプコンのPC版デビルメイクライ4体験版でテクスチャ解像度の高低を設定できるようになっていました。
個人作成のソフトではそういった設定はあまりないんですね。
必要かどうかよく吟味したいと思います。
ありがとうございました。
291 :
285 :2010/04/13(火) 07:40:54
>>288 ディスプレイスメントマッピングなど一部処理は新たに設置されたテッセレーションステージ
でやるほうが良くなったかもしれないくらいで、
基本的にはジオメトリシェーダならではの処理がまだあるということですね。
ありがとうございました。
292 :
286 :2010/04/13(火) 18:46:57
>>289 HRESULT Render(void)
{
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(90, 50, 30), 1.0f, 0);
if (SUCCEEDED(g_pD3DDevice->BeginScene()))
{
drawMain();
g_pD3DXSprite->End();
g_pD3DDevice->EndScene();
}
return g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
こんな感じで書いていて
>>286 の処理はdrawMain()で行っています。
>>292 じゃなくて
g_pD3DXSprite->Begin()はどこ?
294 :
286 :2010/04/13(火) 19:34:45
>>289 >>293 g_pD3DXSprite->Begin()使ったら適用されました。
ありがとうございました。
なんでそうなるのか分かってなさそうで怖いな 後で同時にスプライトとメッシュを同時に描画すると表示がおかしくなります。とか聞きにくるなよ?
パチンコのゲームみたいに単発のSEが多量に流れるようなアプリケーションを作るには DirectXの場合はDirectSoundになるのでしょうか? 並行してコンポの液晶面や音楽プレイヤーなどでよく見かける ↓のような表示(何ていう名称なんでしょう)を行いたいのですが、流石にこちらはDirectXに頼れないですよね。 ■ ■ ■ ■ ■ ■■ ■ ■■■ ■■■■■■■■■■■■■
スペクトラムアナライザー
DirectAudio(Sound、Music)やXAudio2、XACT、OpenALなど様々なAPIがあるけどどれを使ったらいいですか サンプルの多さとWAVE、MIDIに対応してるDirectAudioに魅力を感じているのですが既に廃止済みとのことで・・・ DirectAudioは使うなというMSの方針に従うべきなのかどうか
FFT変換 高速フーリエ変換変換
302 :
デフォルトの名無しさん :2010/04/14(水) 18:38:07
すみません テクスチャを256x256 4枚 → 512x512 1枚に押し込めて動作テストし、 2回のQueryPerformanceCounterで経過時間を取得したのですが 誤差程度の変化しか有りませんでした。 マテリアルの切り替えは「非常に重い」と聞きますが、テクスチャをやたらと1枚に押し込めても 結局処理速度の向上は望めないものなのでしょうか?
>>302 最適化する前に、マテリアルを一切切り替えず全部同じマテリアルで表示すると明らかに速くなったりするかを見てみる
グラフィックパイプラインのチューニングは、なにが原因で速度が遅いのかを調べてそこを最適化しないと効果は現れない
>>302 DrawPrimitiveは描画が終わるまでブロックするわけじゃないから、
その前後で時間を測っても処理時間は測定できないよ。
>>302 いまどきのグラボだったら、全部VRAMにのっちゃうから切り替えコストはあんまりかからないような・・・
自分もマテリアルの切替が遅いってのを聞いて気にしてるんだけど、 VRAMがたっぷりあって、それの上に乗っかる分には大丈夫なわけ?? VRAMに余裕がなくて、いちいち転送の必要がある場合に遅いと? シェーダおよびシェーダ変数の切替コストも上記と同じ考えなのかな?
同じだよ
コンシューマでの開発だったら変わるんだろうけどね
深度バッファシャドウ用のシャドウテクスチャ(浮動少数点バッファです)に保存する際のZ値ですが、 ピクセルシェーダに渡されたトランスフォーム後座標をPosとすると、一般的には (出力) = Pos.z / Pos.w; としたり、 (出力) = Pos.w / (遠平面距離) として、シャドウテクスチャを参照するときも同様にして各ピクセルの深度値と比較します。 たしかにこのやり方だとうまくいきます。 しかし、Pos.wを直接出力してもうまくいくと思って試してみたところ、うまく影が出ませんでした。 Pos.wは射影変換前のライトカメラ原点からZ値のはずなので、Pos.w/(遠平面距離)とは 0〜1に正規化するかどうかだけの違いで、影かどうかの判定結果は同じになると思うのですが・・・
310 :
302 :2010/04/15(木) 00:08:05
303-308 ありがとうございます。為になりました。
311 :
306 :2010/04/15(木) 02:12:19
>>307 >>308 ありがとう、勉強になった。
ユーザーにはできるだけ良いグラボを使ってもらうようお願いしよう(笑)
すみません、質問です。 現在 WinXPSP3 + DirectX9 (2008 August) でアプリケーションを作成しているのですが、 Direct3D で描画をする際に、実装予定の機能上の都合で 3D画面が重なったようなレンダリングをしたいと思っています。 具体的には、ポリゴンメッシュを通常通り3Dで描画した後、その上に重なって見えるように また別のポリゴンメッシュを表示したいのです。 ※丁度モデリングソフトで、メッシュ上にボーンや頂点移動のハンドルが重なって=見かけ上、常に手前に表示されているような状態 これらを実現する方法として、例えばデバイスコンパチブルなBitmapを別にバッファとして用意し、 そこに重ねて上に表示したい内容をレンダさせ、それを3D画面上にスプライトとして重ねてしまえばいいのかなと思ったのですが、 そのような方法(実現可能かどうかはこれから調べる)で良いのでしょうか。 あるいはもっとシンプルな方法がありますでしょうか。 よろしくお願いいたします。
>>312 一番簡単な方法は、裏になるレイヤを描画した後にZバッファだけクリアして
手前のレイヤを描画。
別々に描画して後から重ねたいなら、RenderTargetTextureに対して描画。
314 :
312 :2010/04/15(木) 10:48:00
>>313 早速のレスありがとうございます!レスを頂いてからあっと気づきました・・・
Zバッファクリアだけで無事実現出来ました。ありがとうございました!
315 :
309 :2010/04/15(木) 22:55:52
自己解決しました。 出力先の浮動小数点バッファの初期化(クリア)が問題でした。 IDirect3DDevice9::Clearの色指定は0〜255の範囲内でしかできないようですが、 浮動小数点バッファはもっと広い範囲を記録できるにも関わらず、 0〜255の範囲内でしか初期化できないのでしょうか? 深度などを描画するときは、0.0f〜1.0fに正規化すれば良いのですが、 正規化せずに使うような用途のときは、広い数値範囲の初期化が必要になることも あると思うので気になりました。
DirectX9の仕様です。10では改善されました。
317 :
309 :2010/04/15(木) 23:08:20
>>316 おお、そうだったんですか!
すっきりしました。
ありがとうございましたm(_ _)m
すみません、質問です。 WindowsXPSP3、DirectX9c、VisualC++2008Expressで開発しています。 ウィンドウのリサイズ(WM_SIZE)のタイミングに合わせてデバイスをリセットする処理で詰まりました。 ググって見つかるサイトやMSDNの説明により、そのタイミングで IDirect3DDevice9 の Reset() を 実行する必要がある事はわかりました。またその際に、 事前に各種取得内容を Release() する必要がある事も把握しているのですが、 どうやっても Reset の戻り値が INVALID_CALL となってしまい、完了出来ません。 D3DPRESENT_PARAMETERS などに設定している内容は以下の通りで、 D3DPRESENT_PARAMETERS dp; dp.BackBufferCount = 1; dp.Windowed = TRUE; dp.BackBufferWidth = 0; dp.BackBufferHeight = 0; dp.BackBufferFormat = d3ddm.Format; // pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT , &d3ddm) で得た物 dp.MultiSampleType = D3DMULTISAMPLE_NONE; dp.MultiSampleQuality = 0; dp.SwapEffect = D3DSWAPEFFECT_FLIP; dp.hDeviceWindow = hWnd; dp.Flags = 0; dp.EnableAutoDepthStencil = TRUE; dp.AutoDepthStencilFormat = D3DFMT_D16; dp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; dp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; 〜 続く
319 :
318 :2010/04/16(金) 11:43:28
続き 〜 デバイスから CreateVertexBuffer/CreateIndexBuffer している内容はいずれも D3DPOOL_MANAGED になっています。 ※D3DPOOL_DEFAULT としている場合は、これらも Releaseする必要があるが、D3DPOOL_MANAGED である場合 Releaseしなくても良いとの記載がありましたが、念のため Release試しましたが、どちらでも同じ結果になります。 また D3DXCreateTextureFromFile で作成した LPDIRECT3DTEXTURE9 についても、念のため Releaseしています。 他、まったく使ってはいなかったのですが、念のため GetBackBuffer/GetDepthStencilSurface でLPDIRECT3DSURFACE9 を得て、 これらも Release してみましたが、結果が変わりません。 さらに GetSwapChain で IDirect3DSwapChain9のポインタを得て、これも試しに Releaseしましたが変わりません。 以上を全て デバイスResetの直前に行い、Resetを実行しても INVALID_CALL になってしまうのは、 何が原因として考えられるのでしょうか。 よろしくお願い致します。
デバイス生成したスレッドでReset呼び出す必要があった気がする
>>320 レスありがとうございます。 はっとして確認していみましたが、
※Win32の GetCurrentThreadId() で値を確認
もともとマルチスレッドにはしていないので、どのタイミングでも同じIDが戻ってきました。
他に何か原因となりそうな事はありませんでしょうか・・ すみません
D3DPRESENT_PARAMETERSがデバイス生成した時と同じパラメータになっているか確認しる。つーかバックバッファのサイズが設定されていないようだが? D3DCREATE_MULTITHREADEDで生成していない場合、絶対に複数のスレッドからアクセスしてはいけない。
323 :
デフォルトの名無しさん :2010/04/16(金) 16:58:16
deviceって何? サンプルソースで描画に使ったりしてるけど 簡単に教えてください 引数で渡すということは、切り替えることもあるんですよね 切り替えることで出来ることって何ですか?
>deviceって何? デバイスドライバの事かと。 >切り替えることで出来ることって何ですか? マルチモニタで二つ以上のモニタを使っている場合、 どのモニタでもフルスクリーン表示が出来るようになる。
>>318 ちょっと聞きたいんだが、WM_SIZEのタイミングに合わせてデバイスリセットって本気か?
バックバッファから作り直すの?
ウインドウの大きさをマウスドラッグで変えまくったら、ものすごい勢いでデバイスリセット発生させるんか?
参考までに、DXUTでは、WM_SIZEを受け取ってもドラッグ中の場合はデバイスリセットしないような実装になってるね。
フラグメントリンカでシェーダを生成しようと思うのですが、 これって、AlphaEnableやZEnableといったステート設定はホストプログラム側で固定機能時代のように SetRenderStateで設定してやる必要があるのでしょうか? フラグメントでないHLSLではtechnic宣言部で指定できて、ステートの保存、復帰といった面倒もなくて扱い易かったのですが・・・
>>325 Windows的には本当はサイズ変更中に来るメッセージはWM_SIZINGで
WM_SIZEはサイズ変更が確定した後に一度だけ来るメッセージなんだけどな。
実際は「ドラッグ中にウインドウの内容を表示する」オプションを有効にしていると、
物凄い勢いで送ってくるが。(有効が普通)
>>328 XP以降ではそのオプションは有効がデフォルトだよね
>>324 回答ありがとうございます
モニタとかへのハンドルみたいなもんですか?
とりあえず質問する時は9、10、11をははっきりさせようぜ
333 :
327 :2010/04/16(金) 21:16:14
>>332 すみません、DirectX9です。
>>331 やはりそうですか・・・
柔軟性のためのトレードオフですね。
固定機能処理に依存するので、DX10以降で使えないというのも納得ですね。
DirectX9について、頂点シェーダからピクセルシェーダに、TEXCOORDセマンティクスの変数を受け渡すとき、 ハードウェアでパースペクティブコレクト補間されますが、 このとき、補間のための情報として「w成分が参照される」ということは分かったのですが、 この「w成分」というのは、補間しようとしているTEXCOORDセマンティクスの変数のものなのか、 それとも、POSITIONセマンティクスで出力した、ラスタライズで利用される頂点位置のものなのか、 どちらでしょうか? TEXCOORD側のw成分はパースペクティブコレクトで参照されないだろうと思って、 w成分だけ頂点シェーダでいじると、どうもピクセルシェーダに達したときに、各成分値がおかしくなっているようなんですが・・・
336 :
335 :2010/04/16(金) 22:31:04
すみません、ピクセルシェーダで値がおかしいのは別の問題でした。 ただ、VS -> PS間での動きは気になるので、上記について何か知っていれば教えてほしいです。
普通はPOSITIONで出力したもの。 TEXCOORDは他で色々使うし。
339 :
335 :2010/04/17(土) 09:55:47
>>337 やはりそうですよね。
いろいろいじってみましたが、それの場合に辻褄が合う結果っぽいです。
ありがとうございました。
>>338 ありがとうございます。
そのページはチェック済みでしたが、パースペクティブコレクトについては触れられておらず、
まだ釈然としませんでした。(wの意味についてはとても参考になりました)
ゲーム処理部と描画部分けて、ゲーム処理に応じて描画部分で、 事前処理(シャドウマップとか)、不透明描画、半透明描画、ポストエフェクト みたいな流れになると思うのですが、 こういう描画の管理はどういう手法が一般的なんでしょうか・・?
メッシュの重心を求める方法を教えてください。全部三角ポリゴンで構成されているとします
メッシュの形にもよるかなぁ メッシュが原点と各ポリゴンで構成される三角錐の総和であるなら求められると思うが… 人型とかだとちょっと分からん
>>341 それもうDirectXだとかメッシュだとかの話じゃなくて
純粋に数学の話じゃないのか
>>340 一般的にも何も、そのままじゃね
そしてその時の都合によって、その中のどれかの処理は 「既に処理済みだから、このタイミングでは省く」 のようにして
無駄なコストを省いて効率化するとか。 一般的にも何も、その時作ってる内容によるよ。
お手本もマニュアルも無い。
>>344 大量のモデル出したり、描画プロセスが複雑化してきたら
どうやって管理してるのかなぁと・・・。
自分の場合、仮想関数でDraw作って、
それを描画リストに積んで、ソート後にまとめて実行してます。
>>345 例えば各モデルの個別の描画内容って、それぞれに
StreamSource や マテリアル、テクスチャ、レンダリングステートが違っているような場合、
多分どういう形で持つにしても結局それらをどこかでまとめて連続実行する必要があるわけなので、
例えば描画処理を行うクラスを多段にするにしても、モデル側にBeginScene後に呼ばれる処理を個別にカプセルしても、
結局そういう形になるとは思うぜ。 なのでそれでいいと思う。 俺も大雑把に言えば
class IModel {
public:
virtual ~IModel() {}
virtual void drawMe(略) = 0;
};
class Player : public IModel { public: void drawMe(略) { 個別のセット } }; // 注:レスの改行の関係で圧縮表記
class Enemy : public IModel { public: void drawMe(略) { 個別のセット } };
こんな感じだ。 で、こいつらのインスタンスを描画専用クラスのメソッド内、 BeginSceneで挟んでループみたいな。
>>341 ここじゃなくてCAD関連スレで聞いたほうが速いかも
DirectX9について HLSLのシェーダの入出力記述で、TEXCOORDnセマンティクスを付けてテクスチャ座標値として 扱うことができますが、これって何個まで(nのところ)指定できるんでしょうか? GPUによって違うのでしょうか? それとも、PS3.0とか、シェーダのバージョンによって既定されているんでしょうか?
>>348 シェーダのバージョン
vs/ps2.0 TEXCOORD0〜TEXCOORD7
vs/ps3.0 TEXCOORD0〜TEXCOORD15
350 :
347 :2010/04/18(日) 16:28:19
すみません 木などで抜き色(アルファ)テクスチャの板ポリが交差している場合、 1メッシュとしての描画は、ソートしても交差までは正常に描画されない(?)ので 交差分は別メッシュとしてDrawSubsetを別け、 描画済みの結果の上に描画させようと思うのですが、このやり方はマトモ(普通・定番)なのでしょうか?
>>351 先に2値でZだけ書いて、後からα部分を重ねるとかは?
フィルレート無駄に消費して大量の木とかには向かないと思うけど・・・。
立体視だと手抜き表現は、とても変に見えるんだぜ
すみません、初歩的な質問かもしれませんが・・・ D3DXVECTOR3 に D3DMATRIX をかけて新しい D3DXVECTOR3 を得る関数って、ヘルパーで存在しないのでしょうか。 演算子オーバライドかなと思い、変数同士をかけてみたところコンパイルできませんでした。 (行列かける行列は可能な事は知っています) よろしくお願いいたします。
D3DXVec3Transformかな? 色々種類があるから注意してね。
演算子で用意してないのは、種類があるから誤用を防ぐ為なんだろうか?
ゲームのように速度に致命的な問題を抱える可能性のあるものは、 演算子=関数呼び出しを幾らか減らすことでオーバーヘッドを削ることがある。
そんな気がするね。 マトリックスは一律4x4なのに対し、ベクトルは要素数が3だったり4だったりして、wの扱い方によって 何種類もの演算の種類が発生してしまう。
D3DXVECTOR3::operator * に ( a.x * s, a.y * s, a.z * s )はあっても( a.x * b.x, a.y * b.y, a.z * b.z )がないところとか。
自分の場合、4x4と3かけて3取る事が多いから、自前で演算子追加したいけど、 演算子が継承されないから面倒なんだよな・・・。
362 :
351 :2010/04/18(日) 19:01:15
>>352 >>353 ありがとうございます。
先にZだけ書いて後から・・そんな方法も有るのですね。
将来的にはそういう事もできるようにはなりたく思います。ありがとうございました。
>>360 Vector同士 の掛け算でそんな計算されたら困るだろw
質問します。現在 WinXP/VC++/DirectX9環境でアプリケーションを製作しています。
Webを回って、とあるシェーダを使ったサンプルソース見つけたのですが、その中に次のような記述がありました。
D3DVSD_STREAM(0),
D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ),
D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3 ),
D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ),
D3DVSD_REG(D3DVSDE_TEXCOORD1,D3DVSDT_FLOAT2 ),
D3DVSD_END()
調べた所、これら D3DVSD_ で始まるマクロはいずれも DirectX8 時代の物だそうですが、
これらに対応する DirectX9 でのマクロ、あるいは内容はどのようになるのでしょうか。
よろしくお願い致します。
あと、
>>355-356 ありがとうございました。自分は
>>354 です。
>>364 8時代のアセンブライクなシェーダの産物だから
HLSLが主流となった9では代替となるものは無いかなぁ
あえて上げれば
D3DVERTEXELEMENT9
IDirect3DVertexDecralation9
辺りをググって情報を集めるべし
でも、素直にそのサイトはあきらめてHLSLで解説してるサイトを参考にした方が良いと思われる
HLSLの組み込み関数のstepの意義って何なんでしょう? 単に(x>=y)って書くのとどう違うんでしょうか? ハードウェアの比較器を使うから(有意かは環境によるとして)理論的には速く処理されるのでしょうか??
a = a + 1; a++; どっちも結果は同じなのに何故あるのか、みたいな話か
生成されるアセンブリが違う どう違うかはハード依存
DirectSoundで質問です December2004のDirectSoundでストリーミングバッファ再生に挑戦しているのですが、 DirectSound8オブジェクト作成 →協調レベル設定 →DirectSound8からDirectSoundBuffer作成 →DirectSoundBuffer->QueryInterfaceでDirectSoundBuffer8作成 とここまでは成功するのですが、次のDirectSoundNotify8をDirectSoundBuffer8のQueryInterfaceで作るところで必ず失敗します (HRESULTに-2147467262が入っている) 他のサンプル等でもこのように普通に作成しているみたいですが、作成順序がまずいんでしょうか?
あれ……。 ひょっとして、テクスチャの初期化(device->CreateTexture())ってかなり重い……?
372 :
367 :2010/04/20(火) 20:42:05
>>369 ありがとうございます。
stepのほう使います。
>>370 HRESULT: 0x80004002 (2147500034)
Name: E_NOINTERFACE
Description: The requested COM interface is not available
Severity code: Failed
Facility Code: FACILITY_NULL (0)
Error Code: 0x4002 (16386)
サウンドドライバの問題じゃね?
別PCで試すかソースうpすれば誰かが試してくれるかもしれない
>>371 作成自体も重いし、毎フレームテクスチャを作って消して…
なんてやってると断片化を誘発してさらに重くなる
MANAGEDでテクスチャを作ってるとさらにタチが悪い
>>374 なるほど……。
画像を800x600のテクスチャとして初期化するのに0.24秒、
1600x1200だと1秒強かかってしまうんだ。(ネットブックにて)
Core i7/RADEON 4850だとこれの大体4倍くらいだけど、
画像ファイルをオンメモリに展開するだけならこれの3〜5倍くらいは早いので、
残りは純粋なテクスチャの初期化とデータ転送ということになりそうなんだが、
どういう方針で高速化を図るべきか……。
>>367 stepはマニュアルを読む限り、vectorやmatrixでも使えるのが
特徴ではないのか?
>>369 どういうこと?生成されるアセンブリコードは
ハードが違っても同じじゃないの?
つーかコンパイルにハードは関係ないでしょ。
377 :
367 :2010/04/20(火) 22:59:46
>>376 vectorやmatrixも、普通の比較演算子で比較できませんでしたっけ??
>>375 0.24secって絶望的なほど重いが。
30FPSで0.03secだぜ、もう一度計測しなおした方がいい。
>>377 float4 v2 = v0 >= v1 ? 1.0f : 0.0f;
三項演算子で書くとこうだけど、これでちゃんと
各要素独立して、1or0が入るのか?
試してないんでわからんが、
入るなら同等だと言えそうだ。
RadeonでテクスチャLockすると妙に遅くなってたなぁ・・・。 同レベルのGeforceを同じコードで動かすと何故か遅くならなくて謎だった。
命令数の消費が違かったきがするけど 昔の話かも
ゲフォがメインメモリにテクスチャのコピー持ってて ラデがロックの度にVRAMから転送とかそんな感じじゃないの 知らんけど
暇つぶしにdx11の勉強をしようと思うんだけどいい本ある?
DX11の本は見かけないなぁ。 かわりに、GDCの講演資料とかAMDのテクニカルペーパーが今のとこ一番役に立ってる。 ComputeShaderやらHullShaderやらDX11で追加されたもの以外は DX10と大差ないから、1から勉強しなくてもだいたい分かるっしょ。
>>384 d
ずっと9やっててまだ10触ってないからとりあえず10の本買って遊んでみようかな
新しいシェーダも今のとこ興味ないし
DX10以降、めっきり本が減ったね・・・ xファイルサポート打ち切ったり、初心者お断り感が増しちゃったっぽいのもあるかも。
普通の人にはDX9でほぼ完成してたりDX10のプラットフォーム問題もあったりで 本の需要自体があんまし無いのかもしれない
ゲームプログラミングにおいても 日本は衰退の一途をたどっているからな 仕方ない
ホビーユースだとDX9は王道だよね。 普及度、扱いやすさ、完成度、どれをとってもピカ一。
売れないと分かってる本を刷る出版社は無い 11はWindows7の普及待ちかと
DirectX9のリリースが2002年末 2003年中に出た9関連書籍は工学社のいつもの奴くらいで 今出てる関連書籍の半分以上は2005〜2007に発売されたもの 9の本が多いのは単純に9が超ロングセラーだから。 夏か秋くらいに「11実践プログラミング」みたいなのが工学社からでて その後しばらくは11がどれくらい定着するか様子見って感じかな
最近は知らんが、アセンブリレベルで命令違ったりしてたよね ハードごとというより、cpu gpuごとにと言った方が正確だと思う
393 :
371 :2010/04/21(水) 01:40:33
(テクスチャの初期化の高速化の件)
書き忘れたけど、DX9でD3DPOOL_MANAGEDで確保している。
>>378 別に毎フレームごとに初期化してるとは言ってないよ。
初期化に時間がかかりすぎて困ってはいるけど。
>>380 ,382
そいや、文字描画用に頻繁に書き換えて使うテクスチャの更新も
やたら時間かかってるんだよなぁ。
こいつはD3DPOOL_DEFAULT/D3DUSAGE_DYNAMICで初期化したほうがいいんだろうか?
394 :
389 :2010/04/21(水) 01:45:57
>>389 試しにVista上でDirect3DExを使ってみたら鬼のように楽になったりするので、
基本的にDirectX関係は新しいほうが却って楽になると思われ。
そもそもDX10以降じゃReset地獄自体がないわけだし。
あ、名前欄にも書いちゃった。ごめんね。
>>394 Direct3DExか・・・
聞いたことはあったけど、あまり意識したことはなかったなぁ。
検討してみるよ。
>そもそもDX10以降じゃReset地獄自体がないわけだし。
描画のBegin、Endとかがないとかだっけ?
良くなってるとこもあるよね。
>>393 ・テクスチャサイズを2の累乗にしてみる(512,1024...)
・D3DPOOL_DEFAULTで確保してみる
・DeviceをMULTITHREADEDで初期化してないか調べる
>>397 ・テクスチャサイズは2の累乗にしている
・D3DPOOL_DEFAULTで確保するのはこれから試す
・DeviceはMULTITHREADEDで動かしてる。そうじゃないと動作中にテクスチャを読み込めない。
11触ると9が糞に見えるくらい使いやすい もうみんなWindows7に移行した・・・よな?
DX10がXP対応だったら普及すると思うが、 XP切り捨てるにはあと3年くらいかかりそう・・・。 今から作り始めたら完成まで3年かかって 丁度いいかもしれないけどw
>>398 何もしない空のDX9のアプリ作って、同じサイズのテクスチャ作ってみても同じだけ重いのか確認してみた?
>>401 同じだけかかる。
i7/RADEON 4850の環境で1600x1200のテクスチャの初期化に0.21-0.24秒かかる。
・device->CreateTexture()
・texture->GetSurfaceLevel()
・D3DXLoadSurfaceFromFile()
の3段階に分けてみたら、LoadSurfaceで普通にD3DXCreateTextureFromFileExで
初期化するより時間かかってしまった。(0.8秒くらい)
・device->CreateTexture(D3DPOOL_DEFAULT)
・D3DXCreateTextureFromFileEx(D3DPOOL_SYSTEMMEMORY)
・device->UpdateTexture()
に分けてみたら、早くはならないがUpdateTextureそのものは0.02秒程度でいけた。
初期化の高速化にはならないが、テクスチャの切り替えには使えそうだ。
ちなみにdevice->CreateTexture(D3DPOOL_DEFAULT)は0.0006秒と出る(タイマーにそんな精度無いけど)
D3DXLoadSurfaceFromFile()でD3DPOOLの違いによってかかる時間はほとんど変わらないし、 D3DCREATE_MULTITHREADEDあるなしでは、 少なくとも無負荷時には初期化の所要時間に変化は見られない。
1600*1200って2の累乗じゃねえじゃん、という突っ込みと テクスチャフォーマットは何なのか、という疑問
ていうかCreateTextureが重いんじゃなくてファイルから読んでるところが重いんとちゃうの?
>>404 2048x2048で確保して、(0,0)-(1600,1200)の範囲にマッピングしてる。
>>405 どうなんだろ。今までD3DX系でしか読み込み処理やってない。
そういえばlibpngを使ってるゲーム処理系は多いけど、
これ使って自前で読み込んだ方がD3DX系よりも高速なんだろうか?
ちなみにpngの代わりにbmpやddsに切り替えてみたけど、全く早くならない。
D3DUSAGE_AUTOGENMIPMAP使ってMIPMAP生成をショートカットすると
ほんのちょっと早くなるけど、大勢に影響はない。(0.01〜0.02秒くらい減る)
>>406 SurfaceFormatをDXT1か5にすれば、劇的に早くなると思われ
408 :
407 :2010/04/21(水) 10:19:39
あ,ddsでの話ね
>>407 却って遅くなった。0.41-0.45秒(遅くなるとはオレも思わなかった。???)
フォーマットはDXT5。
D3DXCreateTextureFromFileExで2048,2048のテクスチャに読み込ませた。
D3DXCreateTextureFromFileExをやめてEx無し版にしたら劇的に遅くなる(1.57秒)
って、あ!
テクスチャのサイズも1600x1200にしたら劇的に早くなった!(0.006秒)
これはやべえ。改善の余地ありすぎる。
とはいえ、DXT系の劣化を受け入れられる用途じゃないけど。(DXT系を使うくらいならそもそも解像度を下げればいい)
409の続き。 あ! テクスチャのサイズを2048x2048をやめて、テクスチャと同じ1600x1200にしたら 劇的に早くなった!(D3DXCreateTextureEx()で0.09秒) これくらい早ければ十分実用域だなぁ。 あともう一息なんだが。
読み込むファイルを2048x2048にしたらどうなるの? つか1600x1200ってやたらでかいな
D3DXCreateTextureExの拡大フィルタで時間食ってるとかのオチじゃね
D3DXCreateTextureExのフィルタ処理は遅いよね。 速度を稼ぎたければDDSでミップマップまで用意しておくといい。
あ!
>>412 ,413
1600x1200の場合、
ミップマップ生成なしで0.08-0.11秒、
ミップマップ生成ありで0.14-0.18秒だね。
2048x2048にはめ込む場合、
ミップマップ生成なしで0.21-0.23秒、
ミップマップ生成ありで0.34-0.35秒になる。
たしかにミップマップ生成でいくらかは遅くなるけども、
それよりも2の累乗サイズを確保してはめ込みをする方がペナルティーが大きいようだ。
なんでやねん。
D3DXCreateTextureFromFileExのFilterとMipFilterの引数は何にしてる?
あ!
>>416 それぞれD3DX_FILTER_NONEとD3DX_FILTER_LINEAR。
今、MipFilterをD3DX_FILTER_BOXに変更したら、ミップマップ生成が高速になった。
1600x1200の場合、ミップマップ生成ありで0.08-0.11秒。
2048x2048の場合、ミップマップ生成ありで0.20-0.23秒。
ぶっちゃけそんなとこにこだわる前に他にやることが山ほどあるだろうに
>>396 なんでReset地獄が、描画のBegin、Endって話になるんだ
おい!小池!
ワロタw
何が面白いんだ?
DX9しか知らないと、DX10はあれもこれも出来なくなってて途方にくれるが そういうのは全部9の悪癖だった過ぎない、いらないものだったと分かる。
>>423 俺が知る限り、おそらく都内近郊から毎朝電車で通勤してるやつなら、
一度は目にしてるネタww
[D3DXCreateTextureFromFile] format = D3DFMT_A32B32G32R32F 4096 x 4096 time = 0.653363 2048 x 2048 time = 0.605009 1024 x 1024 time = 0.165639 512 x 512 time = 0.022681 256 x 256 time = 0.024446 128 x 128 time = 0.014270 64 x 64 time = 0.011157 環境は5,6年前のノートPCを考慮しても 確かに遅いな・・
4*4*2048*2048=67,108,864 64MBか
そりゃ128bit floatテクスチャは重い罠
つか、そこが遅いとか不毛なこと気にするより 遅くともあまり気にならないような裏読みのシステム考えた方が建設的なんじゃないの
>>425 いやポスターは知ってるが、どこが面白いのかと聞いているんだ
DX10だと、スクリーン切り替えとかResetとか簡単になってるの?
デバイスロスト対策をしなくてイイのは大きいね。
大きいね。
面倒だからゲーム中のウインドウモード切り替え機能を廃止した
>>429 既に簡単な先読み機構は用意している。
しかしそれでも、テクスチャ1枚の初期化に1秒以上かかるようでは(ネットブック)
間に合わない場合が出てくる。
特にタイトル画面とか本編外のシステムデータとかは同期的処理になってしまわざるをえない。
(先読みしたら相当な枚数になる)
ウィンドウ切り替えとか、デュアルモニタ対応とか、ビデオカードの種類による対応辺りを いい加減SDK側で自動対応して欲しい・・・
>>431 Vista以降ではビデオカードのドライバがWindows Driver Model準拠になって
ビデオカードのメモリをOSが管理するから、
アプリ側でReset処理を行う必要が根本的に無くなっている。
WDM版DX9であるDirect3D9Exは
Reset処理そのものは必要だけどLoad/Unload処理が不要になってる。
Windows Driver Model→Windows Display Driver Model
439 :
437 :2010/04/22(木) 11:57:10
ごめん。嘘が混じってた。 >Reset処理そのものは必要だけどLoad/Unload処理が不要になってる。 じゃなくて、D3DPOOL_MANAGEDがなくなってD3DPOOL_DEFAULTのままで よきに計らってくれるようになり、D3DPOOL_DEFAULTなテクスチャの破棄が不要になった、ということだね。 さらに複数のd3ddevice間や他のプロセスとでもリソースが共有できるようになった。
リセットと言えば directx9で質問なんですが、 FLIPに使うバックサーフェスをリサイズしたい場合って、全部リセットしないとダメなんですか? 例えば デバイスから作り直さなきゃ行けないとか ウィンドウモードで、どうやるのが常道なのかわかりません
441 :
437 :2010/04/22(木) 13:26:05
>>426 D3DFMT_A32B32G32R32Fはゲームだとまだあまり使わないけど、
ロード時間の比較は興味深い。
512x512未満ではテクスチャの大きさで所要時間の差がなく、
1024x1024では7.33倍の時間がかかり、
2048x2048ではほぼ順当に約4倍、
4096x4096ではまた増えなくなっている。
そんなのハードのメモリ転送の仕組みが分かってれば自明だろうに
んだ
>>440 リセットだけでいい。
ウィンドウリサイズでは、リサイズ完了までリセットは避ける。
>>442 ,443
メーカー、製品の世代、GRAMのバス幅、動作クロック等で
様々変わってくる部分なのに、
なぜ自明だと言える?
それが分かってるってことは なんで時間がサイズと比例じゃないのかが分かってるってことじゃん
計算云々の前に毎フレームテクスチャの生成と破棄をする設計が根本的におかしいだろw
DirectX9のHLSLについて質問です。 グローバル変数をいくつか記述(宣言と同時に初期化)するとして、その中で、実際に各シェーダで 一度も使われないものがあった場合、コンパイル時の最適化で消してくれるでしょうか? それとも、定数レジスタを喰ってしまうのでしょうか? なぜこのようなことを聞くかというと、シェーダパスによって、グローバルの大きな配列変数のいずれかを 使うようにしようと思っており、もし使わない配列が定数レジスタを喰うようであれば、他のやり方を 検討すべきと思いまして。 float3 Ary1[ 16 ] = {
450 :
449 :2010/04/23(金) 01:27:20
すみません、途中で送信してしまいました。 float3 g_Ary1[ 16 ] = { ← Pass0でのみ使用 float3( ・・・ ), ・・・ float3( ・・・ ) }; float3 g_Ary2[ 8 ] = { ← Pass1でのみ使用 float3( ・・・ ), ・・・ float3( ・・・ ) }; ・・・
fxc.exeの/Fcオプションでアセンブラを吐いて比較してみればいい
すみません、 透過テクスチャを貼った、2つの「交差」したポリゴンを個別に描画しているのですが、 2番目(後)に描画したポリゴンの一部が、1番目(前)に描画したポリゴンより後ろに有り、そこが描画されません。 Z値の比較で描画する必要なしとみなされ描画が働いていないと思われるのですが、Z比較をナシにすれば距離が完全に崩壊しますし・・。 各種ゲームで当たり前のように木や草で透過付きポリゴンの「交差」を見かけるのですが あれは全て交差と見せかけた別ポリゴンなのでしょうか? それとも交差しても正しく描画する方法が有るのでしょうか?
>>452 透過付きってのがアンチエイリアス等の半透明じゃなくて抜きでいいなら
アルファテストで抜き部分のz値を書き込まないことは可能
>>452 マテリアルの順序。透過するテクスチャを最後に
455 :
452 :2010/04/23(金) 12:08:08
>>453 アルファテスト、ググって取り込んだらあっさり正常に描画されました。ありがとうございます。
>>454 はい。そっちの方は既に注意を受けてから心がけております。ありがとうございました。
Direct3D9の固定シェーダーで、 L8で確保した単色のテクスチャの輝度値を アルファ値として画面に対してブレンド描画することは可能でしょうか? 描画する色はDiffuseを使います。 A8だと何も問題ないんだけど、GeForce FX 5600がA8フォーマットに対応してないみたいで。
無理じゃね? シェーダーでやれ
>>456 固定機能でRGB成分を元にα成分を計算する場合は、
D3DTOP_DOTPRODUCT3を使う。
460 :
449 :2010/04/23(金) 23:27:49
>>459 ちょっと何を聞きたいのかよくわからんが、テクスチャ座標を複数使いたいという話なら
D3DTSS_TEXCOORDINDEXでステージごとにどの座標を使うのか指定する。
未だに固定機能で頑張ろうとする人を見ると素直に凄い努力家だなと思う。
>>462 SM2.0ベースでゲーム作ったんだが、
i845やi865以前のオンボードのPCのユーザーが普通に文句言ってくるよ。
いい加減切り捨てようぜ
>>463 オンボで動くように作ってるのは逆に尊敬に値するわ。
初代PSクラスのグラフィックしか出せないだろ。
845はともかく 865なら頂点シェーダをソフトウェア ピクセルシェーダをハードウェアでギリギリ動くだろ
>>466 i865はPS2.0サポートしてないので無理。
Intel Extreme Graphics 2って一応DirectX8.0対応じゃなかったっけ?
>>461 なるほど……
2枚テクスチャを利用して大きさが違うことがあるので
同じ範囲をさせるようにUVを一次変換する必要があるんだけど、
D3DTSS_TEXCOORDINDEXでステージが使うUVを指定してあげて、
SetTransform(D3DTS_TEXTURE1 )で変換かますMATRIXを設定してあげれば
なんとかなるような気がしてきた。
サンクス!
>>468 ピクセルシェーダ対応になったのはIntel GMA 900からかな
加算合成って2枚のテクスチャ使ってシェーダーで計算するのと、 D3DBLENDOP_ADD使うのってどっちが良いんですかね
あ、意味わかんね ごめん無視してください
俺はメインはSM3,0で作ってるけど PSなしVS1.1でライティングすらしない最低描画モード付けたよ。ゲームが動くだけで良いやつ。
シェーダーって普通何種類も作って、 プログラム側でマテリアル毎に割り当てたりするの? 自分で作るときは一種類だけ作って、 パラメーター変更だけ適用してるけど・・・。
パラメーター変更だけで対応できる程度のシェーダーならそれでいいんじゃね? 入ってきたパラメーターで条件分とか切ってるならやめたほうがいいけど
>>474 ある程度書いてみて思うに、
用途ごとに分けるといいようだ。
ビルボード描画に限って言えば、
・通常描画用
・合成描画用(2枚以上のテクスチャを使用)
・テキスト描画用
の3つに分けておくといい。
バイオハザード5はシェーダーの数が何万種って書いてあったよ
そこまでいくと、モデルのマテリアルごとにデザイナーが固有のシェーダーを設定してるの? プログラマが手動で用意できるもんでは無いと思うけど・・・・
コンパイラコンパイラみたいな簡易エディタでもあるんじゃね あるいはデザイナさんが自由に組み合わせた通りにSLコードを吐くユーティリティでもあるとか
それは単に組み合わせ爆発が起こってるだけだと思うんだけど。
普通にRenderMonkeyとかFX Composerとかあるじゃん 最近のモデリングソフトはシェーダー付きで吐き出すことも可能だし
何万てすげぇな どうやってデバッグしてるんだろ
ただの組み合わせ爆発だろうその数は。 パーツの組み合わせでそうなってるだけで デバッグ自体は其処まで大変じゃないよ。
MFフレームワーク2ではメタシェーダシステムを導入して、組み合わせ爆発が起こらないようにしてるみだいだね。
VS/PSをバラバラにして運用するようにすれば 組み合わせ爆発は1段階減少できるようだ。 そういうフレームワークを見たことがある。 まあ自分の作ってるゲームでは必要な機能ではないが。
すみません。3Dアクションでのレイを使った衝突判定についてなのですが、 「壁との衝突」「地面との接触と自由落下」「ジャンプ時の頭上接触」 この3つを行いたいのですが、 それぞれ、バウンディングボックスの4隅からレイを飛ばさないと正しく判定できない物なのでしょうか? 何か飛ばすレイの数を減らしつつ上手く処理する方法は無いでしょうか・・? また、壁(障害物)との衝突判定なのですが、 移動方向にだけレイを飛ばし判定するのは危険なのでしょうか? 一部市販のゲームで、細い所に入るとキャラが振動し始める姿を見、どう衝突判定しているのかかなり気になるのですが・・
>>487 剛体運動の物理シミュレーションをやるというのでもないかぎり、
通常は質点とポリゴンの判定だけで十分。
振動するのは押し返し、 返された先でまた別の壁が押し返し、が繰り返し発生するからだな
490 :
487 :2010/04/27(火) 06:19:44
>>488 そうなのですね・・ありがとうございます。
>>489 なるほど。という事はレイの始点は結構後ろ側に有って
移動不可の判定だけでなく、めり込み具合を判定して距離を確実に取り
めり込みで後ろに移動を起こしたらそれもその方向への移動処理として判定すればそうなる という事でしょうか。
少しコツというか実装の理屈がわかった気がします。
491 :
487 :2010/04/27(火) 06:34:23
(続き)そこでもう1つ疑問が浮かんだのですが、 処理落ちによるゲーム速度の変化を起こさないよう、システム時間と比較で進行しているのですが、 高速移動中に処理落ちがおき、 レイの始点そのものが通常のあそび(余裕)を越えて、判定すべき対象を突き抜けてしまう危険が有る場合、 どのような対策をしておく事が妥当・可能でしょうか? ・高速移動の終点を先に予想しておき、もし大きく外れたら終点に無理矢理移動させる。 ・常に定期的に正常な「過去位置」を保存し、異常な位置になったらそこに戻る。 ぐらいしか思いつけないのですが、 レイの始点や個数、仕組みを変える事などで対応できたりしますでしょうか・・?
俺なら、限度を超えた処理オチは普通に処理オチさせるな つまりデルタタイムに上限を設けて遊びを超えないようにする
493 :
487 :2010/04/27(火) 06:51:07
書いててふと。 処理落ちを検出し、処理落ちした全フレーム分、衝突判定&移動処理を行えば 追加で処理落ちするかもだけど同じルールで正常に判定し続けられる・・のかな。 どちらにしても不測の事態に備えた何かは必要だと思うけど・・ 1人で長々すみません;
494 :
487 :2010/04/27(火) 06:59:49
>>492 遊びそのものを越えないようにストッパーをかける?のですね。なるほど・・。ありがとうございます。
てか 移動後の位置座標のみで当たり判定してるならともかく 移動前から移動後へのレイと当たり判定取っとけば どんだけ処理オチしても衝突位置は検出できるだろ
つかあたり判定で処理落ちって実行環境によって挙動が変わるかもしれないけどそこはいいのか? 俺なら画面表示以外の処理はどんなに処理落ちしてもスキップしたりしないで、別途オプションにするけど
爆発表示中は当たり判定をスルーして壁抜けOK
処理部と描画部を完全に分離して描画部のみスキップ 某ゲームみたいに高スペックマシンでやると 多段ヒット起こして即死とかはやめて欲しいが
いまふと思ったが、普通、移動その他の処理と描画処理って分けるよな? 同時にとかしないよな?
マルチスレッド的に同時にやる場合もあるが、個人製作では普通やらない
>>500 あぁ、そういう意味の同時ってのもあるが、ごめん紛らわしい書き方した。
void foo()
{
// 移動その他処理
// 描画処理
// 移動その他処理
// 描画処理
}
のように、一つの関数内で一緒くたにしてたりしないよな?ってこと
あれだ 個人製作以前に オブジェクト指向の言語をつかっているなら 処理をひとつひとつにまとめしたりするのが普通。 更に言うと void型は返り値がないが、引数を与えて戻り値で処理したりして なるべく塊?っていうかな そういう感じにしておくっていえばいいのかな まぁ、言語はわからないが、C++とかだったら オブジェクト指向っていう意味をググってみるとコードの書き方とか 考えが少し変わってくるよ
>>502 俺は
>>499 、
>>501 だが、いや俺はどっちかって言うと
ストラテジパターン的な処理の書き方をしてるぜ。 言語は C++
むしろOOPがクセになってる。 大本の質問者はどうか知らないが、それなので、
「一緒くたにしてたりしないよな?」 と確認してみたわけだ
一般で配布されているゲームのように一瞬でDirectXのデバイスを初期化するのってどうするのでしょうか? 私の作成しているコードではどうも1秒ぐらい掛かってしまうようでして…
……ビデオメモリ64MBのマシンで Direct3D使って1024x768を超える解像度のゲームを作るのは かなり無理っぽい……?
もしかして、 処理落ち回数が3回なら3ループをまわすんじゃなく、移動量をx3するのが正しいんでしょうか?
WindowsXP sp3, Visual C++ 2008 Expressという環境だけど、DirectX SDKは最新のダウンロードしていいのですか? DirectX 9.0c用のプログラムを勉強したいのです。
正しいも間違ってるもくそもねえよ 放物線を描く移動をループ毎に行っているとして、単純に3倍したらどうなるんだよ
>>507 別に特に問題はない。
ただし地味にドキュメントの構成やDXUTやD3DXの様子が変わってたりするので
ネットにある古めのサンプルがそのままで動かなかったりはする。
ゲームプログラマになる前に覚えておきたい技術って本はDirectX9でプログラミングしてるのですか? そうだったらAmazonで買いたいんですが。
512 :
487 :2010/04/28(水) 10:47:11
>>495-503 ありがとうございます。移動処理と描画は完全に分けております。
大規模な処理落ち時は描画をカットして判定させようと思います。
ありがとうございました。
>>513 違うんですか。残念。
教えてくれてありがとう。
メインフレームは処理落ち 描画フレームはコマ落ち
DirectX11の本が一向に出ないのはやっぱ著者が時代に追いつけなくなったからなんだろうか。 SDKのサンプル見れば本なんていらないだろと言われちゃうとそうなんだけど電車とかで読みたいよな。
>>511 Directxの本ではないが、
3Dの根本的な考え方などは
詳しく書いてあったりもするから、
読んで損は絶対にしないはず
DirectX10+テッセ=DirectX11みたいなもんだろ あとシェーダーがちょっと仕様が異なるだけだ 他の機能につっこみはなしでw
DirectX9のHLSL(ピクセルシェーダ3.0)の組み込み関数「pow」について質問です。 この関数で、100.0f乗とかしてもFPSが落ちません。 100回掛け算しているとは思えません。 一体、どういうアルゴリズムで100.0f乗(またはその他中途半端な指数乗)を計算しているのでしょうか?
D3DXVec3TransformCoord とD3DXVec3Transformの違いを教えてください
>>520 CPUでも一瞬だぞ?実装なんて気にするな。
>>520 大昔にアルゴリズムを別件で見て把握してたが、完全に忘れた
でも一つ言える事は、「100回掛け算」 なんてしない。 2進数での筆算の応用
アセンブリコード見れば分かるけどただのビットシフトだよ
526 :
520 :2010/04/30(金) 02:10:36
>>522 それは、すばらしいですね・・・
>>524 >>525 えー!!なんと!!
それならガンガン累乗しますw
どうもありがとうございました! m(_ _)m
527 :
デフォルトの名無しさん :2010/04/30(金) 02:23:50
Directx9のキャラだけをディスクトップに表示したいのです。 しかしオフスクリーンサーフェースをウィンドウに直接bitbltで書き写す ことが出来たのですが、そこから先の段階に進めません><。 Directx9の作画結果をレイヤードウィンドウで透過・半透明で表示させる にはどうしたらいいでしょうか? 環境 VC++2005 DirectX9 SDK (February 2007)
>>520 x^2 = x * x
x^4 = x^2 * x^2
x^8 = x^4 * x^4
x^16 = x^8 * x^8
x^32 = x^16 * x^16
x^64 = x^32 * x^32
x^100 = x^64 * x^32 * x^4
何も考えなくても8回の掛け算できる
でも2進数ならではの方法があるなら興味あるな
UpdateLayeredWindow 適当にググレ
531 :
デフォルトの名無しさん :2010/04/30(金) 02:47:46
UpdateLayeredWindowでググっても背景が透過して 成功というとこまで行けなかったもので・・・。 結局画面には何も表示されないのです。 ネットのサンプルはエラーで動かないですし。 ちゃんとDirectxの画像がbitmapになってるかも 画面に表示できないので確かめる手段がなくて・・・。 参ってます。
なんだ。努力しないただの馬鹿か
533 :
デフォルトの名無しさん :2010/04/30(金) 03:06:37
ですよねー ええ、おっしゃるとおり独りで3ヶ月ほど同じ問題に取り組んでますお。 でもたしかここは初心者質問スレだったような。
態度が悪ければどんなスレであれ、叩く
535 :
デフォルトの名無しさん :2010/04/30(金) 03:22:58
できればどんな態度ならいい態度であるのか 教えていただければありがたいです。 可能なかぎり直したいとこです。
とりあえず今動かないといってるソースをうpするところから始めようか
>ネットのサンプルはエラーで動かないですし。
俺その「背景を透過して表示」 って処理、何気に今までやった事なかったけど
>>530 のリンク先にあった情報だけで普通に出来たぜ? win32 の動作とか理解出来てるかい?
そして一番肝心な、「動かないっていうそのエラー」 の内容は理解出来てる?
三ヶ月も時間過ぎてて、本当に詰まっている大本の原因を特定しないとかありえない。
それじゃまるで、誰かが書いてくれないと何も出来ない = サンプルコピペが出来ないと何も出来ないヒナになっちまうぜ?
俺ライブラリとか俺エンジンとか俺フレームワークとか作るの難しいですね
車輪の再発名と言われればそれまでだが楽しいのは分かる 自分のためにもなるしな
そしていつまでも目的の成果物が出来ないと
最初は「ただアルゴリズムを試したいだけなのに・・・」とフレームワーク開発に抵抗があったんですが、 デザインパターン勉強して、作り始めた今は、設計がおもしろくておもしろくてたまりまへんw みんなどんなふうに組んでるのかなぁ??って気になることはあるけど。
あんまり型にはまりすぎないようにね ちゃんとプログラムやってれば、大抵デザパタと同じもの作るようになるから その時に本当に使いこなせるって胸はれるよ
544 :
542 :2010/04/30(金) 11:29:13
>>543 ありがとう!
最近、自然とコンポジットパターンになっていった例があって、
HDRやSSAOなど、ある程度決まりきった複数のシェーダをコンポジットでまとめておけば、
使う側の記述がすごくすっきりして、しかも単発シェーダとまったく同じように扱えて、さらに使いまわしもできるようになった。
先人の知恵に感動した。
DirectXゲームの場合は、メッシュ何かのリソースの共有を意識したオブジェクト構成にするほうが良かったり、
考慮するところが多いけど、そういった中でできるだけ適切な妥協点を探っていくのがおもしろすぎる。
まだ手探りなところが多いけど、それなりに動くものがキレイな設計で実現できるようやってみる。
もうあれだ、作品作らないでエンジン作って提供したらいいんじゃね?
D3DXFONTを使って FPSのフォント表示をしてみたのですが, 60FPSでコマ落ちしてしまいました. ググる限りだと,もっぱら遅いと評判なのはわかりましたが, ここまで遅いものなのでしょうか?
547 :
542 :2010/04/30(金) 14:18:42
>>545 エンジン提供できるレベルになれたらうれしいなぁ・・・
それぐらいを目標にしてみる。
>>546 以前フレームごとにフォントを生成して遅くなっていたケースを見たが、
どうだろうか?
fpsを表示するくらいで60fpsを下回るのは明らかにおかしいな。 D3DXFontはそこまで酷いもんじゃない。
フォント表示で始めてフレームレート表示したのに遅くなったとか分かるの? 単純に垂直同期してるってことは無いよな
551 :
デフォルトの名無しさん :2010/04/30(金) 15:16:45
536 537 回答ありがとうございます。 C++・DIRECTX・win32APIは初めてさわるので手探り状態です・・・。 背景を透過というのはDirectxの作画結果の透過に成功したのでしょうか? directx>DIB>ウィンドウに送る部分までは出来たので 今動かそうとしているのはDIBを半透明で表示する部分です ウィンドウそのものが表示されない状態です void UpdateLayeredImage( HWND hwnd, HBITMAP hbmp, int x, int y ) { HDC hdcScreen = ::GetDC( NULL ); HDC hdcMemory = ::CreateCompatibleDC( hdcScreen ); SelectObject( hdcMemory, hbmp ); BLENDFUNCTION bf = { AC_SRC_OVER, 0, 0xff, AC_SRC_ALPHA }; int ret = UpdateLayeredWindow( hWnd, NULL, NULL, NULL, NULL, NULL, 0, &bf, 0); assert( ret ); ::DeleteDC( hdcMemory ); ::ReleaseDC( NULL, hdcScreen ); }
>UpdateLayeredWindow( hWnd, NULL, NULL, NULL, NULL,NULL, 0, &bf, 0); この引数と直前にやっている処理がかみ合っていないことに気がつかない時点でどうしようもない。
>>553 ウィンドウズプログラム始めたばかりのとき、そのサイトにはたいへんお世話になった。
今DirectXプログラムを組めるのも、このサイトで得たウィンドウズプログラミングの基本あってのこと。
感謝、感謝。
というわけで、
>>553 のサイトはオススメよ。
>>550 言葉足らずでしたが,フォント表示から始めてるわけじゃないです.
レンダリングまわりは出来てます.
>>549 おかしいですよね..;
レス拝見して冷静になってみて,
色々コメントアウトしてみた試したところ,
(デバイス)->Present()を,
メッシュの描画とテキストの描画で2回呼んでしまっていて,
それが原因で遅くなっていたようです.
有り難うございました;
>>556 HSPだった。orz
同じようなことはWINAPIでもできるはずなんだが見当たらんなぁ・・・。
>>557 WIN32でできるはずなのに見当たらんって、それ考え方が違うからじゃね
出来ない訳ないじゃない。
ヒント: そのサイトにあるそのライブラリの中の処理は、きっと中でカラーキーを持った画像を持っている。
561 :
デフォルトの名無しさん :2010/04/30(金) 18:01:52
552,553 回答ありがとうございます。
>>552 ですよね。どうやればかみ合うかよくわからない状態です
>>553 CreateWindowEXにレイヤードを設定しなければ
普通に表示はされるんですよね・・・謎です。
ありがとうございます。
しばらく保留にしてHPの内容やってみますね
なんでドキュメントのUpdateLayeredWindowの説明読まないの?
563 :
デフォルトの名無しさん :2010/04/30(金) 20:15:36
読んだお
DirectX Viewerでfxファイルを開くことが出来ますが有用な使い方はあるのでしょうか。 パラメータの受け渡しが出来ないので複雑なものは見れないでしょうし、 サンプルのファイルすら開いたところで何を見ていいのか分かりません。 場合によっては白い球体のまま・・
あれってそのPCでDirectXが動作するかどうかのチェックする程度のものじゃないのか
DirectXUtilitiesに含まれる全てのツールは バイナリだけでなくソースもサンプルの中に含まれている 後は分かるな?
D3DXLibってソース公開しないのはなんでだ
中身ほとんどアセンブラだけどな
なんらかのライセンスに触れた場合を想定してるんじゃね?とゲスパーしてみる。
でも別にたいしたことやってなさそうな気がするけども、、、
すみません。 影やエフェクト表現の為に、地面すれすれに半透明テクスチャを貼る別ポリゴンを作りたいのですが、 必要な元(地形)ポリゴンを抜け目なく取得する良い方法はないでしょうか・・? できれば詳しい解説のあるサイトを教えて頂けますと幸いです・・orz
Directx11のD3DXVECTOR3って無いんですか
>>571 何がやりたいのか意味不明
○影なら4角形の板ポリを足下に置くだけだ
>>571 >必要な元(地形)ポリゴンを抜け目なく取得する良い方法
が世界のx,zを決めると、そのポリゴンの高さを取得?
と解釈するなら
ttp://marupeke296.com/COL_3D_No8_HightOfFloor.html ここにいくつかの方法が
FindVerticesOnPoly←これをグーグルで入れると
(DirectX逆引き大全500の極意、Directx必携の自作関数の名前)
一応サンプルが見れるようだ
レイとメッシュの交点を調べている
しかしながら俺も初心者なのでもっといいやり方があるような
気もするので、あったら申し訳ない
地形が複雑だと丸影なんかだと不自然にめり込んだり
するような気もするので、
決め打ちで問題ないとも、directxシェーダプログラミングブック
に書いてあった。
デコボコした地形に貼り付けたいならシャドウマップを応用すればできそう 平らな地形でいいなら地面チョイ上にポリゴンを置くだけだな
>デコボコした地形に貼り付けたいなら 投影テクスチャだろ普通
普通、広いフィールドで投影テクスチャの影を付ける場合、 フィールドのマテリアル全てをマルチテクスチャにするの?
>>577 まあ普通マルチパスだろう
1回目:普通にフィールド描画
2回目:影を落としたいフィールドのみ投影テクスチャで描画
地形が単一メッシュで構成されてるならそれで良いと思うが
580 :
デフォルトの名無しさん :2010/05/01(土) 19:21:47
レイヤードで作画背景が透過できました。 レスくれた方ありがとうございました
投影テクスチャでキャラが複数の場合、キャラの数だけ地形を描画するのは馬鹿っぽいので 影の落ちる位置のポリゴンを切り出したりするの? 表示用のポリゴンに対して当たり判定とか
>>581 影はキャラ単位で管理すると難しいので、
見た目は落ちるが、光源単位で管理するのがよいと思う。
例えばスポットライトだとすると、スポットライトの形状から
視錘台を作り、キャラ群とフィールドをクリッピングして抽出する。
次に抽出したキャラ群のみライト視錘台で描画し、影用の投影テクスチャを作成する。
次に普通にフィールドとキャラ群を描画。
次に抽出したフィールドのみ投影テクスチャで描画。
ちなみにシャドウマップも同じような方法なので
これをやるなら直接シャドウマップに行ってもいいと思う。
>>583 最近はマシになってるものの、日本語版のドキュメントは翻訳抜けとか情報が古い箇所が散見されるんで
英語版のMSDNを見るクセをつけた方がハマらなくて済むぞ
>>583 むしろ上のリンクはわざわざ「過去のバージョン」から辿った先にある
ドキュメントで、そんなところを参照する方が悪い希ガス。
自分もこれに昔ハマったw 同じようなのでも二つあるから注意w
583氏はわざわざ過去のバージョンからたどったわけじゃなくて、 ググったらたまたまたどり着いちゃっただけでしょ。 関数名で検索すると過去のバージョンがトップに出る確率が高いんだよね。
だめだ、どうやっても DirectX9 で頂点シェーダが使えない何も表示されない ピクセルシェーダは正常で、HLSLに問題が無い事は FX Composer でも動作確認して、C++側各所のHRESULTも確認済み。 しかし頂点シェーダを使おうとすると何も表示されない。 ・・・もう少し自力で調べて整理してから、質問します
なぜPIXを使わないのかと小一時間
ちなみに、シェーダバージョン2.0 で動作する事は、他のサンプルなどでも確認済み
COLOR0の値を頂点シェーダから渡してないから0, 0, 0, 0が出力されて 黒い背景に紛れたか、アルファテストかなんかでクリップされて、 表示されてないように見えるだけ、に100ペリカ
ほんとだ。 頂点カラーを頂点シェーダからピクセルシェーダに渡してないじゃん。
594 :
588 :2010/05/03(月) 11:29:50
595 :
588 :2010/05/03(月) 11:30:51
PIXでワイヤーフレーム表示されてる?
>>588 >float4 psProc(VSOut In) : COLOR {
PSの入力にVSOutは駄目じゃね?
598 :
597 :2010/05/03(月) 12:01:04
599 :
588 :2010/05/03(月) 12:20:56
状況整理します。環境は XPSP2/Geforce8800GT/DirectX9.0c November2008/VC++2008Express 目的は、HLSLでピクセルシェーダだけでなく、頂点シェーダを使いたいだけ。 状況: D3DCAPS9 caps9; GetDeviceCaps(0, D3DDEVTYPE_HAL, &caps9); caps9.VertexShaderVersion >= D3DVS_VERSION(2,0) はTRUEで、サポートはされている状態。 D3DVERTEXELEMENT9 で頂点情報をセットし、CreateVertexDeclaration で LPDIRECT3DVERTEXDECLARATION9 を取得。HRESULTは S_OK その後、D3DXCreateEffectFromFile でくだんの HLSLファイルをロード、これも S_OK。 LPD3DXEFFECT を取得し、D3DXPARAMETER_DESC でHLSLのグローバル変数のハンドル取得、 レンダ処理のタイミングで LPD3DXEFFECT::Setほげ系も全て全て S_OK。 SetVertexDeclaration 先の頂点定義を渡す、これも S_OK BeginSceneの後、Begin(&pass,0); BeginPass(0) 〜 EndPass(0); End(); EndScene() まで全て S_OK この状態で、HLSL内の VertexShader をコメントアウトした時だけとりあえず表示はされます。 HLSLそのものは、念のため PIXでもFXComposerでも確認しましたが正常に動作しています。 あと気になっているのは・・・ ・CreateVertexBuffer のタイミングで、FVFの頂点情報の指定を D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 のように指定する必要があるか無いか。(両方試しましたが状況は変わりませんでした) ・DrawPrimitiveでなくDrawIndexedPrimitiveにしているのですがこれで問題が無いか。 ・SetVertexDeclaration を行うタイミングはレンダ処理のタイミングに行っていますがこれで問題が無いか。 ・HLSLを使う際には SetFVF は実行しないようにしていますが、これでいいのか。 (これも両方試して状況が変わらない事を確認していますが、何かの兼ね合いがあったりしないか) ・SetMaterial でマテリアルを設定しているのですが、これが不要か否か などです。いずれも、HRESULTの戻り値でエラーが出ていない事は執拗に確認済みです。長くなってすみません
VertexShader無効にしても動くってことは、SetTransform使ってたりしない? 頂点シェーダにちゃんと定数として行列渡してる?
601 :
588 :2010/05/03(月) 12:44:09
あ、あとHLSL側、エフェクト->SetMatrix(ハンドル, 行列); で渡す行列として、 デバイス->SetTransform(D3DTS_WORLD, &matWorld); デバイス->SetTransform(D3DTS_VIEW, &matView); デバイス->SetTransform(D3DTS_PROJECTION, &matProject); としている3つの行列をかけた物を渡しているのですが、これで問題無いでしょうか。 ※つまり、デバイスにもセット、HLSLにもセットと二重に行列を渡しているような状態。 他、デバイス->SetRenderState の中で、VertexShader を使う際にはセットしてはいけない物など 何かありますでしょうか・・・。
602 :
588 :2010/05/03(月) 12:45:27
あ、リロードしてなかった・・・
>>600 まさにそれ、急いで確認します!
多重にセットしてもSetTransformは無視されるだけだから問題ないと思うけど。 行列をかける順番が間違ってるとか?
604 :
588 :2010/05/03(月) 13:02:19
ええと なんかすみません。 なんて謝っていいのかわかりません
605 :
588 :2010/05/03(月) 13:08:45
一応、結果を書いておくと。動きました。 結論から言うと、自分の凡ミスでした。
>>603 さんのレスを見て、「いやいやww 間違ってないですよww」 と思いながら、
自前のカメラ管理クラスから行列取り出す部分を追いかけ、
>>600 さんから頂いた、
>頂点シェーダにちゃんと定数として行列渡してる?
のレスを見て気づきました。
要は、メンバ関数の中でかけて作った自動変数の行列のポインタを投げていたっていう最低なオチです。
ちょっと天気もいいので散歩してきます。 ご迷惑おかけしました。
こんなうんこみたいな事例でも何かの反面になれば幸いです。 ありがとうございました。
まぁまぁw
マジでクソだなこいつ
まぁここ初心者質問スレだし、いんじゃね?こういう部分にも気を配れっていう反面教師って事でw
コードも見ずにそんなミス指摘できねえよw
だよなwwワロタww でも逆にその状態で推理してた数名は凄いなww 俺なんか 588が書いてる内容の半分も理解できない。ググってもなんかよくわからない
このスレはツワモノ揃いだからね。 DirectXに対する知識、経験値の深さが違う。
613 :
デフォルトの名無しさん :2010/05/03(月) 15:35:49
高度に経験を積んだプログラマーはエスパーと見分けがつかないからな。 でも上のみたいな例をを見るとDirectX触るの嫌だな
ここで話題になる内容は精々中程度のレベル それは答えている奴が最もわかっていると思う 別にそれが悪いと言っているんじゃないんであしからず
「高度に経験を積んだプログラマーはエスパーと見分けがつかない」 ツボに入った、今世紀最大の格言の栄誉を送る
これからもこのスレを支えてくれる人たちだ・・・
童貞のまま30歳オーバー+ 高度に経験を積んだプログラマーはどうなりますか?
魔法のようなシェーダが書けるようになります。
はいはいウィザードウィザード
つまりウィザードなんてなくても魔法のようなコードが書けます、って事ですね
誰うま
プロのグラマーでいいから経験ぐらい積んどけ
審議中........
∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
【結果発表】 パッ パッ パッ パッ パッ パッ [つり] [ヲタ] [池沼] [厨房] [氏ね] [終了] ‖∧∧ ‖∧∧ ‖∧,,∧ ‖∧,,∧ ‖∧∧ ‖,∧∧ ∩・ω・`)∩・ω・`)∩・ω・`)∩・ω・`)∩・ω・`)∩・ω・`) ( ). ( ). ( ) ( ) ( ) ( ) `u-u´ `u-u´ `u-u´ `u-u´ `u-u´ `u-u
BGMを流したいんですが, DirectMusicを使うんでしょうか? DirectShowを使うんでしょうか?
その問いだけなら、「好きな方」って答えしか出てこない
自分はXAudio2使ってるよ。 簡単で分かり易かったしオススメ。 MSも今後はXAudio2の使用を勧めてなかったっけ??
一々報告せんでもいい ここはお前の日記帳じゃない
いやお前のレスの方がいらない
632 :
628 :2010/05/05(水) 23:37:57
昔DirectSoundで挫折した(プログラミングに不慣れなところもあったけど)ので、音方面は戦々恐々だったけど、 XAudio2を使ってすんなり鳴らせて拍子抜けだったw SEみたいに短い音と、BGMのような長い音とで使い分けがいることに注意するくらいかな。 とりあえずオススメ。
あの時代のDirectXオブジェクトは、 COMコーポネントの流儀に沿うように作っていたから 無駄に複雑なんだよな。 D3D8ぐらいからキレてシンプルに作るようになったw
たしかDirectXはCOMでありながら、だんだんとCOMっぽくなくなっていったそうだねw >キレてシンプルに作るようになったw キレたのかw
DirectShowだけはいまだにコムコムしてるけど、 だいぶ前にDirectX SDKから外れちゃったしね。
DirectShowはむしろCOMであることが活きている。
C言語の基本文法とWin32APIの基本事項を覚えただけで 「俺ってすごくね?」と舞い上がってしまった後に、DirectShowで呆然としたのが懐かしいw
XAudio2知らなかったです. 聞いて良かったです. ありがとうございました.
がんばれよ!
パーティクルに関して詳しく載ってるサイトなり書籍なりありますでしょうか?
>>640 >パーティクルに関して詳しく
詳しくって、どこからどこまでの話?
何をやろうとしていて、何がわからないのか書かないと
>>641 みたいなレスしか出来ないと思うぞw
ごめん、XAudio2 のヘッダとスタティックリンクライブラリどこにあるの?・・・ww
とりあえずここを見ると、
http://msdn.microsoft.com/ja-jp/library/bb694515 (v=VS.85).aspx
>ヘッダー: XAudio2.h 宣言
>ライブラリ: XAudio2.lib 内容
とあるんだけど自分の環境、DirectX SDK (November 2008)\Lib\x86 以下には
X3DAudio.lib しかそれらしい物が無い。 もしかしてSDKバージョンのせい?
あるいはひょっとして・・・ XNA SDK インストールしないと無い?
644 :
643 :2010/05/06(木) 13:07:36
>>573-579 >>581-582 遅れましたが、ありがとうございます。
やはり欲しい物の形としては、レイを飛ばしまくってポリゴン情報抜いて
実装にルールを付けて自分でなんとかする・・しかなさそうですね。
その他の影についての話も参考になりました。ありがとうございました。
すみません。変に機能を別けたり纏めたりしてる内に、 1フレーム内で、同じテクスチャを何度も何度もLockRect〜UnlockRectしまくる形になったのですが、 これは重く無駄な事をやっているのでしょうか? もし重く無駄な事をやっているのでしたら、 ・フレーム毎に全テクスチャをLockRectし、テクスチャ操作が終ったら全てUnlockRectする。 という形に全体を書き直そうと思うのですが、もっと良い方法が有ったりしますでしょうか?
無駄かどうかはそれで何がやりたいかによるかなぁ
>>646 シェーダを使う等の方法でLockを無くせるなら、Lock無しの方がいい。
どうしてもLockが必要なら、D3DLOCK_DISCARDが使えないか検討する。
D3DLOCK_DISCARDを使うとLockした瞬間にテクスチャの内容は全て
無効になるので、必然的に1フレームに1回しかLockできなくなる。
D3DLOCK_DISCARDが使えないケースなら、D3DPOOL_SYSTEMMEMの
テクスチャに対して読み書きして、UpdateTextureで描画用テクスチャを更新。
>>646 「読み」「書き」どっちのためのロックなのか教えてくだされ
XAudioって対応形式と互換性に難ありじゃなかったっけ? あとはサンプルの少なさ・・・出来る人はいいんだろうけどわしみたいな初心者には(´・ω・) そこらへんが改善されればなー
651 :
646 :2010/05/06(木) 23:18:34
>>647-649 状況による質問だったのですね。書き込みメインだったのですが
D3DLOCK_DISCARDは参考にした資料そのままに使っておりました。
それでLock〜Unlockがハッキリしてたのですね。
今回自分で言ってた通りに全体を書き換え、FPSが明らかにマシになってくれました。
シェーダを使う方法で無しにできるならその方が良い・・ いつかその意味を理解し
より効率的に組めるようになりたく思います。 ご助言、ありがとうございました。
IDirectSoundBuffer8インターフェースの GetCurrentPositionメソッドで取得した再生位置が 1秒分(44100*2ch*2Byte=176400Byte)ほどずれることがあるんですけど どなたか、原因についてご存知ありませんか? ぐぐってもそれらしいサイトが引っかからなくって・・・ Playしてからすぐ(だいたい10ms以内)にGetCurrentPositionすると割と起こります 起こったり起こらなかったりするので原因がよくわからないんです
何故ずれてると判断したのかkwsk
バッファへの書き込みをマルチスレッドイベントでやってて タイマーの精度でずれてるだけじゃねぇの? そのバッファの長さが1秒だったりしてないか?
>>654 実はDXライブラリってライブラリ使ってまして
バッファの長さがどれくらいかとかは良く知らないんです・・・
一応wavを全部メモリに読み込んでから再生させるような処理にしてはいるんですが
中身でどういう実装のされ方をしてるのかまでは追えてません
そのライブラリの再生位置取得関数の中身を見たら
IDirectSoundBuffer->GetCurrentPositionで取得した結果を返す処理だったんで
もしや、そういう既知の事象がDirectSound関連であるかな〜と思って
こちらに質問してみたわけなんです
ちょっとスレ違いだったかもしれません
>>653 以下のような感じのテストコードを実行してみたら
>for(int i=0;i<30;i++){
> // wav再生
> // iミリ秒停止
> // IDirectSoundBuffer->GetCurrentPositionの結果を返す関数
> // wav停止
> // 結果表示( i, pos )
>}
こんな感じの結果が出るんす
>0, 196
>1, 0
>2,, 12
>3, 548
>4, 720
>5, 176404
>6, 176404
>7, 892
>8, 364
>9, 176512
>10, 1600
>>655 iミリ秒停止って、ちゃんとiミリ秒か確認してる?
まさかSleep(i)とかしてないよね?
>>655 ところで、for ループの中で再生と停止を繰り返してるけど、
それ再生のタイミングで必ずカレントポジションがリセットされてる事は確認済みなの?
そんな爆速で繰り返して無事にリセットされてるの? ・・・って、DirectSound系はあんまり詳しくないけども
でも、そのテストの仕方はどうかと思う
いまさらだけどDirectX SDK (November 2008)って古すぎて話になってないんだが。
>>661 どの話をしてて、どこがどう話になってない? なんか正解知ってるなら書いてくれ
663 :
652 :2010/05/08(土) 07:36:15
>>656 ライブラリ内部の処理を追ってみましたが
セカンダリバッファを作る時にDSBCAPS_GETCURRENTPOSITION2フラグを指定する場合と
指定しない場合があるようです。ただ、実際の処理でどちらが選択されているのかが
まだよくわからないんで、それが原因なのかはなんとも・・・
>>657 ライブラリで用意された指定ミリ秒停止する関数を使用してます
内部の処理を見るとLARGE_INTEGERとかQueryPerformanceCounter使ってるんで
ミリ秒以上の精度で、ミリ秒停止する処理を実装しているみたいです
>>660 まじすか、どんな感じにするのが普通なんでしょうか・・・
そもそもこういう薄いラッパライブラリとか使う意味ってあるの? どっちみちDirectX直接だって関数呼び出し並べるだけなんだから、 試しに自前で実装してみたら?
ぶっちゃけその条件だとライブラリ製作者に聞けとしか言いようが無い GetCurrentPositionが絶対に成功してる保証が無い タイマーが正確だという保証が無い Windowsに制御を戻さないforループ内でのテストの信憑性が無い どうしてもというなら 話はその辺を全部検証してきたからだな
基本的なことですが、分かっていないので教えてください。 WIN32APIで描画する場合、デバイスコンテキストを取得し、LineTo等で描画をおこなうんですが DirectXの方が高速といわれるのはなぜですか?
GPUでやるかCPUでやるかの違い
DirectXのシェーダープログラムについて質問ってここでしていいの?
かまわん
>>667 なぜ、GPUでやったほうが速いのですか?
結局、深く突っ込まれると、答えれないのねw
struct VS_OUTPUT { float4 Position:POSITION; float4 Diffuse:COLOR0; float3 TextureCoord0:TEXCOORD0; }; struct PS_OUTPUT{ float4 Color0 :COLOR0; }; VS_OUTPUT Sky_Sphere_VShader(VS_VERTEXINPUT In){ VS_OUTPUT Out = (VS_OUTPUT)0; Out.Position = mul(In.Position, WVPMat); Out.TextureCoord0 = In.TextureCoord0; Out.TextureCoord0 = In.TextureCoord0; return Out; } PS_OUTPUT Sky_Sphere_PShader(VS_OUTPUT In){ PS_OUTPUT outdata = (PS_OUTPUT)0; float4 texel = tex2D(NormalSmp, In.TextureCoord0); float len = saturate(In.Position.x);// ←これだとエラー float len = saturate(In.Diffuse.x);// ←これだと通る texel.r = len; outdata.Color0 = texel; return outdata; } Sky_Sphere_PShaderの所でPositionから値を入れるとエラーでるんですけど何ででしょう? invalid ps_2_0 input semantic"POSITION"
まんまの意味だな。POSITIONセマンティックはPSの入力として無効。 TEXCOORDとかに保存すれば一応PSでも参照できる。 もちろん補完された値だが。
VS出力の構造体をそのままPSの入力に流用するのは常套手段だけど、 POSITIONとかFOGとかいくつかのセマンティックはPS側では利用できないから注意しないと駄目だね。
入力/出力で使えるセマンティクスのリストってMSDNにあるんだけど
>>673 は見てないのか
>>670 671じゃないが、単純に一人で何もかも順番に実行するより、
物理的に他人の頭借りて平行して作業すりゃ早いだろ?って事
で、実際にGPU側で仕上がった内容を取得だけして処理する
>>677 あの〜、抽象的ではなく、具体的に教えて欲しいです。
680 :
673 :2010/05/08(土) 22:30:43
入力と出力とで使えないセマンティクスがあるのですね 色々そこを中心に調べて見ます ありがとうございました
>>677 単純にCPUとGPUでは処理能力が違う。積和算で見ると100倍ほど異なる。
(Wikipedia:FLOPS)
結局、ほとんど奴は、理解できていなくてなんとく使っているんですね GPUの詳細まで知り尽くしてるわけではないみたいだから その程度の奴に聞いても仕方なさそうw
>>683 その程度の奴にって、お前自分が何を言ってるのかわかってないだろw
そんな事もわからずにレスしちゃってるんですねw
ある程度は知っておいたほうがイイとは思うが、ハードウェアの回路、クロックレベルで知る必要もないと思うよ。(使う側は) そういった詳細を隠蔽するためにDirectXAPIがあるわけだし。
>>687 確かにそうですが、
なぜ、DirectXを使うの?と質問されて、安易に「GPUで処理するから」としか
答えれないのもどうかと思いませんか?
>>689 ただいま、読んでいます。
ただし、やはり難しいため、いろいろ調べるのに時間が掛かります
よって、自分なりに理解できるまでは安易に感想なんていえません
↑ こういった奴、って馬鹿でしょ?
そういう意味だと元の質問、 >WIN32APIで描画する場合、デバイスコンテキストを取得し、LineTo等で描画をおこなうんですが >DirectXの方が高速といわれるのはなぜですか? どこでどんな文脈で言われてるの?って話もあるんだけど。 例えばバックグランドのサーフェスに夥しい量の線を繰り返し描くような時、 そのLineを引くロジックに相当無駄があったとしたら、必ずしも 「絶対にこっちの方が高速です!」 とはならないよね
>>690 見上げた根性だな
質問者のレベルからいってとてもすんなり理解できるとは思えんが・・・
まぁ、ここにいる大抵の連中よりはエンジニアっぽいな
>>692 ええ〜まだ理解できないの〜?
もしかしてちょっと出来ない子?
>>695 はい、正直できない子ですよ
あおるだけの貴方よりは出来るとは思いますけど
プログラマはI/O、インタフェイスに対してロジックを書いていく立場だから、 例えば実際に提供されている手段(ドライバやライブラリなど)について何か記述をした時、 そこに望む成果が得られるならばそれを単に利用するだけ。 そういう意味で、例えば望む結果として、DirectXよりもwin32APIの方が良いならばそっちを使うし 逆ならば逆だし。 あと、多分一般的に高速と言われる分野としては、3DCGについては 自前でCPU側の処理としてロジックを書いてGDIに描画するよりも、 専用のハードウェアを利用して書いたほうが早い、かも、しれない。 で、試しにプログラマの立場として実際に提供されているAPIなどを使ってそれを行い、 満足行く結果が得られるなら、そこで先に進む。 何故なら、プログラマは 「何か目的があってプログラミングをする人」 だから。 なので例えば、俺は自分が使っているPC机の脚の長さが何故70cmなのかは知らないし、 なぜモニタのサイズが14inchなのかもしらない。 そんな感じ。
鳩山みたいですねあなた
必要でない情報ならば不要だって話がなんで鳩山なんだ。 知らないって言葉しか見えてないのか
>>697 たとえ、どんなことであろうと、知らないなんて
恥ずかしげもなく言えるような人の意見なんてなんの意味も無い
>>700 お前がそう思うんならそうなんだろう
お前ん中ではな
>>700 なんで知らないって言葉を言える事が、イコールでなんの意味も無いになるの?
俺には無意味に見えるけど、それ自分の中の定義?
知らなかったら沖縄以外に移してもいいんですかそうですか
お前誰
なぜかと聞いてるのに、知らないでいいなんて、話にならないですね
707 :
666 :2010/05/08(土) 23:22:35
わたしのために争うのはやめて><
もう詳細とかどうでもよくてただ煽りたいだけだろw
いいかげんなレスする奴が悪い
そろそろいいかげんじゃない、 完璧に理解し切った感想が出てくる頃合か
>>705 何故かと言う問いを他人に振る時、前提が曖昧なままじゃ質問にもならないですよ
抽象的な質問に完璧な答えを求める、か・・・ 出来ない以前にただの屑じゃね
知ったかぶってる奴にはキツイ質問だろうな 正直大抵の人は答えれないと思うぞ、GPUの詳細なんて。 そこを知ろうとすることは悪くは無いが、まぁ、質問するのは無駄だな
どこが曖昧なんだ
後出しで曖昧な質問だったと言うのはダメだろ。 ホント鳩山みたいだ。
>>715 いや後だしで曖昧な質問だった、と決め付けてる訳じゃなくて、
ここはプログラム板のDirectXスレなので、プログラミングする側の人間が知ってる範囲ってこのくらいで十分だから、
実際知らねーよって話じゃないの?
逆に、今コンデンサの中にどのくらいの電流が流れているかを知らないと電卓プログラムは作れませんだなんて、
そんな話は笑い話にもならないだろ?って事。 プログラム板なんだよここ
・・・ただ勿論、逆に 「そこを知らないと絶対に無理」 ならば知らない事は恥だろうし、弊害を生むだろうけど。
分業された立場の中で、目的を達成するだけだろ。全能の神じゃないんだから。 違うの?
"鳩山みたい" とか言葉がかなり曖昧だな
汎用計算ならCPUの方が速いです。 でも線とか絵を描くのはGPUの方が速いです。 理由は僕が阿呆だから答えられませんwww って言えば満足するのかね。
質問に答えられないのなら、答えなければいいだけだろ
>>720 同意
知ったかぶって、いい加減なレスする奴が腹立つ
>>719 だからいいだろそれでって。そんな要点が理解できなかったら要件から設計もコードも起こせないぞw
頭悪い小学生かよまったくw
「なぜDirecXの方が高速なのですか?」 「なぜGPUで処理する方が速いのですか?」 質問らしきものはこの二つだけなのに なんでGPUの詳細とかお答えせなきゃならんのかw
CPUとGPUの違い。 簡単に言えば、GPUはCPUのSSEユニットの拡張したようなやつをかなりいっぱい持ってるからそれ系の処理が得意。 逆に整数演算はすごいロスがある。 米軍は海の上に住めばいいと思うよ。日本謹製の技術で。
質問に答えられないのなら、答えなければいいだけだろ
>>718 CPUよりGPUを使った方がいいとされるのは、純粋にGPUの方が処理能力が大きいため。
ただしGPUは元々は画像処理用なので汎用で使えるわけではなく、
並列処理が行えない計算には使えない。
WindowsでGPUを使用するにはDirect3D/OpenGL/Cgなどを利用する必要がある。
詳しい話は後藤さんの記事を読め。
なんでこんなわかりきったことをグダグダと揉めるんだか。
とりあえず
>>666 =670=678 なのか?
GDIとDirectXをどこまで知ってるのよ
揚げ足とって遊ぶやつが居るからだろう。 じゃぁRivaTNTで処理するよりもCorei7で処理する方が早いんですね、とか言い出しかねない。
>揚げ足とって遊ぶやつが居るからだろう。 すいません。そろそろ止めときます
知らなくて構わないはずのレイヤの事まで質問されて答えなければならないなら、 俺はきっと八百屋とか吉野家の事も全て知っていないといけない てかそろそろコーディングの話に戻りたいぜ
質問に答えられないのなら、答えなければいいだけだろ
DirectX11の本を出したら今なら売れそうな気がする。
質問主(?)は答えられないものからは上手く逃げたな
むしろ答えられなかったから逆に煽り返され続ける流れになったけどな
すべて鳩山が悪い
>>733 答えなければいけないなんて誰も言ってないだろ?
>>733 上っ面だけ舐めて、本質を分かってないような奴が書いたプログラムなんて
誰も使ってくれないよ
742 :
652 :2010/05/09(日) 02:25:19
>>665 ん〜、たしかにそうですね
そうすることにします
どもでした〜
__(^^) <ペイピッポォ DirectX使い同士仲良くするピー /__ \ | | | | (_) (__) 愛用ツール:ツクール
HLSL書くとき何のエディタ使っていますか 少なくとも構文強調できるものを探しています
FX Composer
emacsのcg-mode
自分もサクラエディタ。 強調キーワードを自分で編集できて便利。
強調キーワードって, 秀丸とかだとできないの?
できるよ
xyzzy
サクラエディタでタブが10個以上になったら別のウインドウを開くことってできないかな
すれちがい
ハイトマップってディスプレートマップと何が違うんですか? また、ハイトマップで衝突判定ってどうやってやるんでしょうか?
あ、ただ単にワールドy座標をテクスチャから取得するだけですか?
同じだと思うなぁ。 ただ、Y軸だけってだけじゃなくて、法線方向に起伏させるやり方(甲羅から生えるトゲトゲとか)も同じ名称だと思うよ。
そうです
>756 >757 ありがとうございました
DX11の定数バッファについて聞きたいんですが D3D11_BUFFER_DESC bufDesc = { sizeof(buf), D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE, 0, 0, }; D3D11_SUBRESOURCE_DATA subData = { buf , 0, 0, }; hr = d3d11dev->CreateBuffer( &bufDesc, &subData, &buffer ); bufの部分がD3DXMATRIX*3のときにはうまくいったのですが、 構造体やD3DXVECTOR3*2のときには hr == E_INVALIDARG になってしまいバッファが作られませんでした。 定数バッファの正しい作成方法やHLSLへの渡し方について教えて下さい。
16byteでアラインしろってマニュアルに書いてあるだろ
Direct2Dの描画性能について語っているサイトないすかねぇ。 普通の3Dポリと同じで、毎フレームごとに線とか再描画するイメージでいいんですよね? たとえば秒間何ラインくらいいけるもんなんすかねぇ。 それともクリッピングとかあるみたいですし、DirectDrawみたいな感じなんすかねぇ。 よさそうなら喜んでWindows7買ってくるんですが。
>>761 そんなの、自分でテストすればいいじゃないか。
それから、Direct2DはVistaでも動くぞ。
XPなんすよ まぁGoogle先生でも知らないみたいなので、無さそうですかね
FBXからロードするソースって需要ある? 作ってる途中だけど
なんかどこかで見たかもそれ ソース丸ごと
まじかよ まだDirectXのメッシュクラスに自作のデータ流す方法分かってないから知りたいです
まるぺけでFBX SDKの解説はやってるな
まるペケはノードの解析までで描画してなかったはずです GLであればAutodeskにあるSDKのサンプルならあるんですよね
SDKが未来に見える。。。
むしろFBXをセーブするソースが欲しいなぁ (チラッ まぁSDKのsampleにあるんだけど、なんか読みづらいのよね
俺もソース見てみたいなー
ファイルのフォーマットより、モデルをどんなデータ構造にするかが重要だと思うんだがなー
Xファイルがサポートされなくなって久しいですが、みなさんはどんなフォーマットを使われてます? 自分はホビーユーザーなので、今もDX9でXファイルです。
ps_3_0でトゥーンシェーダをやってみたんですが
ttp://www.dotup.org/uploda/www.dotup.org877873.jpg 右のようにところどころ暗いところができてしまいます。
左の図はPSの
float p = max( dot(In.nor, -LightDir), 0);
p = p * 0.5f + 0.5f;
p = p * p;
//float4 Col = tex2D(Samp1, float2( p, 0.1f ));
float4 Col = p;
return Col;
のようにPをそのまま色として出力してみた図です。
左では普通に表示されるので法線はおかしくないと思うのですが
他におかしくなる原因として何が考えられるでしょうか
>>775 トゥーンシェーダというかハーフランバートだね。
//float4 Col = tex2D(Samp1, float2( p, 0.1f ));
ここが臭うなぁ・・・
ここで参照してるテクスチャ見せて。
>>775 ベタ塗り一色のテクスチャで試してみるといいかも
>>775 Samp1のAddressUはClampにしてる?
右側は精子かかってるだけだろ もう一度落ち着いてレンダリングしてみろ
780 :
775 :2010/05/11(火) 19:58:36
tex2D(Samp1, float2( p, 0.1f )); テクスチャ座標にp(拡散係数?)が絡んでるのはなぜ??
>>778 に一票。
計算誤差で内積がわずかに1.0を超えてリピートしてる気がする。
783 :
781 :2010/05/11(火) 20:06:12
ああ、ごめん、分かったw
784 :
775 :2010/05/11(火) 20:08:52
すいません、Clampにしたら正常に描画されました。 以前テクスチャのテストで使った AddressU = Wrap; AddressV = Wrap; をコピペしたのが間違いだったのですね みなさんありがとうございました。
よかったよかった^^
スレ違いだけど FBX SDKに関する話題はどのスレいけば良い?
乳首か具が見えてないので答える気になれません
>>786 CG板かまるぺけさんのとこ
でもたぶんマイナーなのでみつからない
>>761 テクスチャをレンダーターゲットにすれば
2D描画に関しては必要な時にだけ更新すればよい。
ただ2D描画時に同期とる設定をしなければならないのでメンドイ。
FBXって日本語のページが更新されてないだけで SDKのバージョン自体は定期的にあがってたんだな・・・
質問失礼します。 IMFVideoMixerBitmapとIDirect3DSurface9を用いた、EVRでの オーバーレイ表示を考えています。 このとき、IDirect3DSurface9はどのように準備すればよいのでしょうか? 大まかな流れで結構ですのでご教授のほどよろしくお願い致します。 なお、言語はC++/CLI、Managed DirectX未使用です。
MediaFoundationのサンプル自体滅多に見ないが、kodersやkrugleで検索したらいくつかあるっぽい。
やったこと無いが普通にレンダーターゲットのを渡すだけじゃ失敗するのけ?
つまりこれって Win32プログラムの経験はあるけど DirectXでプログラム組んだことありませんって質問なのか?
>>773 スキン無しならただの頂点の配列でいいし
スキン有りなら単純な木構造でよくね?
>>769 遅くなりましたがありがとうございます。
描画は頂点配列をデバイスに流してるだけでした。
これじゃクオータニオン作らないといかんな…
なんてことはなかった 勘違い
最近流行りのモーフィング!
799 :
791 :2010/05/12(水) 17:54:07
>>792-793 回答ありがとうございます。
しかし当方では問題を解決できなかったためもう少しいじってみたいと思います。
800 :
791 :2010/05/12(水) 17:55:29
Visual Studio 2010買う価値ある? 今使ってるのは2005
>>801 とりあえず無料のExpressで試せして判断しろ
なんならそのまま使い続けろ
2010Expressの日本語版ってまだじゃなかったっけ? トライアル版なら使ってるけど 2005からならそろそろ移行しないとサポート打ち切り始まってるライブラリ出始めてるだろ
>>801 C++しか知らんが、使う価値はある。
インテリセンスでフリーズするとか、
デバッグランタイムじゃないと落ちるとか
2008では不明な不具合が結構あったが
全部直った。
ただ、重くなる。
2008はWinXP1.4GHzセロリンPCでギリギリ使えてたんだが
2010は重くて無理だった。
>>804 そんなロートルマシンは窓から投げ捨てろ!
いや、まじで。
そろそろCore 2 DuoやAthlon 64 X2くらいが当たり前な世の中になってほしいです。
>>805 愛機なんで捨てたりは出来ないが
2010が動かないのを機に、Win7機を買ったぜ。
これで俺もDX11プログラマの仲間入りさ。
ただしグラボが無いんで、サンプルの類はまったく動かないがな!
DX11戦士がここにまた一人誕生した
2010インストールしてみたが・・・ インテリセンスやらコードチェックやら超優秀になってやがる・・・ 優秀だから、たよりすぎてダメになりそうだぜ おっとスレチか
サクラエディタが好きすぎてVC++はただのコンパイラ+リンカになってるぜ・・・ VC++のエディタは検索キーワードのハイライトができないのがイタイ・・・
ゲーム戦士っていたな。地球を守るためにスペースインベーダーや平安京エイリアンで宇宙人と戦ったりするやつ。
サクラエディタで インテリセンスとか「宣言へジャンプ」とかどうやってんの?
サクラエディタもタブを数十個開くと重くなる。。。
Directxを使用してゲームプログラミングをし、現在は複数のメッシュを表示させつつ主人公を移動させるところまでたどり着きました。 ただ現在は実行中に、「の形をした白いものが画面にちらつくことがあります。 (同じソースを使っていても出たりでなかったり、出る場所が違ったりします) メッシュの描画処理やカメラの座標設定をコメントアウトしても真っ暗な画面に白いものがちらつき、何が原因なのかわかりません。 なお使用しているのはDirectX SDK (February 2010)および、Visual C++ 2008 Express Edition SP1です。 心当たりはないでしょうか?
>現在は複数のメッシュを表示させつつ主人公を移動させるところまでたどり着きました。 よくわからんけどすげぇじゃねぇかぁ!
MSの社員さんもこんなところ覗くんだな
とりあえずビデオカードのドライバを最新にするとこから初めてみたら? あとは、できればそのノイズの写ったスクリーンショットかな
>>814 PIXでフラッシュが出るまで全FPSをスキャンしてじっくりと解析してみれ。
819 :
814 :2010/05/14(金) 13:15:59
ビデオカードのドライバを更新したら症状が解消しました。 わかってみれば簡単なことだったのですが、言われるまでは気付きませんでした。ありがとうございます。 >よくわからんけどすげぇじゃねぇかぁ! 描画してるものは単なるテクスチャを貼り付けただけの板なので……すごくはないと思います。 これからも頑張ってもうちょっと前進したいです。
心霊の可能性はないと思います。 それは網膜に映るミジンコ状の電気ノイズ刺激に過ぎません。
みじんこぴんぴん現象
桜玉吉を思い出した
初歩的な質問ですが、 マップチップで構成された背景をスクロールさせるとき、 一枚のチップ(32*32とか)ごとにスプライトを1つ作り、そこにチップテクスチャ を1枚貼るのですか? それともある程度の数のチップテクスチャをその数の大きさ分のスプライト1枚に貼るのですか?
825 :
デフォルトの名無しさん :2010/05/15(土) 00:39:40
空のテクスチャを用意してそれに一度だけマップチップを描画するといいかも 何十枚もマップチップを描画するよりも処理は軽いはず。 わかりにくかったらすまない。
>>824 小さいのだと、動くスピードばらばらにして近感作ることもできる
単にスクロールさせたいだけならでかいの一枚でもいい
>>824 とりあえずお前の言うスプライトの定義が曖昧なのでそこをはっきりさせよう
ゲームを管理する上では1セル1データで管理した方が圧倒的に楽
しかしそれを安易に実行すると32x32のチップで640*320を埋めようとすると
20x15回のDrawPrimitiveとテクスチャ切り替えが発生する
この程度では最近のマシンではたいしたネックにはならないだろうが
簡単にこの回数を減らす方法としては
チップマップを1枚のテクスチャに突っ込む
20*15*4個の頂点からなる1個の頂点バッファを作成する
あとは各頂点のテクスチャ座標を移動するなり書き換えるなりすれば
1回のDrawPrimitiveで描画が完了する
>>827 とりあえずなんで640 480じゃないのかってね
そこは640*480だろうけど、スクロールするなら21*16だよね
>>824 例えば、1チップ32x32ピクセルで、表示領域が例えば320x320だとすると、
一度に表示されるチップは10x10チップ。
で、スクロールすると両端がまたがる格好になるので右と下に1列づつプラスして、
330x330ピクセル幅のビットマップを用意して、そこに一度、11x11分を描画しておく。
で、画面をスクロールする際、マップ上の位置(ピクセル単位)を32で割った商が直前と同じなら
描画処理はせず、剰余の分だけ位置をずらす。
商が変わった時、ビットマップを11x11分再描画するんだが、その際チップの種別が同じ部分は描かなくても構わない訳だから飛ばす。
・・・みたいな処理を繰り返す。 ・・・表示される内容や位置によって処理負荷が変わってしまうけど、
そこはタイミングを別に合わせてどうにかする、みたいな
技術的な質問ではないのですが、教えてください。 現在DirectX SDKに入っているサンプル-チュートリアルをいじっているのですが、 これらの内容について、みなさんはコピペでなく、処理の内容を理解して使っているのでしょうか。 それとも、適当に把握してるだけで、コピペして使っているのでしょうか。 そして、コピペ使用だと後々問題になってくるのでしょうか? 不躾な質問ですが、回答お願いします・・・。心が折れそうで。
内容理解しなかったら使えなくね いやマジで。 わかりきってるようなベタなパラメタセットや、あ、こんな値セット出来たのかって発見でもあれば コピペする事はあるけど、少なくとも俺は応用をしたいのでそんな感じ
あと
>>831 ほんとにこんなの全部覚えるの?だとか心が折れそうになるのは
結果を急いで一度に全部覚えようなんてするからじゃね
やらねばならない事は多いし腰据えて一つ一つ潰していきな
そこにあるのはただのライブラリ関数の使い方であって、実際に自分で作るのはそれらの中で
必要な物を選んで使うだけで、メインとなる処理は自分で考えて作るはずだから
内容を分かっててコピペするのと ただ闇雲にコピペするのとの間には大きな隔たりがある しかしこの壁を越えるのに必要なのは 「今の努力」より「継続の経験」によるものが大きい 今は何も分からずにコピペしてても4-5年もDirectXに触ってれば そこで何が行われてるのか普通に分かってくる 「理解してから使う」のではなく「理解しながら使う」のがよろしかろう
コピペってw宿題の丸写しじゃないんだから、やりたいコードは自分で書かないと実装できないんだよ。
うんうん、そうやって車輪の再発明を何度もするわけですね、わかります
理解と応用の為の追体験すら無駄な車輪の再発明と言い訳する奴は 大抵大した技術者じゃない 好奇心に従ってただスキル増やせばいいのに
838 :
デフォルトの名無しさん :2010/05/15(土) 17:17:57
そうやってコピってくれば終了の仕事を何日もかけてバグだらけの独自仕様のクソプログラムを量産するわけですね、わかります
他人に書かせてコピペで済ますバカはプログラミング自体していない訳だから 放っておいても消えるよ。技術無くてもプライドだけ高いから、屁みたいな言い訳しながら消えていく。 放っておけばおk
>>838 いやお前はわかってない
「〜わかります」とか、レスすらまさにコピペとかウケるww
頭良くない事は罪じゃないから、せいぜいがんばってニート脱出しなw
自分が何でこんな事言われてるか、本当はわかってるんだろ?ww
コピペしない=車輪の再発明 は酷いな ある意味すごい発想だな
ここは釣堀ですか?
まぁ、ここにいる連中の大半はライブラリ厨だからな とにかくなんでもかんでも自分のお手製でないと気がすまないし 何故かそれを誇りに思ってる 使えるものは何でもつかって最終的なゲームの完成だけを目指すクリエイター型と 最終完成そっちのけでライブラリ製作に没頭するエンジニア型の論争は いつまでたっても平行線で決着が付かない
釣り堀にすると質問者に迷惑かける それがわかってて行うならそれは誰かの悪意 発端が上の流れで今更「釣り堀」とか言うのは悪意を誤魔化す言い訳 いいから逃げずに何かしてろ
話がコピペの話から車輪の再発明に変わってるぞw
初心者だったら俺も最初はコピペで良いと思うけどな 最初はそうでもいずれステップアップして行けば 改造なり改良したくなってくるしその頃にはどこを弄れば良いか分かってるハズ 何でもかんでも最初から理解した上で1から全部書けというのは酷すぎる
いきなり自分でハードル上げて挫折していった初心者のなんと多いことか ここに質問に来る人って基本 DirectXを極めたい人ではなくてゲームとか作りたい人でしょ? だったらまずやるべきことは分かるだろう
服を脱ぎます
最近、DirectXの使い方自体は重要でないってことに気付きました
850 :
デフォルトの名無しさん :2010/05/15(土) 19:19:22
おれ東方厨だけど東方が大好きすぎてまじやべぇんだけど東方みたいな凄いゲームを簡単に作って一儲けしたい だからおまえら凄いゲームの作り方を教えろ
プログラム組め。以上。
「〜みたいなゲームを作りたい」とか表現が曖昧なのは 初心者にありがちだな
しかし視点を変えると、「〜みたいなゲームで行きませんか」 とか直球な例えで企画するのは 二匹目のどじょう狙う会社にもありがち。 とか言って
前の会社だけどPS3のゲームのソースで三角関数テーブルあって感激した。
>>854 固定小数点で計算してる場合、
0〜90°を180分割もしておけばゲーム用としては十分だからなぁ。
まあテーブルにしておくところじゃね?
スレ違いだけどね。
キャッシュヒットの都合上 なんでもテーブルから読んだ方が速くなるわけじゃないけどな
っcordic method
sinとかインラインアセンブラでfsin呼んでるソース見たんだけど意味あるんですか?
使う側でどうとでもなる話ですが、法線マップは基本的に平らな部分が青となるのでしょうか。 HLSLで法線マップの色を 赤:X軸 緑:Y軸 青:Z軸 として使用した場合、 ZX面に置かれている地面のポリゴンにそのまま当てると期待した色が出ずに困っていました。 ZX面に置かれた地面のポリゴンに全て平らという意味合いで青いテクスチャを法線として使用すると 2行目の使い方だと光源が真上より傾いたほうが明るく表示されることがあります。 一般的にはこういった場合はどのようにするものなのでしょうか。 現在HLSLで緑と青を入れ替えて 赤:X軸 緑:Z軸 青:Y軸 という風に使用しています。 地面だとこれで問題ないけど回転するものに対して適応出来ないしなぁ・・・・と思いつつ。
現世代のCPUのPCだと double sin ( double x ) > float sinf ( float x ) > long double sin ( long double x ) = float sin ( float x ) の順で速いよね たまにfloatの方がdoubleより速いと勘違いしてる人結構いるけど
>>862 float sin(float x) と float sinf(float x) の速度が違うのはなぜ?
sin(double) と sin(float) が混在しているってことはC++の話だと思うけど、
普通C++用のmath.hでは sin(float) は sinf をインラインで呼び出してるだけでしょ。
それはコンパイラの最適化次第 実行速度優先で最適化されればすべて等しくなるはずだけど 開発環境によるんじゃね?
floatよりdoubleのが早いのはx87のFPUレジスタが80Bitになってて float演算の場合は計算ごとに毎回32Bitに丸めなおすから処理が入るからだっけ? でも実際には大量に演算させる場合メモリアクセスの問題でfloatのが速かったりするんだよね。
>>862 たまに勘違いしてる人がいるって言うより、
>>865 も書いてるけどそれは
単にFPUの動作だけをカタログスペックなどで見ている場合、double の方が早いって話で、
実際の処理で考えたらメモリから Read するマシンサイクルが余分にかかるから
やっぱ float の方がって話じゃね
勘違いじゃないと思うよ
>>856 先に計算しておいてテーブルにしておくということですか...
勉強になります.
実測したら double sin ( double x ) = float sinf ( float x ) = long double sin ( long double x ) = float sin ( float x ) だったんだけど
実測したソース晒そうぜ
同じになるわけが無い 基本は全部double sin ( double x )で残りはそれを型キャストしてるだけなんだから。 まぁ、俺が計った限りじゃ3%程遅くなるだけだったのでそれほど気にするほどのものじゃないが
実測した 環境はWin7 32bit、Visual Studio 2008、Celeronノート #include <stdio.h> #include <time.h> #include <math.h> #define N (30000000) float proc1(float *v) { float f = *v; // ここを書き換える for (int i = 0; i < N; i++) f = sin((double)f); // ここを書き換える return f; } int main(int argc, char **argv) { clock_t start, end, tm; float v = 0.5, r; printf("最適化無効のため %d\n\n", v); start = clock(); r = proc1(&v); end = clock(); tm = end - start; printf("最適化無効のため %d\n\n", r); printf("time %d\n\n", tm); return 0; } 改行多すぎで怒られたので続く
float sin ( float x ) == float sinf ( float x ) < long double sin ( long double x ) == double sin ( double x ) になった
つまりfloatかそれ以外か
左と右の速度差は8%くらい
逆アセンブラで確認したら、全部_CIsin()を呼びに行った
速度差の理由は
>>865 にある通りで、doubleやlong doubleはレジスタだけで演算している
それに追加してfloatはループの最後に無意味なメモリロードとストアが1つずつある…なんだこれ
arch:sse2とfp:fastにしてテストしたけど、やはり順序は同じ
ただ速度差は10%になった
全部__libm_sse2_sin()を呼びに行った
速度差の理由は、
>>870 にある通り、キャスト(cvtsd2ssとcvtss2sd)有り無しの差で、無駄なメモリアクセスは消えた
単純にsinの引数がdoubleなせいで、flaotだとオーバーヘッドがある、という面白くない結果になってしまった
早くしたければfloatとかdouble以前に、SSE2に絞って_libm_sse2_sin()を直で呼ぶほうが良さそう(VSExpressはソースないから無理かも)
64bitとかgccとかXBox360とかの結果も気になるところ
>>806 スペック上ならはfloatの方が速いよ、特に除算やルート計算
それにSSEやAVXなら1命令でdoubleの2倍の演算が出来てお得
で、標準ライブラリのsin使わないでインラインアセンブラでfsin呼ぶのは速いの?
趣味でそういうことにこだわる人が多いのは分かりますが、 現実逃避はやめて、あなたのゲームを完成さる作業に移ってください。
超初心者なんですが、最初は本買って勉強したほうがいいですよね?
>>872 >floatはループの最後に無意味なメモリロードとストアが1つずつある
それは無意味ではないので、もっと勉強してくれ。
store reloadなんてものが必要なx87は地獄
まぁ最適化を考え出したらSSE使うようになるから気にしてもなぁって感じだし、 そういうのをやるのが楽しいのは分るけどまずはゲームなりなんなりを完成させるのが先だよな。
>>876 store-reloadの話ではなくて,store-reload後にも追加して1組のロードとストアがあるからわからない
こんなコード
fld dword ptr [esp+3Ch]
fstp dword ptr [esp+3Ch]
Debugなら分かるけどReleaseでやってるし意味ないと思うけど
880 :
デフォルトの名無しさん :2010/05/17(月) 00:05:25
頂点ペイントというのがよくわかりません。教えてください たしかfxファイルか何かをいじる奴ですよね? 頂点間の辺の太さや色を弄るようなものなのでしょうか?
それで自分の意図が相手に伝わると考えてるなら DirectXよりまず日本語との勉強から始めた方がいいとも思われる
>>880 頂点カラーのことを言っているのだろうか?
そもそも辺に太さなどないが
俺の勘だけど、多分丸ごとよくわからないんだと思う。丸ごと。
>>880 具体的に何をしたくて、どこでわからなくなった。
本当に丸ごとなら、まずググって自分なりに整理してみてくれ。
例えば、その用語で望むような内容が出てくるのか、とか
884 :
デフォルトの名無しさん :2010/05/17(月) 02:50:45
ありがとうございます したいことは、モデリングツールで頂点ペイントと言うのがあるのでやったらどうなるのかなと思いまして 今はマテリアルやテクスチャはあるのですが、何か金属に色を塗ったような感じに見えるので 頂点カラーを使ったらアニメっぽいオブジェクトを作れると前聞いたような気がしまして でも頂点カラーってオブジェクトのファイルじゃなくて、fxファイルかなにか、特殊なもので設定するんじゃなかったかなあと思いまして 結局頂点カラーってどういう処理なのかを理解してないものですから、簡単にまとめて頂けたら良いなあと思ったのです
マテリアルカラーとは その「面」が何色の光をどのように反射するかを設定するパラメーターである よってライトが存在しないとまったく意味の無いものである 一般に初心者レベルのメッシュの描画では このマテリアルカラーとテクスチャーカラーの乗算で色を決定する 頂点カラーとは ポリゴンの頂点そのものの色でありライトに依存しない 素ポリゴンの描画でもないかぎりたいてい無視される値であり 通常は0xffffffff(白)になっており色に影響を与えないようになってる これを設定し反映させることでライトに依存しない陰影を表現したり 透明度を変化させたりすることもある 一般にモデリングソフトは頂点カラーの出力のON/OFF設定が付いており 普段はあまり使われないものであるのでデータ削減のためにたいていOFFにしてある 上記のような使い方をするときのみONにして頂点情報に色のデータを含めることになる ただしモデルデータに頂点カラーのデータがあるからといってデフォルトで反映されるわけではない 当然プログラム側で頂点カラーが反映されるようにプログラムする必要がある またモデルデータに頂点カラーが含まれてない場合でも プログラム側から頂点カラーを制御して各種演出を行う場合もある アニメっぽいオブジェクトと頂点カラーはまったくの無関係 おそらくそれは、スキンメッシュファイルの作成時に 各頂点に対するボーンの影響度をグラフィカルに設定するために 見かけ上頂点に色をぬってるようにみえるものがあって それを「頂点のペイント」と言ってるものもあるのでそれで勘違いしてるのでは?
886 :
デフォルトの名無しさん :2010/05/17(月) 04:03:31
ありがとうございます シェーダーとごっちゃになってました これからシェーダーの書き方を勉強しようとしてたのでした そしてたら頂点シェーダーか何かと、頂点カラーがごっちゃになって、頂点カラーさえできればアニメ絵の3Dオブジェクトを作れると思ってました
いわゆるアニメっぽい表現は例えばプログラマブルシェーダ(=頂点シェーダ/ピクセルシェーダ)で トゥーンシェーディングなどのロジックを組んで表現したりするけど、 別に他の方法で再現したっていい。それは自分の都合次第。 逆に、ライト無しで頂点カラーで色を塗る形でアニメっぽくみせようとする事も別に出来ないって事は無いけど 多分あえてそうする理由も無いと思うので、とりあえずシェーダ書いて色々やってみれ
てか
>>886 はそもそもDirectXを使ってプログラミング自体した事あるんだろうか
頂点情報の構造体とか設定する場面で、頂点カラーにしろなんにしろ見てるはずなんだけど。
他にもSetMaterialにしろ、色々と
889 :
デフォルトの名無しさん :2010/05/17(月) 04:31:46
プログラム始めて2年しか経ってないからな マルチアニメのサンプルいじって3Dゲーム作ってるだけだし
その2年間は言語の基礎とサンプルコピペで過ごしてしまったか 頑張れとしか言えないなw
891 :
デフォルトの名無しさん :2010/05/17(月) 04:58:41
いいんだよ趣味グラマーだから DirectX11の方に行く気ないし
なんでそこでDirectX11が出てくるのか意味フ
893 :
デフォルトの名無しさん :2010/05/17(月) 05:10:12
うるせーバーカ
894 :
デフォルトの名無しさん :2010/05/17(月) 05:13:34
DirectX9でゲーム作れる→DirectX11に行くって普通のことなんじゃないの?
何も知らん初心者ほどDirectSoundとかD3D9固定機能とかのレガシーなものを使いたがる例を 我々はずっと見てきているじゃないか。
別に固定機能はいいだろ...w
897 :
デフォルトの名無しさん :2010/05/17(月) 07:26:09
DirectX11とか仕事でプログラムしてる人とか3Dのエンジン?作ってる人は基本からやった方が良いけど 車輪の再開発だしパソコンが高機能化するからDXUTで十分ってばっちゃがいってた
ステージ毎に必要なモデルを追加で読み込むゲームを作っているのですが、 不要になったモデル(特に風景やモンスターなど)はどれくらいの頻度でデータを解放するのが好ましいでしょうか? 使いまわすモデルも結構有るのですが、やはり全部解放して読み込んでとするべきなのでしょうか。(´・ω・`)
ステージ毎に必要なモデルを追加で読み込むゲームを作っているのですが、 不要になったモデル(特に風景やモンスターなど)はどれくらいの頻度でデータを解放するのが好ましいでしょうか? 使いまわすモデルも結構有るのですが、やはり全部解放して読み込んでとするべきなのでしょうか!…(´・ω・`)
(´・ω・`) …
(´・ω・`) ←これウザいから教えてやんない
902 :
898 :2010/05/17(月) 10:29:20
最近BBIQで頻繁にアクセス規制を受けており 批判要望板の ★★問答無用でレス代行します78スレッド に代行依頼をしたのですが
>>898 を代行して貰いお礼を書き込んだ後に、本文の文末だけ改変した
>>899 を誰かに勝手に投下されてしまいました。
ふざけているかのような内容になり申し訳ありません。(※今回は同板 アク禁になった人の為にレス代行するスレ★210 に依頼させて頂きました。)
「不要になったモデルはどれくらいの頻度でデータを解放するのが好ましいか」 だとか、 「使いまわすモデルが沢山有るが、全部解放して読み直すべきか」 だとか、 なんでそんな事を他人に質問してるのか良くわからない。 そのソフトの内部仕様(都合)として、使いまわす=使ってる内容は捨てられないんだろ? なら使っていない内容を解放しましょう、みたいなバカな答えが聞きたいの?
904 :
898 :2010/05/17(月) 13:17:04
>>903 変な質問になりすみません。
ステージ内に出てくるモデルが固定ではなくランダムで、将来的には同ステージ内でもプレイし続けると2〜400MBのメモリを食う恐れが有るのです。
これをステージ切り替え時に全部解放して必要なのを読むと待ち時間が増大し、再読み込みする物の読み込み負担が増えるのではないだろうか? と
そして
できれば効率的にメモリを管理できるシステムにして、シームレスとまではいかなくてもそれに近しい環境にできないだろうか? という願望から
曖昧な質問をしてしまいました。 もっと自分なりにどうすれば効率的に管理できるのか考えてみようとおもいます。
ありがとうございました。
質問スレで、真面目な質問にまで説教ってどうよ
>>899 理想を言えば、全て自前でメモリ管理するのがベストだろうけど、夢から醒めなさい。
想定しているビデオメモリが潤沢ならば、自前で解放のタイミングを
管理するのが、読み込み時間短縮の点で最良だろう。
シームレスなシーンを想定したゲームはこれが多い。「そろそろ」VRAMが
足りないなって時に、使ってない領域を必要なだけ解放すればいい。
しかしこのやり方だと当然メモリフラグメントの問題が生じてくる。
つまり「メモリは空いているはずなのに、確保できない…」状態だ。なので、
想定しているビデオメモリが厳しいならば、シーンごとにメモリをフラッシュすべき。
むしろゲームのデザインをそれに合わせるべき。
ゲームデザインや自分の腕を考え、可能ならば両者を折衷するのが良いだろう。
なんだかんだ言ったが、PCならDirectXのメモリ管理機能使っておきなさいな。
必ず使うシーンデータをDEFAULTで、動的なデータをMANAGEDで確保。この時
メモリフラグメントを防ぐため、DEFAULTの方を全て先に確保すること。
DirectX11ならまた違ってくるけどな。
>>560 >>905 ありがとうございます。
メモリフラグメント。初めて知りました。恐ろしい現象ですね;
>必ず使うシーンデータをDEFAULTで、動的なデータをMANAGEDで確保。この時
>メモリフラグメントを防ぐため、DEFAULTの方を全て先に確保すること。
勉強になります。メモリのフラッシュと合わせてそうさせて頂こうと思います。
本当にありがとうございました。 自前の管理もいつかできるようになりたいものです。
クォータニオンでz軸周りの回転方向だけ逆にしたいのですがどうすれば良いですか?
どの軸での回転を表すクォータニオンで? ※ちなみに逆回転はサンドイッチ算を逆にするだけ
ありがとうございます もうちょっと頑張ってみます
(´・ω・`)
DirectXってWINAPIを知らないと無理ですか?
>>911 無理です。 最低限、普通にCreateWindowしてウィンドプロシージャ書いて、
DirectX関係ない部分の処理は書けないと無理。
・・・単にライブラリをテスト的に使うだけなら、あるいは出来る事が限られてもいいなら
DXUTなどのラッパライブラリを使うことで、"あまり"直接触らなくても書けるかもしれないけど、
そもそもわかってないと多分何も出来ないので、そういう意味で無理です。
というか、当たり前レベル
DirectXはあくまでただのライブラリ。描画、サウンドその他の、あくまでライブラリ、関数群なので それだけ使って何かするって言うような物じゃないので、 そもそも知らないと多分意味のある物なんて作れない。それ以前に、まったく何も知らない状態なら DirectXとか全然関係ない基本的な部分でウィンドウすら作れない。 普通のマウスイベントもハンドルできない。 そんな訳で、DirectXってどういう関数群/ライブラリなのか普通に把握してれば、そもそもそんな質問も出ないと思う
>>911 まーそうだけど詰まったら調べりゃいいんだし便利ライブラリとかもあるから、難しく考えずやってみれば
マウス関連の操作とか、ファイル入出力、場合によってはGDIの力を 借りることもあるから、簡単なWin32アプリは作れる人が前提
無理ではないんが厳しいとも思う SDKに入ってるもっとも簡単なサンプルだと 全体の半分くらいがWindowプログラムの領域になるわけで 経験者であれば残り半分を見れば良いだけの所だが 初心者はどこまでがWin32の領分でどこからがDirectXの領域か判断が付かないから 最初に直面しなければならない情報量が極端に増える しかし、ステップアップしていけば Windowsで処理する部分なんて全体の数%にも満たなくなるわけだから必須ではない Win32APIを極める必要はまったく無いので スケルトンウィンドウが作れて簡単なメッセージ処理が出来ればあとはDirectXの勉強に専念してOKだと思われる
winプログラミングもやるのが面白いんじゃないの...
開発に自作ツールとか作り始めたら本格的に勉強すればいいんじゃね?
みんなありがトン 猫本読破してくるぜ
ウィンドウとメッセージループ、メインループさえ作れれば、 あとは適宜必要になったら調べればいいかな さっさと済ませてDirectxに入ったほうが楽しめるかもしれん
XAudio2について質問です SDKサンプルのXAudio2BasicStreamを見ながら勉強中です サンプルではメインスレッドでwavデータをロードしていますが、 これは実際にゲームなどで使う場合、 自ら_beginthreadex などして再生スレッドを生成する必要があることを 意味しますか?
コールバック内にファイルロード処理を書けばいいということでしょうか?
敵キャラを描画する時って、全く同じモデルの敵が居るなら、ソートして一括描画した方が良いでしょうか? マテリアル切り替えが重いと聞いていて当然やるべきだと思っていたのですが、 今時のパーツはそこまで重くならない等と聞いて、そこまでしなくて良いのかな? と疑問に。 描画時だけソートするか、ゲーム全体をソート前提にあれこれ工夫するか悩んでいます。 どう思われますでしょうか?
SetMaterialのオーバーヘッドを削るよりも、 見やすいコードにしたほうがいいのではないだろうか〜
スマン 見やすいって変な表現だな ソートしなきゃパフォーマンス落ちる! とは聞いたことがないなぁ
ソートと同じモデルの関連性が分からん ソートするんだったら全部をZソートして 手前から順に描画することでそれより奥にあるものの描画を省くことで パフォーマンスを上げようと試みるものじゃ Z値で大まかにグループ分けして 手前のグループから順にさらのその中でマテリアル単位で描画するとかでもない限り そんな大幅なパフォーマンスアップは無いような…
エスパーだけど、マテリアルの切り替え減らすためにソートしなきゃって話は、多分 自分でそうしなきゃ行けないような状態で管理してるからだと思う 予め種類ごとになんらかのリストに分けて管理を単にしてないとか。 あるいはモデルをまたいで同じマテリアルがある時、どのモデル達にどのマテリアルが含まれてて それらをマテリアル単位に描画したいって事なら、それでもソートなんてせず、 自分で決めたそのマテリアルのIDなりなんなりで頂点範囲のリストを予め参照できる作りにしておけばいいだけ 自分のロジックを都合にあわせて書けばおkってだけの話
そもそもシェーダーつかってれば マテリアルなんてメモリ上のデータを定数レジスタに突っ込むだけじゃん?
Zソートが要るのは、アルファチャンネルで透過させるときだな。
透過の有無に関わらず、手前を先に描画しておけば、その背後がムダに描画されないし、 Zソートはあったほうがイイんでないの??
いやこの場合のソートってマテリアルソートじゃないの・・・ シェーダー・テクスチャ・ステートの切り替えを極力減らして高速化を図るって話だろ。
結局マテリアルソートって有効なの? 本にはやるべしとか書いてあるけど、 実際の所労力に見合った効果はある?
ちゃんと作れば効果は高い。ちゃんと作るのは大変。 このスレのレベルに沿ってアドバイスするなら「そんなことより完成させるのが先」
モデルもエフェクト(マテリアル)も同じならそれをグループ化してソートしつつインスタンシングするといいと思う エフェクトグループ単位でソートして、どのエフェクトから書くか決めるのもありかもな
並列処理を考えれば、全部そろってソートしてから描画するより、準備が出来たのからどんどん描画してゆきたいけど。 あらかじめ近・中・遠でわけておくくらいでいいんじゃないか
一番重いのはシェーダーの切り替えだっけ?
最近はどうなんだろうな
どうなんだろうなっていってんだろ...w......
エフェクトで管理してあればそんなでも無いはず
>>937 何か前のほうの書き込みで、VRAMが潤沢になった昨今では、よほどでない限りは
(CPU->GPU転送レベルの)シェーダ切替は発生しないみたいだから、
あまり気にしなくてもイイってあったよ。
シェーダーに限らずマテリアルの変更はパイプラインのフラッシュが必要だから 今でも遅いと思うな。ソートして目に見える違いがあるかどうかはよく分からない。
マリオ64みたいなカメラにしたいのですがどうすれば良いですか? そういうタイプの名前とか、雛形があったらうれしいです
うろ覚えだが、つまり二つのカメラを切り替えたいってことか?
自分もうろ覚えですが、なんというか、ある範囲内では自由に動けるけど、その範囲を出たらピーっと追って行くみたいな 頭を整理しながら書いてたらなんかすごく簡単そうに思えてきたけど
質問するなら、もう少し他人が理解できるように努力してくれ
ごめんねごめんねー
サンプルクレクレ厨の臭いがする そんな都合のいい物は存在しないから とりあえず自分で実装を試みてうまくいかなかったら 改めてどうダメだったのかを質問しに来い
しってる
Game Programing Gems 2 4.11 古典的なスーパーマリオ64の三人称コントロールとアニメーション
ぐぐったらあった
4までなかった
○.xの絶対値が△以下とかどうやって表せばよいですか?
しねばいいのに
浜田さんおしえてください
>>957 (⌒⌒)
V
/ ⌒`"⌒`ヽ、
/,, / ̄ ̄ ̄ ̄\ 大変失礼なことを致しました。
/,//:: \ 何とぞ、ご容赦くださいませんか。
;/⌒'":::.. |⌒ヽ
/ /、:::::... /ヽ_ \
__( ⌒ー-ィ⌒ヽ、 /⌒`ー'⌒ )
━━━`ー──ゝィソノー‐ヾy_ノー─"
マジキチ サイト見たら数週間掛かるとか書いてあった>ゴムひも視点oz
適当にやってたらそれっぽいのできてワロタ
スーマリ64のキャメラってたしかジュゲムが撮影してるんだよね
そういやここって次スレ立ての番号がテンプレに入ってないね あまり速度ないから970か980くらいかと思ってたけど
どーでもいーでーす
なんか池沼が1人紛れ込んでるみたいだな
DrawPrimitiveUPでラインを引きたいのですが思った場所に表示されません いくつか物体があるのですが、最後に描画される物体のローカル座標?でおそらく表示されてしまいます それらのメッシュはg_pEffect->セットマトリクス、テクスチャ、FVF、ビギンなどの後、 for( UINT p = 0; p < Passes; ++p ) { V( g_pEffect->BeginPass( p ) ); V( ほげ->DrawSubset( 0 ) ); V( g_pEffect->EndPass() ); }V( g_pEffect->End() ); というような感じで表示しているのですが それぞれ閉じているので、ライン自体がどこで表示されてるかわからない上に、どのローカル座標に入ってしまったのかわかりません 教えてください。
>>966 とりあえずメッシュはシェーダーつかって座標の行列変換して描いてるってことは分かるけど
DrawPrimitiveUPで描くラインは
シェーダー使って描いてるの?固定機能で描いてるの?
>>967 わかりません。ある物体の座標をラインのための頂点の配列に入れてDrawPrimitiveUP( D3DPT_LINELIST,4, vert, sizeof(VERTEX));としただけです。
適当なところでDrawPrimitiveUPして試してるかんじです。一番上でDrawPrimitiveUPすると最後の物体からラインが生える。
一番上でDrawPrimitiveUPとして最後の物体で↓にすると
//V( g_pEffect->BeginPass( p ) );
V( ほげ->DrawSubset( 0 ) );
//V( g_pEffect->EndPass() );
とすると上手くいく部分もあります。でも理由が良くわかりません。
どこから説明していいのか分からないくらい基本から理解してない事は分かった 埒が明かないのでソースうpしる
ソースは無理でつ エスパーでなんとかおねがいしまつううう
ラインは3D空間上に配置したいのか? それともスクリーン座標で2D的に引きたいのか? VERTEX構造体とvertの中身だけでも書いてくれ
>>971 3D空間でつ
VERTEX vert[] =
{ {0,0,0,0xffff0000},{物体A.x,物体A.y,物体A.z,0xffff0000},
{物体A.x,物体A.y,物体A.z,0xffff0000},{物体A.x + 2.0f,物体A.y,物体A.z,0xffff0000},
{物体B.x,物体B.y,物体B.z,0xffff0000},{物体B.x,物体B.y+0.4f,物体B.z,0xffff0000},
};
これだけでつ(`・ω・´)
ラインに色が付く時とか付かない時とかあって意味わからんお。
じゃあ、とりあえず DrawPrimitiveUPの前に SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE) してくれ
すでにしてあります(`・ω・´) ゝ
まさかとは思うけど SetTransformで行列の設定はしてるよね? メッシュは(たぶん)シェーダーで行列変換してるからいいけど ラインを固定機能でかくならちゃんとデバイスに行列を指定しないとだめだぞ?
g_pEffect->SetMatrixでワールド行列やプロジェクション行列を設定していますがこれのことですよね? 今D3DXFX_DONOTSAVESAMPLERSTATEにしてみたりしているのですが意味ありますかね? 元々全てD3DXFX_DONOTSAVESTATEだったのですが
>>976 意味わかっててパラメーターを変更したのか?
DXUTを使用したSDK標準のサンプルはビルドして動かしてみたか?
正常に動いてるなら自分のコードと比較してどこが違うか確かめられないか?
人に質問する前に一人で確かめられることはいろいろあるぞ。
g_pEffect->SetMatrixはシェーダーに行列を送ってるだけ メッシュ描画用とは別に ライン描画用のシェーダーを書いてるとかでもない限り意味無いぞ
すいません 文字が間違ってました 説教ありがとうございました
え?w
とりあえずDrawPrimitiveUP をシェーダーで書いてるのか固定機能で書いてるのかだけでもはっきりさせてくれよ DrawPrimitiveUPは g_pEffect->BeginPass( p ) ; と g_pEffect->End() ; の内側にあるのか?外側にあるのか?
984 :
デフォルトの名無しさん :2010/05/21(金) 10:13:14
V V (´・ω・`) うさちゃんピース
さっさと埋めようぜ
そうだな
Mesh管理は自前埋め
D
よりによって最後の質問が地獄のようなバカ質問だった埋め
まだ最後と決まったわけではないよ!梅
I Love DirectX API !!
みんな最初はバカな疑問を一つ一つ解決して上達するもんじゃねぇか 埋め
そう。 そうやって大人の階段を登っていくんだよ。
君はまだシンデレラさ
Direct○○X
__(^^) <ペイピッポォ DirectXスレのマスコット、ペイピッポォ君だピー /__ \ | | | | (_) (__) 愛用ツール:ツクール
DirectXは永遠に不滅です
うめ
あ、そういえば
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。