5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【C++】 DirectX初心者質問スレ Part28 【C】

1 :デフォルトの名無しさん:2010/03/16(火) 00:16:48
※回答する人も、質問する人も必ず読んでください

これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。


2 :デフォルトの名無しさん:2010/03/16(火) 00:18:12
前スレ
【C++】 DirectX初心者質問スレ Part27 【C】
http://pc12.2ch.net/test/read.cgi/tech/1263024805/

3 :デフォルトの名無しさん:2010/03/16(火) 19:16:58
質問です。

立方体をポイントリスト、ラインリスト、トライアングルリストで描画しようとしているのですが、
ポイントもラインもポリゴンも真っ黒になってしまいます(背景は青色)
頂点フォーマットは
(D3DFVF_XYZ | D3DFVF_PSIZE | D3DFVF_DIFFUSE | D3DFVF_SPECULAR )
の形式で、描画直前に頂点バッファをロックしてdiffuseの値を確認してもちゃんと入ってます。

カラーは0x44ff00ffのような感じで入れて、色々変えてテストしてるんですが、
半透過で表示した場合、最初の44の所を色々変えると、ちゃんと透過の濃度は変化しているので、
カラーは確実に読んでると思います(ただし真っ黒からどんどん薄くなる感じです。赤や青に出来ません)

こういう状況を見て、「あー、これは多分あそこがおかしいんだな」と推測がつく方おられますでしょうか?
現状詰んでます。宜しくお願いします。

4 :デフォルトの名無しさん:2010/03/16(火) 20:11:43
>>3
SetRenderState(D3DRS_LIGHTING, FALSE)

あと、D3DFVF_PSIZEがなんで入ってるの?

5 :デフォルトの名無しさん:2010/03/17(水) 01:01:51
質問です。

板ポリのUV座標(画像内座標)の指定をピクセル単位でやりたいのですが、
何か上手い方法はありませんか?

6 :デフォルトの名無しさん:2010/03/17(水) 01:25:20
>>5
そう言うピクセルシェーダーを書けばいいじゃん
板ポリの大きさとテクスチャの大きさを渡せば、シェーダー内でUV値出せるだろ

7 :3:2010/03/17(水) 02:55:50
>>4

有難うございます。色が表示されるようになりました。
PSIZEはポイントスプライト表示の時の大きさ格納用に入れてます。

8 :デフォルトの名無しさん:2010/03/18(木) 00:00:50
こんちには
サウンド系の質問です

どなたかオーディオインターフェースのマイク入力を
読み込んだ方はいます?
オーディオインターフェースとは こんな感じの製品です
http://www.kurosawagakki.com/items/detail/54714.html

16chのマイク入力を持っているのですが
単純にチャンネルを指定すれば波形として
読めるのでしょうか?

9 :デフォルトの名無しさん:2010/03/18(木) 12:14:33
質問です

DirectX9cを使っています
画像表示、文字表示、キーボード入力をしようとしました
コンパイルは通りましたがメイクをすると
外部シンボル ×××が未解決(・・・・MAIN.OBJ が参照)と表示されます
×・・・D3DXCreateSprite、D3DXCreateTextureFromFileA、D3DXCreateFontA
   の3つです

キーボード入力を除くとメイクは問題なし
またに画像表示、文字表示を除くとメイクは問題なし
ですがキーボード入力+画像表示 or 文字表示でメイクが通らなくなり困っています

ソースファイルはmain.cppのみです
どなたかご教授お願いします

10 :デフォルトの名無しさん:2010/03/18(木) 12:33:50
キーボード入力を除いた版は実行すると画面に画像は出る?
コンパイラが最適化して根こそぎ削られてたりして

11 :デフォルトの名無しさん:2010/03/18(木) 12:40:25
どれもd3dx9.libが必要だけど、ちゃんとリンクしてる?

12 :デフォルトの名無しさん:2010/03/18(木) 12:58:55
いったんクリーンしてリビルドで治るやも

13 :デフォルトの名無しさん:2010/03/18(木) 13:44:01
プロジェクトごとうpした方が早くないか

14 :デフォルトの名無しさん:2010/03/18(木) 20:50:50
変な質問すみません、
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の環境でもアップしていいのでしょうか?

16 :デフォルトの名無しさん:2010/03/18(木) 21:41:42
#pragma comment( lib, "d3d9.lib" )

17 :デフォルトの名無しさん:2010/03/18(木) 21:58:50
>>14
そんなの実装する側次第だから、自分で何とかすれば良いだけの話。


18 :デフォルトの名無しさん:2010/03/18(木) 22:14:32
>>15
BCCはよくしらんけど、どゆこと?
>必要な*.libは*.dllに変換しリンクしています

19 :デフォルトの名無しさん:2010/03/18(木) 22:19:01
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
スキンメッシュにシェーダーをかけたいんですが
これはスキンメッシュの各部分に普通のシェーダーをかけるようにすればいいのけ?

25 :デフォルトの名無しさん:2010/03/19(金) 15:04:09
>>24
そうそう
フラグメントリンカ使えば動的にスキンメッシュの部分だけ作れるよ

26 :デフォルトの名無しさん:2010/03/20(土) 10:31:15
質問です。

Direct3Dでゲームを作っているのですが、
デバイスロスト対策部分を現在開発中です。
※テクスチャをレンダリングターゲットにしています

一応、基本的なロスト対策は出来ている状態です。
・フルスクリーン⇔スクリーン
・フルスクリーンAlt+Tab

が、ここでCtrl+Alt+Delを押すと、
デバイスの再生成に失敗します。

いろいろ試した結果、Ctrl+Alt+Delで表示されるウィンドウ表示中に
デバイスを生成すると、失敗するようです。

Ctrl+Alt+Delで表示されるウィンドウ表示中は処理を保留したいのですが、
このウィンドウが表示されていること検出する方法を教えて下さい。




27 :デフォルトの名無しさん:2010/03/20(土) 12:20:58
そんなん問題になったことないけどな。
D3DERR_DEVICELOST
  ・いったんメッセージループへ戻り(必須)、TestCooperativeLevelがD3DERR_DEVICENOTRESETを返すのを待つ。
  ・D3DPOOL_DEFAULTリソースの破棄は可能
D3DERR_DEVICENOTRESET
  ・Resetする。
の手順は守ってるか?

28 :26:2010/03/20(土) 13:03:39
>>27
返信ありがとうございます。
自分のソースを確認したところD3DERR_DEVICELOSTになった後、
TestCooperativeLevelがD3DERR_DEVICENOTRESETを返すのを待たずに
再生成していました。

回答の通りにソースを書き直したところ、解決しました。
ありがとうございました。









29 :デフォルトの名無しさん:2010/03/21(日) 00:16:20
自分で、簡単なモデラーを作ろうと思っているのですが、頂点の選択部分がうまくいきません。
実際の頂点と 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が使えないもの)を再構築しなければならない とのことなのですが

動的に生成、破棄されるクラスの中にリソースを入れてある場合、
デバイスロストが発生した時点で、再構築しろというメッセージを各オブジェクトごとに送らなければなりません

素人の私の考え方だと、
「現在生成されているオブジェクトのリスト(いくつかのポインタ)を作っておいて、
それで各オブジェクト(すべてが同じクラスのオブジェクトとは限らない)に再構築しろというメッセージを送る」
こんなイメージが漠然と描かれるのですが、

もっと楽、または適切、または効率が良い方法があれば教えていただきたいです


31 :デフォルトの名無しさん:2010/03/21(日) 00:44:53
>>29
まさかと思うが、浮動小数点型を float == float 見たくしてないよな?
違うならば、ズレとはどの程度かを言いたまえ

32 :デフォルトの名無しさん:2010/03/21(日) 01:17:42
>>29
そのコードが何をしたいのか意味が分からない。
3歩進んで2歩戻るようなことしてるし。

33 :デフォルトの名無しさん:2010/03/21(日) 02:02:09
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座標に違いが生じてしまっていました。
とりあえず、うまくいきましたので、お礼をさせていただきます。

36 :デフォルトの名無しさん:2010/03/21(日) 23:59:56
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;
}

37 :デフォルトの名無しさん:2010/03/22(月) 08:24:32
右手座標系のデータを読み込んでスキニングしようとしたんですけど
うまくアニメーションされません。スキニングしない場合は正常に表示されます。

もしかしてボーン行列の掛け算の順序とかも変えないといけないんでしょうか?

38 :デフォルトの名無しさん:2010/03/22(月) 08:39:35
読み込み時に左手座標系に変換して何が間違っているのか確認しろ。

39 :デフォルトの名無しさん:2010/03/22(月) 08:50:21
>>38
ヘルプに書いてあるように、
三角形の頂点の順序を反転し、システムが前から見て時計回りにたどれるようにする。つまり、頂点が v0、v1、v2 であるとすると、Direct3D に v0、v2、v1 として渡す
をすればいいんですよね?

40 :デフォルトの名無しさん:2010/03/22(月) 13:57:44
>>36
>>D3DXVec3Unprojectの結果をD3DXVec3Projectしても元には戻らないね。 
俺も自分のライブラリで作ってみたが、別に元に戻るみたいだが。
戻らない理由も特に見当たらないし。
まあただ、逆行列の精度が悪くて誤差は凄いけど。

41 :デフォルトの名無しさん:2010/03/22(月) 14:09:03
>>39
頂点そのものもひっくり返せ

42 :デフォルトの名無しさん:2010/03/23(火) 10:27:06
以下のように初期化をした後で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となっていますが、これは関係ありますでしょうか?

43 :デフォルトの名無しさん:2010/03/23(火) 10:27:47
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;
}

44 :デフォルトの名無しさん:2010/03/23(火) 10:28:28
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
http://www1.axfc.net/uploader/Sc/so/95463.zip&key=d3d9x

ソースを削ってろだにアップしました。
お願いします。

46 :デフォルトの名無しさん:2010/03/23(火) 12:56:14
失敗して何の問題があるんだ?
それで正常動作だろ。

47 :デフォルトの名無しさん:2010/03/23(火) 13:35:05
>>45
http://msdn.microsoft.com/ja-jp/library/bb172584(VS.85).aspx


Direct3D 9 と Direct3D 9Ex の違い
D3DPOOL_MANAGED は、IDirect3DDevice9 の場合は有効ですが、IDirect3DDevice9Ex の場合は無効です。


48 :42:2010/03/23(火) 13:37:02
>>46-47
すみません、ありがとうございます。
使い勝手のがいいので、DX9C日本語chmを見て使っていたので、乗ってませんでした。
初歩的なミスでした、ありがとうございました。

49 :デフォルトの名無しさん:2010/03/23(火) 14:12:41
Exすっ飛ばして10に行ったから調べてないんだが
ExはWDDM?動作だからデバイスロストなんてしないしリソースもうまいこと管理してくれるけどVista以降って認識でいいのかな

50 :デフォルトの名無しさん:2010/03/23(火) 15:17:45
ちょっと調べれば分かることをなんて聞くの?

51 :デフォルトの名無しさん:2010/03/23(火) 16:50:05
DXUTのコントロールって重いですか?

52 :デフォルトの名無しさん:2010/03/23(火) 17:00:42
2kgくらいだったかな

53 :デフォルトの名無しさん:2010/03/23(火) 17:54:27
>>30
デバイスロストに対応するべきクラスは、
class ICallbackLost{
static list<ICallbackLost*> s_list;
ICallbackLost()
{
s_listに追加;
}
virtual ~ICallbackLost()
{
s_listから削除;
}
virtual void lost() = 0;
virtual void reset() = 0;
}

クラスを継承するといい。

54 :デフォルトの名無しさん:2010/03/23(火) 17:55:32
>>30 >>53
メソッドをpublicにし忘れた…
他にも色々つっこみどころはあると思うが、概念的として読んでくれ

55 :デフォルトの名無しさん:2010/03/23(火) 22:49:59
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の取得とかバッファの書き込みは問題ないはずです

56 :デフォルトの名無しさん:2010/03/23(火) 23:00:57
10年くらい前、SoundBlasterの糞ドライバが憎まれていた時代の非公式テクニックだが、
DirectSoundのバッファが小さいと問題出るので、バッファの最小限のサイズを決めて
余白は無音で埋めるというのがあった覚えがある。最小サイズは1024byteか4096byteだったような気がする。

57 :デフォルトの名無しさん:2010/03/23(火) 23:38:46
>>56
ありがとう
試しにバッファサイズを +4096 してみたけど解決しなかった

どうもDirectInputの入力で音を鳴らしたときに途切れる現象が発生する。
普通にループだけで0.2秒おきに鳴らしても問題なかった。
どっかでメモリ壊してるのかも

58 :デフォルトの名無しさん:2010/03/23(火) 23:39:57
>>57
一回他の音楽データで試してみて

59 :57:2010/03/23(火) 23:56:47
>>58
差し替えたら問題なく再生できた
ファイルに原因があるのか、WAVEFORMATEXの取り方がおかしいのか・・・


60 :デフォルトの名無しさん:2010/03/24(水) 00:20:42
Dx9EXって使う人っているんだなぁ。
あれ使うくらいならDx11使う方が遥かにいいと思うけど。

61 :デフォルトの名無しさん:2010/03/24(水) 00:38:51
最近のゲームって文字表示のシステムってどうなっているんでしょうか?
漢字は当たり前ですが、、、

62 :デフォルトの名無しさん:2010/03/24(水) 00:39:16
Vista以降でもDXVAやEVRやらの動画系やWPFとかが
いまだにD3D9を要求してくるからねぇ。
仕方なしに使う場面も結構あると思うよ。

63 :デフォルトの名無しさん:2010/03/24(水) 00:45:37
D3Dのカリングだと、反時計回りのポリゴンを描画しないとあるんですが、
TRIANGLESTRIPの場合、1枚目の頂点を時計回りで定義すると2枚目は反時計回りにならないですか?

64 :デフォルトの名無しさん:2010/03/24(水) 02:00:51
>>63
別に頂点順にポリゴンを形成しなければならない道理は無いじゃん
0-1-2, 1-3-2, とかで処理してると思えない?

65 :デフォルトの名無しさん:2010/03/24(水) 02:40:48
>>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つの仮想関数の中身を書いてあげれば、うまく望んだ動作をしました
ありがとうございました!

67 :デフォルトの名無しさん:2010/03/24(水) 09:28:15
>>66
念のため言っておくが、デストラクタにvirtualつけ忘れてんぞ

68 :デフォルトの名無しさん:2010/03/24(水) 09:53:02
何これコンテナとデータが一体になってんのか

リスト持ってる管理側とクラス分けたほうがよくないか?
俺が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;//再構築処理を書く
};
};


見当違いだったら須磨祖

69 :デフォルトの名無しさん:2010/03/24(水) 10:01:56
ああすまんs_listがprotectedなのは分かった

70 :デフォルトの名無しさん:2010/03/24(水) 10:07:46
Direct3Dは1アプリケーションで2つ扱うことがない(できなくはないが、やるなとMSが言っている)から、staticで十分かと。
気分の問題程度だよね。
あとs_listはprivateでいいよね。

あと、>>68のはせっかくコンストラクタとデストラクタで登録/削除処理してたのに、自前で登録関数呼ぶことになっちゃうよね。
趣旨理解してないぞ

71 :デフォルトの名無しさん:2010/03/24(水) 10:10:22
なんでLostManagerのデストラクタでReleaseResource呼んでるんだ・・・?
意味不明すぎる
ReleaseResourceが呼ばれるのは、D3Dがデバイスロストした時だろ…

72 :デフォルトの名無しさん:2010/03/24(水) 10:14:39
ごめん理解してなかった

余計なお世話でしたね

73 :デフォルトの名無しさん:2010/03/24(水) 10:43:39
IDirect3DTexture9* tx1 = ...;
IDirect3DTexture9* tx2 = tx1;
tx1->AddRef();

このテクスチャがロストした場合は、tx1で再構築すればtx2では再構築する必要ありませんか?

74 :デフォルトの名無しさん:2010/03/24(水) 11:15:49
だめ。
つttp://marupeke296.com/DXG_No52_DeviceLost.html

〜CreateTexture関数にポインタのアドレス渡すでしょ?
tx1で再構築すると別の空間に作られてそこを参照しなおすから、tx2とは参照先が異なる

IDirect3DTexture9* tx = 〜;
IDirect3DTexture9** tx1 = &tx;
IDirect3DTexture9** tx2 = &tx;

これならtx1,tx2はそのままで使えるけど、アクセスは面倒なことに・・・


75 :デフォルトの名無しさん:2010/03/24(水) 17:32:17
ピクセルシェーダーでアルファ値無しのテクスチャの黒成分をアルファ値として出力するにはどう書けばよいですか?

76 :デフォルトの名無しさん:2010/03/24(水) 20:31:06
>>70
デバイスロストはDirect3D単位で起こるものではなく
Direct3DDevice単位で起こる。
Direct3DDeviceは、例えばビデオカードが2枚刺さってれば
ふたつ作ることもありうる。
つまり、staticのリストはNG。デバイス毎にリストを保持するのが正しい。

77 :デフォルトの名無しさん:2010/03/24(水) 22:49:10
>>67
指摘ありがとうございます!

virtualなのですが、このクラスでは、
リストの中に入っているポインタを使ってdeleteをせず、

派生させたクラスで個別にdeleteを呼ぶためにリーク類は起きない、
ということでつけていません(確認済み)
なのでデストラクタの実態にはリストから削除という命令を書いているという形です

>>68
>リスト持ってる管理側とクラス分けたほうがよくないか?
たしかにおっしゃる通りかもしれません
もういちど考えてみます!

>>70
>あとs_listはprivateでいいよね。
まったくその通りです 修正します
ご指摘感謝です!

78 :デフォルトの名無しさん:2010/03/24(水) 22:54:59
>>76
なるほど・・・そのパターンは考えていませんでした
勉強になります
しかしとりあえず今回は一番多いパターンのビデオカード1枚という形で、
組んでいくことにします

79 :デフォルトの名無しさん:2010/03/25(木) 00:47:56
>>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;
}

こんな感じ

80 :デフォルトの名無しさん:2010/03/25(木) 00:50:36
ご指摘のあったポイントを参考に修正しました

ttp://down11.ddo.jp/uploader/download/1269445212.zip
パスはaaaa

クラスは2つに分けました
そのほうが機能ごとに分けられ、より整理できました
>>68で指摘のあったとおり、クラスを2つに分けました

・リストを管理するクラス
・ロスト情報を受け取るための抽象クラス

おかしな点ございましたらご指摘をお願いします

81 :80:2010/03/25(木) 00:52:49
若干文章ミスりましたOTL

82 :デフォルトの名無しさん:2010/03/25(木) 01:32:11
>>79
レスどうも。。。
RGBを0〜1にしたいということです。
調べたんですがこれで求まるらしいですねG = g*0.59 + r*0.3 + b*0.11;

83 :デフォルトの名無しさん:2010/03/25(木) 02:38:08
最初からグレースケールって言えよ・・・

84 :デフォルトの名無しさん:2010/03/25(木) 14:05:30
>>82
それをどう解釈したら「黒成分をアルファ値として出力」になるんだよww

85 :デフォルトの名無しさん:2010/03/25(木) 14:15:40
>>82
日本語が不自由っていうレベルじゃねえぞwwwwwwwww
精子からやり直せwwww

86 :デフォルトの名無しさん:2010/03/25(木) 16:45:48
そんなにおかしいかな?

87 :デフォルトの名無しさん:2010/03/25(木) 16:55:36
黒成分ってのは結構おもしろかった
カラー画像をグレー化する変換式は1通りの決まった正解があるわけじゃないよね

88 :デフォルトの名無しさん:2010/03/25(木) 16:59:41
「黒成分」ってのは減色混合における黒インク量のことか?

89 :デフォルトの名無しさん:2010/03/25(木) 17:01:28
CMYKだとKが黒成分だよね

90 :デフォルトの名無しさん:2010/03/25(木) 19:03:41
黒成分ワロタw
まぁ、言いたいことは分かる。

輝度(Y)、グレースケールなどなど、言い方はいろいろあるね。

91 :デフォルトの名無しさん:2010/03/26(金) 01:02:25
いずれにしろアルファは全く無関係なのは確か。

92 :デフォルトの名無しさん:2010/03/26(金) 01:13:09
Direct3D9で2D表示を行っています
現在は頂点をスクリーン座標で指定し、ビューポートの逆変換によって表示しています
Z軸の回転は問題ないのですが、
X軸Y軸の回転の場合縦横に縮小した感じではなく、
奥の辺は短く、手前の辺は長く(画面外に出ると思いますが)なるようにしたいです
スクリーン座標からいったん仮にワールド座標を求めてそこで回転させるとかしかないでしょうか?

なにか良い方法があればよろしくお願いします
XYZ軸の回転が全て0の時は画像とスクリーンのピクセルが一対一になるようにしたいです




93 :デフォルトの名無しさん:2010/03/26(金) 07:40:21
>>92
World空間ではなく、View空間まで戻して回転させる

変換行列 = 逆Viewport行列 * 逆Projection行列 * 回転中心まで移動行列 * 回転行列 * 逆回転中心まで移動行列 * Projection行列 * Viewport行列

↑を各頂点に掛ければいい
面倒そうなところは、回転中心まで移動行列だけど、、
これも似たようなプロセスで事前に求めておくしかないかなぁ

94 :デフォルトの名無しさん:2010/03/26(金) 12:12:46
商用ソフトをPIXでデバッグすると何してるか分かるね
結構プロテクトかかってると思うけど

95 :デフォルトの名無しさん:2010/03/26(金) 12:54:20
突然流れと関係ないことを喚く馬鹿っていったい何なんだろう?

96 :デフォルトの名無しさん:2010/03/26(金) 12:59:53
2chに流れもくそもないかと

97 :デフォルトの名無しさん:2010/03/26(金) 13:08:05
しかも質問スレで何言ってんのかと

98 :デフォルトの名無しさん:2010/03/26(金) 13:29:23
directxスレここしかないし

99 :デフォルトの名無しさん:2010/03/26(金) 13:41:47
周りに話す人間がいないから、情報価値がゼロの話でも、
つぶやかずにはいられなかったんだよ。

100 :デフォルトの名無しさん:2010/03/26(金) 22:08:45
GeForce FX 5000系をバックサポートするときに注意すべき点って分かる人いる?
バーテックス/ピクセルシェーダ2.0で動かしてるんだが、
どうもこのその板では動かないっぽいんだが手元にない。

270 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)