【C++】 DirectX初心者質問スレ Part28 【C】at TECH
【C++】 DirectX初心者質問スレ Part28 【C】 - 暇つぶし2ch1:デフォルトの名無しさん
10/03/16 00:16:48
※回答する人も、質問する人も必ず読んでください

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

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

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


2:デフォルトの名無しさん
10/03/16 00:18:12
前スレ
【C++】 DirectX初心者質問スレ Part27 【C】
スレリンク(tech板)

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

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

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

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

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

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

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

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

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

7:3
10/03/17 02:55:50
>>4

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

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

どなたかオーディオインターフェースのマイク入力を
読み込んだ方はいます?
オーディオインターフェースとは こんな感じの製品です
URLリンク(www.kurosawagakki.com)

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

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

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

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

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

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

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

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

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

14:デフォルトの名無しさん
10/03/18 20:50:50
変な質問すみません、
3Dの着せ替えシステムを実装したくて、現在モデルをそれ用に加工しているのですが、
「着せ替え時はメッシュコンテナのポインタを入れ替える事でできる」
と以前お答えを頂いたのですが、スキンメッシュの話で
「ボーン構造と頂点数が同じじゃないと駄目」といった話を聞き不安に…。

つまり、入れ替えるモデルは全て頂点数が同じじゃないと駄目なのでしょうか?
別にそんな事はないのでしょうか?

15:9
10/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:デフォルトの名無しさん
10/03/18 21:41:42
#pragma comment( lib, "d3d9.lib" )

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


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

19:デフォルトの名無しさん
10/03/18 22:19:01
18ですが、↑は自分で調べられそう。いろいろあるんですね。無視してください

20:14
10/03/18 22:55:49
>>17
ありがとうございます。実装次第で大丈夫なんですね。
知らない仕様かと思いあせってました。感謝っ

21:9
10/03/18 23:05:54
解決しようと色々いじってたら
環境が変になった

DirectX SDKから落しなおしてきます

22:9
10/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をアップ予定
URLリンク(www.clootie.ru)
・BCC Developerのデフォルトライブラリ先・インクルード先設定を修正
・コンパイル→メイクで問題なく実行ファイル生成し、動作も問題ありませんでした

質問に答えてくださった数名の方ありがとうございました
後日、変換に関してとDirectX 9.0 SDK Update (April 2007)に変更後に関して記述します

23:デフォルトの名無しさん
10/03/19 05:38:51
>>14
アニメーションは同じままってことだよね?
その場合、ボーンは同じじゃないと、アニメーション時に破綻しちゃうのでは?
さすがに頂点数は違っても、スキン情報もちゃんと連動して変更すれば大丈夫だと思う。

24:デフォルトの名無しさん
10/03/19 14:45:30
スキンメッシュにシェーダーをかけたいんですが
これはスキンメッシュの各部分に普通のシェーダーをかけるようにすればいいのけ?

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

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

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

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

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

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

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




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

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

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









29:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/21 00:36:01
デバイスロストについての質問です
デバイスロストが起こった場合、
発生前に使っていたリソース(D3DPOOL_MANAGEDが使えないもの)を再構築しなければならない とのことなのですが

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

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

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


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

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

33:デフォルトの名無しさん
10/03/21 02:02:09
D3DXVec3Unprojectいらんだろ。頂点をD3DXVec3Projectで画面座標に変換しろよ。

34:9
10/03/21 22:46:05
遅くなりましたが報告

*.lib → *.dllの変換は不可
DirectX 9.0 SDK Update (April 2007)に換えてみたが
今の所問題はなさそう

以上、 名無しに戻ります

35:29
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/22 08:24:32
右手座標系のデータを読み込んでスキニングしようとしたんですけど
うまくアニメーションされません。スキニングしない場合は正常に表示されます。

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

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

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

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

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

42:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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
10/03/23 11:00:13
URLリンク(www1.axfc.net)

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

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

47:デフォルトの名無しさん
10/03/23 13:35:05
>>45
URLリンク(msdn.microsoft.com)(VS.85).aspx


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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

65:デフォルトの名無しさん
10/03/24 02:40:48
>>53
ありがとうございます!
なるほど・・・イメージが沸いてきました
この考え方で試行錯誤してみますっ

66:65
10/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:デフォルトの名無しさん
10/03/24 09:28:15
>>66
念のため言っておくが、デストラクタにvirtualつけ忘れてんぞ

68:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/24 10:01:56
ああすまんs_listがprotectedなのは分かった

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

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

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

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

余計なお世話でしたね

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

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

74:デフォルトの名無しさん
10/03/24 11:15:49
だめ。
URLリンク(marupeke296.com)

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

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

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


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

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

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

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

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

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

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

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

79:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/25 00:50:36
ご指摘のあったポイントを参考に修正しました

URLリンク(down11.ddo.jp)
パスはaaaa

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

101:デフォルトの名無しさん
10/03/26 22:31:40
バックサポートってなに?
バックスタブみたいなもん?

102:デフォルトの名無しさん
10/03/26 22:35:08
>>101
後方互換性を維持するためのサポート。
新しい工業製品が旧世代での古い機能を満たすように考慮すること。

103:デフォルトの名無しさん
10/03/27 00:34:49
>>100
ドライバ最新は当り前じゃね?

104:デフォルトの名無しさん
10/03/27 00:45:19
103と5000系動作を保証することの関係性が分からない

105:デフォルトの名無しさん
10/03/27 01:52:52
GeForce FXというとこれを思い出す
URLリンク(www.youtube.com)

106:デフォルトの名無しさん
10/03/27 01:59:35
今常駐ツールを作っていて、ユーザーがゲームをプレイ中だったらポップアップとか出さずプレイの邪魔をしないようにしたいんだけど
アクティブウィンドウがDirectXゲームか否かを判断する方法ってある?

107:デフォルトの名無しさん
10/03/27 02:05:41
>>106
Direct3D/DirectDrawデバイスをエクスプルーシブモードで
開こうとすると失敗することで判定するw

まあ、最近ときどきある、フルスクリーンもどきな動きをする『ウィンドウモード』のゲームだとだめだけど。

108:デフォルトの名無しさん
10/03/27 02:21:20
>>106
アクティブウインドウがゲームでなくても、邪魔になるようなポップアップは
出すべきじゃないと思う。

109:デフォルトの名無しさん
10/03/27 02:37:21
>>104
ハードとプログラムの受け渡しって何がしてると思う?

ドライバによって、同じ古いグラボでも対応する、しない&動く、動かない機能があるが
動作検証って、グラボと各Verのドライバでするわけ?

ドライバ位は最新を前提にしないと、現実的に動作保証なんてしてられないだろ

110:デフォルトの名無しさん
10/03/27 04:07:33
>>107
ウィンドウモードだとDirectX経由のアプローチで何かしらの情報を得るのは難しいですかね

>>108
普段は必要とされてるけど、ゲーム中は黙ってて欲しい微妙なバランスの物があるのです
ポップアップはその一例で、ユーザーのプライオリティ変化に自動的に追従できる所はしたいと言う話です

111:デフォルトの名無しさん
10/03/27 09:59:02
ついったーくらいあんとですねわかります

112:デフォルトの名無しさん
10/03/27 11:45:49
エロゲーをフルスクリーンでプレイしている時にポップアップしてくる
avastには殺意が沸くが、そういうのを目指してると

113:デフォルトの名無しさん
10/03/27 11:51:13
カメラでプレイ中のプレイヤーの顔をとって判断すればいいんじゃない

114:デフォルトの名無しさん
10/03/27 20:09:31
サーフェイスとレイヤーの違いがわかりません。
どういう不に考えればいいのですか?

115:デフォルトの名無しさん
10/03/27 21:02:09
日本語に訳せばわかるだろ

116:デフォルトの名無しさん
10/03/27 21:26:21
J-POPのユニットとアニメの格好をする人・・・?

117:デフォルトの名無しさん
10/03/27 23:25:28
頂点バッファのリストアについて質問です。
デバイスロストしたら頂点バッファも作り直さないといけないですよね、
その場合もういちどファイルから頂点を読んでいって頂点バッファに書き込みという作業が必要になるんですか?

118:デフォルトの名無しさん
10/03/27 23:29:50
>>117
うん

119:デフォルトの名無しさん
10/03/27 23:36:24
>>118
ありがとう
めんどくさいからD3DPOOL_MANAGEDで作ります

120:デフォルトの名無しさん
10/03/30 00:55:10
int許容値までの高速ftoaって需要ある?
とりあえず貼ってみるけど
URLリンク(asd.if.land.to)

121:デフォルトの名無しさん
10/03/30 16:26:31
>>119
D3DPOOL_MANAGEDが使えるものは全てそれでいい。
俺らが小手先使うより、MSのプログラマが作ったもののほうが優秀だからな


122:デフォルトの名無しさん
10/03/30 17:28:10
昨日
URLリンク(msdn.microsoft.com)
↑でchm形式DirectX SDK(August 2009)のドキュメント日本語版がダウンロード出来るようになったけど
開くといろいろおかしい、左側のパネル部分がキーワード検索しかないうえに、その検索もうまくいってない
これ他の人はどうだろう?

123:デフォルトの名無しさん
10/03/30 18:04:22
>>122
俺も同じだ

124:デフォルトの名無しさん
10/03/30 21:02:24
>>122
んじゃ俺も同じで

125:デフォルトの名無しさん
10/03/30 21:06:16
>>122
ブロック解除ってやったら表示されたわ
URLリンク(www.nishishi.com)

126:デフォルトの名無しさん
10/03/30 21:23:44
>>122
俺もブロック解除ってやったら表示されたわ

127:デフォルトの名無しさん
10/03/30 22:16:44
お、おれもおれもー

128:デフォルトの名無しさん
10/03/30 22:28:28
おれもいれてー

129:デフォルトの名無しさん
10/03/30 22:43:34
みんなDXUT使ってる?

130:デフォルトの名無しさん
10/03/30 23:13:10
(;´Д`)

131:デフォルトの名無しさん
10/03/30 23:15:25
>>125
右のページはブロック解除すれば表示されるけど、
左側は>>122の言うとおりキーワード検索(機能しない)しか出なくない?

132:122
10/03/31 00:27:14
>>131
そうなんだ、今までのDirectX SDKのマニュアルでは、左側は目次と検索、キーワードなんかがあったけど
今回のは検索しかない、しかも機能がちゃんと動いていない。
検索すると、検索結果に「無題」(たぶん検索語句が含まれるページのタイトル)がいくつかリストアップされる
だけどそのページに移動出来ない。

133:デフォルトの名無しさん
10/03/31 00:28:26
>>132
まあどうでもいいけどね

134:デフォルトの名無しさん
10/03/31 00:38:44
川西さん頑張って!!!

135:デフォルトの名無しさん
10/03/31 01:36:43
ちょっとわからないので質問させてもらいます。
今スロットゲーム的なものを作ってる途中なのですが
流れとしては

『ランダムにスロットに画像表示

キーが押されたら画像がそろっているかの確認処理

そろっていたらその画像に応じて所持コイン増加

はずれだとコイン1枚減少』

のようにしているのですが
コインの増減処理のとき
なぜか2回処理されて(コイン1枚減少が2回行われる
しまいます。
WaitTimerが関連してるような気がして調べてみたものの
わかりません。

↓ソースです。初心者なので汚かったりするかとおもいます
URLリンク(uproda.2ch-library.com)

136:デフォルトの名無しさん
10/03/31 02:02:19
コインを0.5枚減らすようにすればいいのさ

137:デフォルトの名無しさん
10/03/31 02:07:15
L88のcountを立てる為の条件式は
キーが押されている限りtrueになる。
trueのフローの中にコイン減処理が入っているから、
キーが押されている限り、コインが減っていくんじゃないの?

138:デフォルトの名無しさん
10/03/31 02:31:13
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中もキー入力は受け付けるみたいです。
別の方法を考えています

139:デフォルトの名無しさん
10/03/31 03:41:31
まぁ、そのなんだ。その質問は完全にスレ違いだ。

DxLibはDxLibであって、DirectXではない。
gamedevに「DXライブラリ総合スレッド」ってのがあるから、
そっちでも行ってくれ。

140:デフォルトの名無しさん
10/03/31 09:19:32
つーかロジックの問題だろ

141:デフォルトの名無しさん
10/03/31 11:24:18
>>138
そりゃ、その変更じゃ何も変わっていないんだから
結果も当然変わらん。
whileループ1回目でL45のkeyに値が入ってから、
whileループ2回目で改めてkeyに値を入れるまでの時間は殆ど同じだ。
それが原因。対応法としてはL45をL87に移動することだが、
もっと根本的にコードを見直した方が良いと思う。
以上スレチ失礼。

142:デフォルトの名無しさん
10/03/31 23:00:32
アルファチャンネルのある画像Aから画像Bにフェードインさせたいのですが、どうすればいいのでしょうか?
アルファチャンネルが無い画像(四角い画像)なら、BをAの上に頂点色も適用しつつ上書き描画すればいいだけなんですが。
Aをアルファ25%、Bをアルファ75%にすればいいやと最初思いましたが、
それだと背景の色が出てしまい出来ないことに気づきました・・。

シェーダーを使うと古いビデオカードでは動きませんし、テクスチャの内容を書き換えるのも重いようなので避けたいです。
800x600の画像を1024x512のテクスチャの左上に置いているのですが、1fpsになってしまいます。

143:デフォルトの名無しさん
10/03/31 23:10:28
>>142
URLリンク(platz.jp)
ここで書いてあることとは別なのかな。
基本的に1枚は不透明で描画しておき、フェードイン/アウトを行うものをその上で描画させる。
別にアルファ云々は関係ないはずなんだけど。

144:デフォルトの名無しさん
10/03/31 23:19:44
シェーダも使えないような古いグラボの人は、PCでゲームを買って遊ぶ習慣のない人であり、
顧客になりそうもない人。商売なら相手にする価値が無い。

たぶん趣味の自作ライブラリを鍛えたいという用途だと思うが、だったら
全部ソフトウェアで処理すればいいと思うよ。いまどきのCPUなら
エロゲーの凝ったフェードイン・アウトくらいできちゃうよ。

145:142
10/03/31 23:20:25
>>143
全く同じ形状をしている画像同士なら、それで出来ると思います。
そうではなく、2枚の画像は異なった形状をしていて、
「画像Aをフェードアウトさせつつ画像Bをフェードイン」させたいんです。

146:146
10/03/31 23:29:42
>>144
すいません、レスついてたの気がつきませんでした。

じゃあシェーダーを使って処理するようにしようと思います。
よく考えたら、
自作ライブラリではなくオープンソースのを少し改変して使ってるので
他にOpenGLとソフトウェアのレンダリングエンジンがありました。
スペック低いPCの場合はそっち使ってもらえばいいですね。

RTTが使えるなら
常にレンダーターゲットのテクスチャに画面描画を行っておいて、
それをもとにフェードインすればいいかもしれません。
(でもそこまでしないで素直にシェーダー使った方が楽か)

147:デフォルトの名無しさん
10/03/31 23:32:39

フェードインアウトしている間、画像Aのα+画像Bのα=1を維持して
下の背景を透けさせないようにしたいのか?

148:142
10/03/31 23:35:49
>>147
その通りなんですが、何かいい方法があるんでしょうか

149:デフォルトの名無しさん
10/03/31 23:38:58
Direct3Dを使ったエロゲで、目パチ口パクでアニメがフェードしながら切り替わってるだろ。
あれはテクスチャをロックして、直接書き換えてるんだが。
その方が2枚のテクスチャを重ねて頑張ろうとするより簡単。

150:デフォルトの名無しさん
10/03/31 23:39:33
>>148
片方のアルファ値の減少量を
もう片方の画像の増加量にする

151:デフォルトの名無しさん
10/03/31 23:43:55
画像Aと画像Bをマルチテクスチャブレンディングで合成すりゃいいんでないか?

152:デフォルトの名無しさん
10/03/31 23:45:02
よくよく考えてみると>>142は結構難しい問題かもな

153:デフォルトの名無しさん
10/03/31 23:51:35
つーかロジックの問題だろ

154:デフォルトの名無しさん
10/03/31 23:54:06
何をしたいのかよくわからんが
>>150 で出来るだろ

155:デフォルトの名無しさん
10/04/01 00:03:33
馬鹿は黙っててください

156:デフォルトの名無しさん
10/04/01 00:59:05
>>154
よくわからないのなら、静観していなさい
よいですね?

157:デフォルトの名無しさん
10/04/01 01:01:24
もしかしてマルチテクスチャで出来る?
ステージ0
左 D3DTA_DIFFUSE
右 D3DTA_TEXTURE
COLOR D3DTOP_MODULATE
ALPHA D3DTOP_MODULATE

ステージ1
左 D3DTA_TEXTURE
右 D3DTA_CURRENT
COLOR D3DTOP_BLENDTEXTUREALPHA
ALPHA D3DTOP_BLENDTEXTUREALPHA


158:デフォルトの名無しさん
10/04/01 01:02:00
うん

159:デフォルトの名無しさん
10/04/01 01:55:12
142は
たとえば、テクスチャABで同じ色の場所の場合
ブレンド値が変化しても
A*a + B*(1-a) = A(=B)
になるようにしたいんでは?

それだと157だとできなくない?
シェーダー使うかロックするしかないのでは?


160:デフォルトの名無しさん
10/04/01 02:16:06
>>142の「背景の色が出てしまい」ってところがキモだな。

勝手に意訳すると、AとBはそれぞれ異なる形状でアルファ抜きされているが、
AとBが両方とも不透明な領域ではAからBへのブレンド中に背景を一切透過させたくない、
という要望のようだ。

これは少々トリッキーな処理が必要な気がする。

161:デフォルトの名無しさん
10/04/01 07:55:00
>>160
そもそも何をやりたいのかがいまいち分からん

単純に背景透過させたくないなら、背景の描画を最後にするって方法もある

162:デフォルトの名無しさん
10/04/01 08:04:21
テクスチャのフォーマット変えたり、マスク用意したり、
アルファテスト、ステンシルテストとかでどうにかできないのかな

使用してる画像や書いたコードどんなんだろ

163:デフォルトの名無しさん
10/04/01 08:51:35
別の形状をしているものの
重なってる部分の背景を出したくないとして
じゃあ、重なって無い部分はどいうしたいんだ?
背景が透けてていいのか?

164:デフォルトの名無しさん
10/04/01 08:54:50
背景の見えないフェードっつーのがさっぱり理解不能なんだが
裏が透けないフェードなんて存在し得ないだろ

つーかフェード中にABが重なる部分の背景を白抜きすりゃいいだけの話だろ
難しく考えすぎなんだよ

165:デフォルトの名無しさん
10/04/01 08:57:56
>>163
そこは透けていいんじゃないかね。
重なってない部分はブレンド値の変化とともに「A→背景」または「背景→B」と変化し、
重なっている部分だけは背景を混入させずに「A→B」と変化させたいのではなかろうか。

166:デフォルトの名無しさん
10/04/01 09:42:58
片方の画像が不透明なら不透明画像を後からブレンドすればいいんでない?
完全に正しい結果が欲しいならシェーダー使うしかない希ガス

167:デフォルトの名無しさん
10/04/01 09:46:25
ちなみにAとBのαの変化はどこでやってるんだろう?
頂点カラー?
それともロックして書き換えてるんの?
それによっても違うと思うんだが

168:デフォルトの名無しさん
10/04/01 13:00:36
シェーダー書けば一発な気がするけど
固定機能で一応考えて見た
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のα値を加算する)

出来あがったテクスチャを通常描画する
で、どうよ?

169:デフォルトの名無しさん
10/04/01 14:37:28
本当にシェーダーでやれって感じだな

しかし実際問題重なってる部分は透過させないって必須なのか?
クロスフェードにそんなに何秒もかける訳ないし
実際動かして見たら透けててもそんなに気にならんと思うのだが…
背景の後ろでフレーム外の仕事しててユーザーには見せられないとか?

170:デフォルトの名無しさん
10/04/01 16:58:55
本人が>>146でシェーダーでやりますって言ってんだからもういいんじゃね

171:デフォルトの名無しさん
10/04/01 17:37:46
ごめんなさいスルーしてました

172:デフォルトの名無しさん
10/04/02 01:01:28
スペキュラ色付けた後にアルファブレンドすると光にまでアルファかかっちゃうんですけど
どうしたらよいでしょうかね、、、

173:デフォルトの名無しさん
10/04/02 01:05:08
>>146
- AxorB 領域にAとBをアルファ描画
- AandB 領域にAを不透明描画
- AandB 領域にBをアルファ描画
かしら。
マスク処理はステンシルか、Zバッファで代用ね。

174:デフォルトの名無しさん
10/04/02 01:17:13
>>146
シェーダーでやる方法って具体的にどうやるんですか?
気になります
わかる方いれば教えてください


175:デフォルトの名無しさん
10/04/02 01:56:29
それは四則演算がどうたらこうたらのレベルになるんじゃないか?

176:デフォルトの名無しさん
10/04/02 08:14:56
>>174
AのテクスチャとBのテクスチャの両方のアルファ値が0.0より大きい場合にアルファ値の出力を1.0にするだけ。
あとは普通に合成しちゃえばいい。

177:デフォルトの名無しさん
10/04/02 13:13:38
ふと思ったが、AとBのポリゴン(四角形)自体はまったく同一なのだろうか。
>>142にはそういう条件は書かれていないが。

ポリゴンが一致してるなら、シェーダで2つのテクスチャに同時にアクセスして
>>176のような感じで処理すればできそうだね。
AとBのテクスチャ素材のアルファ抜きにアンチエイリアスが入っていたりする場合は
もう少しロジックを工夫する必要がありそうだけど。

178:デフォルトの名無しさん
10/04/02 13:48:46
>>177
>>145

179:デフォルトの名無しさん
10/04/02 13:51:53
>>178
>>145はアルファ抜きの形状が異なるって意味じゃないの?
ポリゴンの頂点位置まで異なるとは言っていない気がする。

180:デフォルトの名無しさん
10/04/02 13:57:45
もういいじゃん
本人いないんだし

181:デフォルトの名無しさん
10/04/02 14:15:39
固定機能にしろシェーダーにしろ
合成用のレンダリングターゲットは必須じゃね?
そこを省こうとするから面倒なだけで

182:デフォルトの名無しさん
10/04/02 14:23:43
142帰ってきて!!!!!

183:デフォルトの名無しさん
10/04/02 17:01:48
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


184:デフォルトの名無しさん
10/04/02 20:00:07
16進数の羅列で考える気が失せた

185:デフォルトの名無しさん
10/04/03 14:35:35
>>183
Windowsに強く依存するDirectX開発でgccを使うなんてマゾとしか思えん。
ただで済ませたいならVisual Studio 2008 Express Editionに必要なSDKを加えて開発するのが正道。
ソースコードが間違っているのか開発環境に誤りがあるのか判断ができないのでは答えようがない。

186:デフォルトの名無しさん
10/04/03 18:28:35
183です。アク禁の巻き添え食らったので、代行してもらってます。

とりあえず、画面の切り替えに成功したので(たまに失敗するけど)報告
WndProcでAlt+Enterを拾って、
BOOL state;
g_pSwapChain->GetFullscreenState(&state, NULL);
g_pSwapChain->SetFullscreenState(!state, NULL);
return 0;
を実行したらうまくいった。
たまに失敗するのは、これはたぶんDXGIの画面切り替えが始まってから
一定時間内にstateの変更を実行できなかったときだと思う。


187:デフォルトの名無しさん
10/04/03 18:38:12
>>186
DX11ではなくDX9の話だが、
Firefox3.6以降が別に起動している時にフルスクリーン表示に切り替えようとすると失敗する場合があるな。
フルスクリーン表示へのリセットに失敗するのではなく、
そのすぐ後にアプリケーションのフォーカスが失われてしまう。

Firefoxを閉じるとすぐになおる。

188:デフォルトの名無しさん
10/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に指定しているし、マテリアルに設定した色ではなく、
真っ白になってしまうのが納得いきません。何故真っ白になるのでしょうか?

189:デフォルトの名無しさん
10/04/04 00:24:40
>>188
とりあえずサンプルのMeshesの
Tiger.xと差し替えてみて表示されるかどうか確かめて見たら?


前に似たような質問で
マテリアルカラーじゃなくて
頂点カラーが頂点フォーマットに含まれててそっちと乗算されてたとかあったな

190:デフォルトの名無しさん
10/04/04 00:35:56
>>188
それじゃあ、Xファイルに問題があるのか
プログラムに問題があるのか分からないから
xファイルかソースをうp

191:デフォルトの名無しさん
10/04/04 00:46:43
>>189
Tigerを表示してみたところ、全く正常に表示されました・・・
が、そもそもTigerはテクスチャを張っているので、マテリアルカラーは関係ないような気がしますが、
一応表示処理はマテリアルカラーを除けば正常だと思います。

>>190
すいません。エロエロなのでアップ出来ません。

192:デフォルトの名無しさん
10/04/04 00:56:42
乳首等をカットしてうpしてください

193:デフォルトの名無しさん
10/04/04 01:02:05
>>191
じゃなくて
Meshesの方で問題のXファイルを表示してみたら、というハナシ

194:デフォルトの名無しさん
10/04/04 01:26:33
>>193
試してみました。ちゃんと肌色や黒やピンクで表示されています。

195:188
10/04/04 01:59:28
解決しました。

D3DRS_LIGHTINGをFALSEにしていた部分をコメントアウトし、
D3DRS_AMBIENTを0xffffffffにしたらサンプルと同じ表示になりました。

D3DRS_LIGHTINGをFALSEにした状態でD3DRS_AMBIENTをいじらなくても、
直接頂点を頂点バッファに入れてDrawIndexedPrimitiveする時には正常に頂点色で表示されていたので、
同じ感覚でやれるはずだと思い込んでいました。

メッシュのdrawsubsetだけは仕様が違うということでしょうか?

196:デフォルトの名無しさん
10/04/04 02:00:35
D3DRS_LIGHTINGを切ったら真っ白になるのは当然じゃ?
ライトをセットしないのとライティングを切るのはまったく違うことだぞ

197:デフォルトの名無しさん
10/04/04 02:06:51
>>195
頂点カラーとマテリアルカラーはまったく違う
頂点カラーはその名の通り頂点の色
マテリアルカラーは光を何色で反射するかの設定

xファイルの場合
頂点カラーがデータに含まれてない場合
デフォルトの頂点色0xffffffffで動作するので
ライト切ったら白のまま

198:デフォルトの名無しさん
10/04/04 02:11:20
>>195
まー使えるAPIがそろってるD3DXもD3DXMesh系だけは自作するって話をよく聞くからなぁ。

とりあえずPIX for WindowsでD3DXMeshの挙動を調べることをおすすめする。

199:188
10/04/04 02:15:14
>>197
分かりやすい説明有難うございます。納得しました。

>>196
>>198
色々なアドバイス有難うございました。
PIX for Windowsについてもググってみます。

200:デフォルトの名無しさん
10/04/04 07:56:18
よりスケベな絵になるようがんばってくれ!

201:デフォルトの名無しさん
10/04/05 16:31:53
質問です。
自分はC/C++でWin32APIを使ったコーディングはそこそこ慣れていて
たまに自分用のソフトを作ったりもするのですがDirectXはまったく初めてです。

とりあえず書籍やググって見つかるサイトなどを参考にテストコードを書いてみたのですが、
BeginScene がFAILEDになってしまい、描画処理が開始出来ません。

この BeginScene、失敗する条件ってなんなんでしょうか。よろしくお願い致します。
環境:WinXPSP3、DirectXSDK Ver9.0c



202:デフォルトの名無しさん
10/04/05 16:37:45
EndSceneを呼ぶ前にBeginSceneを再コールしたとかでもないかぎり失敗はしないと思うが…

203:デフォルトの名無しさん
10/04/05 16:37:54
>>201
device->Present(...)との対応ができていないというのが考えられる。
それから、DirectX初心者ならいきなりコードを書き始めない方がいいよ。
DirectX SDKにサンプルが山ほどあるので、
とりあえず簡単そうなものからビルドして動かして眺めてみるといい。

204:デフォルトの名無しさん
10/04/05 16:41:48
超凡ミスの予感
ソースうp

205:デフォルトの名無しさん
10/04/05 18:37:45
初心者にありがちで
勝手に失敗箇所をBeginSceneに限定ちゃってるだけで
実は全然違うところでミスしてそう

206:デフォルトの名無しさん
10/04/05 18:47:06
まずDeviceがちゃんと作れてるかが気になるなぁ。


207:201
10/04/05 21:13:06
いま帰宅しました。そしていきなり解決しました。
すみません、お察しの通り超凡ミスでした・・・ww

原因は、ウィンドプロシージャ内、WM_SIZE で IDirect3DDevice9 の Reset を実行し、
さらにそこで InvalidateRect 。レンダ処理を WM_PAINT においていた為でした。 ※実行順序
お騒がせしました。

>>205
いえ BeginSceneの結果がFAILEDになっていた事は確認済みで、その理由が不明だったのです。
最初、WM_PAINT にレンダ処理を置いていたのも重ねてミスでした。※現状はメインループ内に移動

お騒がせしました。


208:142
10/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で描画することになるのでは?

209:デフォルトの名無しさん
10/04/06 00:25:04
>>208
3Dの世界はな、光も陰もアルファも、みんなバラバラに指定するんだ。
シェーダー関数の中だけ見てたって正しいコードは書けないぞ。

210:デフォルトの名無しさん
10/04/06 00:25:19
>>208
なにがしたいのかいまいちわからないから、Aだけ、Bだけ、フェード中、の3つの画像とか示せない?

211:デフォルトの名無しさん
10/04/06 01:00:09
>>208
ソースうp

212:デフォルトの名無しさん
10/04/06 01:03:40
>>208
168じゃなけど
D3DBLEND_ONEは係数1.0の意味だからα*1.0だぞ
なんかブレンドの仕組みを理解してない予感

213:デフォルトの名無しさん
10/04/06 01:52:57
>>208
.xyzに関してはlerpでいいけど
.w(α値)は加算するかどちらか片方が0以上なら1.0にするとしないとだめなんじゃ?

214:デフォルトの名無しさん
10/04/06 06:20:11
テクスチャのA32R32G32B32Fのフォーマットについて質問なのですが
書き込んだ値が勝手が0~1にクランプされます なぜでしょうか

215:デフォルトの名無しさん
10/04/06 06:25:14
>>214
カラーテクスチャはそういうシロモノだから。

216:デフォルトの名無しさん
10/04/06 06:29:05
>>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とかフォーマットによってアルファの解釈に流儀があるんだよね。)

217:デフォルトの名無しさん
10/04/06 06:30:22
>>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)

218:デフォルトの名無しさん
10/04/06 13:53:54
test

219:デフォルトの名無しさん
10/04/06 14:04:47
すみません、現在

URLリンク(rina.jpn.ph)

を参考にDirectXの勉強をしています。
上記ホームページの第4章の画像の描画(テクスチャ・マッピング)の項目あたりなのですが、
例えば20×20ピクセルのbmp画像を横200×縦400の範囲に敷き詰めて表示したい場合
どうすればよいのでしょうか?
InitVertex関数と配列を組み合わせるのかとも思ったのですが、
組み合わせ方がわかりません。
考え方が間違っているのでしょうか?
もしいいやり方があったら教えてください。

220:デフォルトの名無しさん
10/04/06 14:50:20
>>219
やりたいことがイマイチ不明
お前さんの頭の中にはイメージあるんだろうけどそれじゃ伝わらない
とりあえず4章の終わりまで進めてから出直したほうがいいんじゃね?


20×20の画像が任意のものであれば
そのInitVertexを横10×縦20回呼べばいいだけだし

まったく同じ画像の繰り返しでいいなら
テクスチャのアドレッシングモードをD3DTADDRESS_WRAPにして
InitVertex内でtu=1.0とかtv=1.0とかになってるところの値を増やせばいい

221:デフォルトの名無しさん
10/04/06 14:52:00
同じサイトに
URLリンク(rina.jpn.ph)
ってのがあるじゃん
こういうことがやりたいんじゃなくて?

222:デフォルトの名無しさん
10/04/06 15:01:36
>142は
背景+αチャンネル付き立ち絵Aから、背景+αチャンネル付き立ち絵Bへ奇麗にクロスフェードさせたいって事なんでしょ
エロゲの会話シーンみたいな

223:デフォルトの名無しさん
10/04/06 15:03:14
>>215
t-potではA32R32G32B32Fを使って座標を保持しているプログラムがある
自分のプログラムでも少し前に組んだやつだとクランプされてない

224:デフォルトの名無しさん
10/04/06 15:08:07
>>142は自分の言いたいことだけ言って
聞かれてる条件について完全にスルーだからもう放置でいい希ガス
状況が不明すぎて答えられないし
またこのまま1週間放置とかなんじゃね?

225:デフォルトの名無しさん
10/04/06 15:09:00
>>220
>>221

すみません、
20×20の画像を1個としてこれを繰り返して
横10個×縦20個として同じものを並べて表示したいということです。
とりあえずもう少し調べて考えてみます。お手数おかけしました。


226:デフォルトの名無しさん
10/04/06 15:15:40
>>225
基本的にはUV値を0.0~1.0の範囲より広げて指定するだけでいい。
テクスチャの拡張はいろんなパターンがあるから必要な方式を指定してあげること。

227:デフォルトの名無しさん
10/04/06 15:32:08
>>226
ありがとうございます。参考にして考えます。

228:デフォルトの名無しさん
10/04/06 19:26:56
HLSLのサンプラー型で、
「sampler」と「sampler2D」の違いって何なんでしょう??
今まで何となしに「sampler」を使っていた(2Dテクスチャのみ)んですが、
「sampler2D」というものもあることを知って不思議に思いました。
今まで「sampler」だったところを「sampler2D」に変えてみても、特に挙動は変わりませんでした。


229:デフォルトの名無しさん
10/04/06 19:48:40
XNAとの互換用とかじゃね?

230:デフォルトの名無しさん
10/04/06 21:38:18
Sampler1Dというのがあってだな

231:デフォルトの名無しさん
10/04/07 18:53:24
Core2 Duoを使ってるんですが、マルチスレッドのプログラミングは一切していないのに、
CPU使用率は100%近くになります。(1コアだけ使用のプログラムはだいたい50%)
これはDirectXのライブラリ内でマルチコアを考慮した動作をしてくれてるからでしょうか?
コア数が多いほど性能は上がる傾向にあるのでしょうか?

232:デフォルトの名無しさん
10/04/07 19:06:54
>>231
ビジーループしてるだけのような予感。

233:デフォルトの名無しさん
10/04/08 00:21:25
>>231
Sleep

234:デフォルトの名無しさん
10/04/08 14:16:20
オープンソースでフリーのゲーム開発してるのですが。
URLリンク(sourceforge.jp)

自分こないだ開発リーダー引き継いだばかりで、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) );
}
わからないでしょうか。

235:デフォルトの名無しさん
10/04/08 14:44:06
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)

236:デフォルトの名無しさん
10/04/08 15:26:45
またおまえか
と思ったら別スレでの出来事だった

237:デフォルトの名無しさん
10/04/08 16:21:52
質問です。
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の呼び出しが超遅いとかでしょうか?

238:デフォルトの名無しさん
10/04/08 17:07:50
>>237
メッシュが複数あるとき使わないボーンもあるからじゃないの?

239:デフォルトの名無しさん
10/04/08 17:29:07
>>235 がそのエラーメッセージなら、多分単にメッセージに書かれている通りだと思うんですけど。
意味がわかりませんか。

DirectXったってただの関数、ただのAPIですから、メッセージをヒントに
いつも開発してる時のように追いかけたら。


240:デフォルトの名無しさん
10/04/08 17:53:05
>>238
レスありがとうございます
ただ、ちょっとご指摘の内容が理解できないのですが…。
すいません。

複数メッシュ時の挙動は、今ちょうどやっているところですが、やはりメッシュ毎にpMeshContainer(の中身)が生成されるため、
pMeshContainer->pSkinInfo->GetBoneOffsetMatrixを必要になるたびに呼べばよさそうな感じです

241:234
10/04/08 19:45:48
>>235 >>239
ありがとうございます
DebugPrint使って値を追いかけてみます

242:デフォルトの名無しさん
10/04/09 00:23:32
エフェクトオブジェクトって描画オブジェクトごとに作っても
そんなにコストかからないですか?1つを使いまわしていちいちSetValue()するのもアレかと思いまして。。。

243:デフォルトの名無しさん
10/04/09 02:48:47
大量のキャラが出るゲームでなければ体感差はでないから
それが無駄や面倒臭くないというならやればいいじゃない。
普通は用途で分けるだろ。キャラ用・地形用・ポストエフェクト用・ビルボード用・etc

244:デフォルトの名無しさん
10/04/09 08:56:28
エフェクトの定数セットは比較的軽い処理だがエフェクト切り替えは重いという事だけは言っておこう

245:デフォルトの名無しさん
10/04/09 14:06:32
すみません質問です。
CDXUTXFileMesh というクラスがどこにあるか、どなたかご存知の方はいらっしゃいますでしょうか

この名前でググった所、多分 DirectX SDK (Novenber 2008) 内にある DXUT 関連だろうという所まではたどり着いたのですが、
これが宣言されているヘッダや lib などが見つかりません。 よろしくお願い致します


246:245
10/04/09 14:18:06
すみません、解決しました。

場所: ※デフォルトのパスでインストールした場合
C:\Program Files\Microsoft DirectX SDK (November 2008)\Samples\C++\DXUT\Optional

ここにある SDKMesh.h / SDKMesh.cpp


247:デフォルトの名無しさん
10/04/09 14:25:13
>>243
>>244
ありがとうございます。
定数セットは比較的軽いんですか、知りませんでした

248:デフォルトの名無しさん
10/04/09 14:49:41
だめだ、DirectX9+Bullet2.76 でサンプルをコンパイルしようとするとどうやっても通らない詰んだ

やった事:
URLリンク(www.shader.jp)
ここにあるサンプルを頂いて 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にあった対策をしてみた所、 URLリンク(msdn.microsoft.com)(VS.80).aspx
今度は Bulletのlib側で acos などが未定義と、700件以上のエラーが出て死亡。

これはもう、あのサンプルはコンパイル出来ないので諦めろ、という事でしょうか

249:デフォルトの名無しさん
10/04/09 14:54:13
>>248
URLリンク(sourceforge.jp)


250:デフォルトの名無しさん
10/04/09 17:12:12
>>248 それ、俺も通らなかったけど、実はBullet公式じゃなくて、
統合3DCGソフトBlenderに含まれているBullet2をリンクしたら出来たぜ

URLリンク(svn.blender.org)
これをチェックアウトしてビルドして、

build\msvc_9\libs\extern\mtdll\debug\Bullet.lib
これをリンカに通し、

Blender25\extern\bullet2\src
これをincludeパスに足せばいける。 2.76 だと確かに内容も変わっているし、2.67 だと一部のファイルが無かったと思うが、
そもそもそのサイトの人は BlenderのMonkeyモデルをデモに使ってるくらいだからもしや・・・と思ったらビンゴだった。
なんか色々やってたのかもな。 とりあえず、乙




251:デフォルトの名無しさん
10/04/09 17:17:59
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個の描画をするととんでもなく遅くなってしまったので、
ステートの設定を最小限にしたいと思って試したのですが、望む結果が得られませんでした。

252:デフォルトの名無しさん
10/04/09 17:23:05
D3DFVF_XYZRHW は座標変換済み=投影後(つまり2D状態)だから、Z値とか意味無くなるんじゃなかったっけ?
D3DFVF_XYZ じゃないとダメというか、意味無いような


253:デフォルトの名無しさん
10/04/09 17:24:14
URLリンク(msdn.microsoft.com)

254:デフォルトの名無しさん
10/04/09 17:49:25
>>252
トランスフォーム後にZテストしてラスタライズしているのではないのでしょうか?

255:デフォルトの名無しさん
10/04/09 18:14:33
>>251
そもそもZバッファ作ってる?
D3DRS_ZENABLE、D3DRS_ZWRITEENABLE、D3DRS_ZFUNCはどう設定している?
rhwの値をどう設定している?

252はトンチンカンなこと言ってるので無視でいい。

256:デフォルトの名無しさん
10/04/09 18:15:42
>>251
正直ステートを多少減らしたぐらいじゃそんなに変わらないと思う
その200個のUIを一つの頂点バッファにまとめて一回で描画するとか
別のアプローチを考えた方が建設的かと

257:デフォルトの名無しさん
10/04/09 18:27:46
>>251
>m_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

D3DCLEAR_ZBUFFERのフラグが抜けてる

258:デフォルトの名無しさん
10/04/09 18:41:50
>>255-257
ありがとうございました。

原因は
>D3DCLEAR_ZBUFFER

でした。

そして、>>256
実は、UI要素の描画を1000アイテムにしても大して速度低下がなかったので、遅いのはほかに原因がありそうでした。
WM_PAINTでクライアント全アイテムを再描画しているのですが、
リサイズがものすごく遅かったので、描画が遅いものだと勝手に判断してしまっていました。

259:デフォルトの名無しさん
10/04/09 19:27:49
>WM_PAINTでクライアント全アイテムを再描画
ココが問題

260:デフォルトの名無しさん
10/04/10 22:07:45
URLリンク(marupeke296.com)
↑のソースを使ってDirectSoundで音を鳴らしています
ウィンドウを閉じた時点でたまーに

STOP: 0x000000CB
kmixer.sys

などとブルースクリーンが出ますが、なにが原因でしょうか?
鳴らしてるwavファイルはPCM signed 16bitモノラルで統一してます

261:デフォルトの名無しさん
10/04/10 22:10:25
サウンドドライバが腐ってる

262:260
10/04/10 22:14:01
プログラムのミスでこのエラーはありえないですか?

263:デフォルトの名無しさん
10/04/10 22:18:41
ありえるだろそりゃ

264:デフォルトの名無しさん
10/04/10 22:30:30
ドライバがロックしたメモリページを開放し忘れたってエラーでアプリケーションが何をしろってんだよ

265:デフォルトの名無しさん
10/04/10 22:36:56
いくら解説が豊富だといってもDirectSoundはレガシーです。とくに初心者は問題を解決しようとするより別の手段を探してください。
をFAQにしてくれ

266:デフォルトの名無しさん
10/04/10 22:50:10
>>260
こういう話ですか?
URLリンク(support.microsoft.com)

267:デフォルトの名無しさん
10/04/11 16:09:39
2Dビルボード処理を関数ごとに分けてやっているんだが、
なぜか呼び出す行を変えたり、引数を持たせただけで変な方向に動いてしまう
これってナニが悪いの?

268:デフォルトの名無しさん
10/04/11 16:13:50
たぶん糞設計が悪い。どう悪いかはソースがうpされない以上、他人には分からないので自分を責めてください。

269:デフォルトの名無しさん
10/04/11 16:17:07
>>267
エスパーしてみると
多分、行列計算を理解出来てないと見た

270:デフォルトの名無しさん
10/04/11 16:28:28
>>268
ソースなんて見るまでもないだろ。
呼び出す行を変えたり、とある辺りでほぼ >>269 のエスパー内容で確定
もう一度数学Bからやりなおせば解決


271:デフォルトの名無しさん
10/04/11 17:15:22
よっぽど鈍な子でもない限り計算間違いでそんな動作しないだろ
固定機能でやってて行列のセットの仕方になにか誤解があるんじゃね?

272:デフォルトの名無しさん
10/04/11 19:24:48
>固定機能でやってて行列のセットの仕方になにか誤解

行列は理解してるが、関数仕様が分ってないレベルなら
行列のセットの仕方が間違ってると気が付くのが道理では?

それを気がつけないのを、行列を理解出来てないと言うのでは?

世の中にはよっぽど鈍な子の、遥か斜め上を行く子がいっぱい居るのが現実ですよ

273:デフォルトの名無しさん
10/04/11 21:05:18
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が返ります。テストのためにデバイスを生成して、上記のコードだけを実行するようにしても同じ現象が再現します。
レベルの制限の様な気もしますが、それについて書かれている資料を見つけられません。
レベル毎の制限についてのドキュメントか、何か情報があれば教えてください。

274:デフォルトの名無しさん
10/04/11 22:43:04
dx11知らんけどCreateRasterizerStateでググったら
DepthClipEnable must be TRUE.とかなんとか

275:デフォルトの名無しさん
10/04/12 00:40:17
ありがとうございます。DepthClipEnable = TRUE で一応はS_OKになりました。
10Level9 ID3D11Device Methods
10Level9 ID3D11DeviceContext Methods
そのまんま制限仕様が書かれてますね orz

276:デフォルトの名無しさん
10/04/12 03:15:12
質問です。現在 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
10/04/12 03:15:56
すみません、誤爆しました。


278:デフォルトの名無しさん
10/04/12 16:57:27
>>277
コンストラクタでNULL突っ込めばなおるよ。

                      ハ_ハ  
               ('( ゚д゚∩ なおるよ!
                ヽ  〈 
                 ヽヽ_)



279:デフォルトの名無しさん
10/04/12 18:40:24
DXTC圧縮されたDDSファイルはどのタイミングで解凍されるのでしょうか?

A:ホストプログラム側でCreateTexture系関数で読み出したとき
B:VRAM上ではまだ圧縮状態で、圧縮のブロック単位でGPUのキャッシュまでロードし、 GPUで解凍しながら処理する


280:デフォルトの名無しさん
10/04/12 21:09:16
>>279
基本的にB

281:279
10/04/12 21:39:47
>>280
おお。
すると、メモリ帯域的にだいぶ負荷が下がりますね。
解凍にかかる負荷以上に、ボトルネックになりがちなメモリアクセス量を少なくできることによる
速度改善が期待できそうですね。
使用テクスチャの圧縮は積極的に行っていこうと思います。
ありがとうございました。

282:デフォルトの名無しさん
10/04/12 22:07:18
でもアルファチャンネル付きの画像でアンチエイリアスとかかかってる部分が
DXT3にしてもDXT5にしてもあんまり綺麗に出ないよね
細部が良く見えないところはどんどん圧縮しちゃってもいいと思うが

283:279
10/04/12 22:15:08
>>282
なるほど・・・
DX11では新しい圧縮がサポートされて、品質がだいぶ改善されるようですね。
DX11が浸透するまでは、ご助言通り、使いどころに注意ですね。

284:デフォルトの名無しさん
10/04/12 23:43:26
D3DXCreateTextureFromFileExでは、読み込む画像のサイズとは異なるサイズで読み込むことができますが、
これを利用して、ユーザーの環境に合わせて読み込む画像サイズを変え、負荷を調整する
といったことは効果的なのでしょうか?
例えば、テクスチャファイルは高解像度のものを1枚だけ用意し、ユーザーが
「テクスチャ品質:高」に設定すれば、そのままのサイズで読み込み、
「テクスチャ品質:低」に設定すれば、縮小して読み込む、といった具合です。
縮小処理のため、ロード時間は増えてしまうかもしれませんが、許容範囲であれば
配布時に複数解像度のテクスチャをいちいち用意しなくてもよくて良いと思うのですが。

285:デフォルトの名無しさん
10/04/12 23:54:12
ジオメトリシェーダでできることは、DX11で追加されるテッセレーションステージでできるように思うのですが、
それでもこのシェーダがパイプライン上にあるのは、DX10との互換を保つためなんでしょうか?
それとも、テッセレーションステージでできなくて、ジオメトリシェーダでできることがあるのでしょうか?

286:デフォルトの名無しさん
10/04/13 00:32:43
加算合成で画像を表示するために下のように書いたのですが、合成されません。
どうすればよいのでしょうか。
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);

287:デフォルトの名無しさん
10/04/13 01:29:32
市販・同人合わせて、日本のゲームで高スペック仕様なんてみたことねーですね。
みんな貧乏性なので、標準でも全然ok。帯域がどうとか自己満w。
まあ自己満でよければテクスチャを1/2や1/4に縮小するモードでも付ければって感じです。

288:デフォルトの名無しさん
10/04/13 01:29:53
>>285
別々のレンダーターゲットに別々のカメラから見た絵を
描こうとしたら基本的にはGSを使うしかないわけだが。

テッセレーターは細分化するのが役目であって、
描画先の指定や細かい制御は出来ないよ。

ポストエフェクトはいちいち描画しなくてもCSで出来るようになったのは便利だね。

289:デフォルトの名無しさん
10/04/13 01:48:22
>>286
ID3DXSprite::Beginはレンダリングステートを特定のものに書き換えるぜ
ここで通常合成に変えられちゃってるんじゃ?
BeginとEndの位置はどこよ?

290:284
10/04/13 07:38:30
>>287
カプコンのPC版デビルメイクライ4体験版でテクスチャ解像度の高低を設定できるようになっていました。
個人作成のソフトではそういった設定はあまりないんですね。
必要かどうかよく吟味したいと思います。
ありがとうございました。

291:285
10/04/13 07:40:54
>>288
ディスプレイスメントマッピングなど一部処理は新たに設置されたテッセレーションステージ
でやるほうが良くなったかもしれないくらいで、
基本的にはジオメトリシェーダならではの処理がまだあるということですね。
ありがとうございました。

292:286
10/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()で行っています。

293:デフォルトの名無しさん
10/04/13 19:25:02
>>292
じゃなくて
g_pD3DXSprite->Begin()はどこ?

294:286
10/04/13 19:34:45
>>289 >>293
g_pD3DXSprite->Begin()使ったら適用されました。
ありがとうございました。

295:デフォルトの名無しさん
10/04/13 19:45:25
なんでそうなるのか分かってなさそうで怖いな
後で同時にスプライトとメッシュを同時に描画すると表示がおかしくなります。とか聞きにくるなよ?

296:デフォルトの名無しさん
10/04/13 20:00:01
パチンコのゲームみたいに単発のSEが多量に流れるようなアプリケーションを作るには
DirectXの場合はDirectSoundになるのでしょうか?
並行してコンポの液晶面や音楽プレイヤーなどでよく見かける
↓のような表示(何ていう名称なんでしょう)を行いたいのですが、流石にこちらはDirectXに頼れないですよね。
     ■       ■
     ■  ■    ■
   ■■  ■  ■■■
■■■■■■■■■■■■■

297:デフォルトの名無しさん
10/04/13 20:51:47
スペクトラムアナライザー

298:デフォルトの名無しさん
10/04/13 21:14:09
DirectAudio(Sound、Music)やXAudio2、XACT、OpenALなど様々なAPIがあるけどどれを使ったらいいですか
サンプルの多さとWAVE、MIDIに対応してるDirectAudioに魅力を感じているのですが既に廃止済みとのことで・・・
DirectAudioは使うなというMSの方針に従うべきなのかどうか

299:デフォルトの名無しさん
10/04/14 09:07:53
>>296
FFT変換でぐぐれ

300:デフォルトの名無しさん
10/04/14 11:44:46
FFT変換
高速フーリエ変換変換

301:デフォルトの名無しさん
10/04/14 13:27:33
>>299-300
ワロタ

302:デフォルトの名無しさん
10/04/14 18:38:07
すみません
テクスチャを256x256 4枚 → 512x512 1枚に押し込めて動作テストし、
2回のQueryPerformanceCounterで経過時間を取得したのですが
誤差程度の変化しか有りませんでした。

マテリアルの切り替えは「非常に重い」と聞きますが、テクスチャをやたらと1枚に押し込めても
結局処理速度の向上は望めないものなのでしょうか?

303:デフォルトの名無しさん
10/04/14 19:23:30
>>302
最適化する前に、マテリアルを一切切り替えず全部同じマテリアルで表示すると明らかに速くなったりするかを見てみる

グラフィックパイプラインのチューニングは、なにが原因で速度が遅いのかを調べてそこを最適化しないと効果は現れない

304:デフォルトの名無しさん
10/04/14 19:52:14
>>302
DrawPrimitiveは描画が終わるまでブロックするわけじゃないから、
その前後で時間を測っても処理時間は測定できないよ。

305:デフォルトの名無しさん
10/04/14 20:03:17
>>302
いまどきのグラボだったら、全部VRAMにのっちゃうから切り替えコストはあんまりかからないような・・・

306:デフォルトの名無しさん
10/04/14 20:11:10
自分もマテリアルの切替が遅いってのを聞いて気にしてるんだけど、
VRAMがたっぷりあって、それの上に乗っかる分には大丈夫なわけ??
VRAMに余裕がなくて、いちいち転送の必要がある場合に遅いと?
シェーダおよびシェーダ変数の切替コストも上記と同じ考えなのかな?

307:デフォルトの名無しさん
10/04/14 23:05:26
同じだよ

308:デフォルトの名無しさん
10/04/14 23:23:28
コンシューマでの開発だったら変わるんだろうけどね

309:デフォルトの名無しさん
10/04/14 23:44:09
深度バッファシャドウ用のシャドウテクスチャ(浮動少数点バッファです)に保存する際のZ値ですが、
ピクセルシェーダに渡されたトランスフォーム後座標をPosとすると、一般的には

(出力) = Pos.z / Pos.w;

としたり、

(出力) = Pos.w / (遠平面距離)

として、シャドウテクスチャを参照するときも同様にして各ピクセルの深度値と比較します。
たしかにこのやり方だとうまくいきます。
しかし、Pos.wを直接出力してもうまくいくと思って試してみたところ、うまく影が出ませんでした。
Pos.wは射影変換前のライトカメラ原点からZ値のはずなので、Pos.w/(遠平面距離)とは
0~1に正規化するかどうかだけの違いで、影かどうかの判定結果は同じになると思うのですが・・・

310:302
10/04/15 00:08:05
303-308
ありがとうございます。為になりました。

311:306
10/04/15 02:12:19
>>307
>>308
ありがとう、勉強になった。
ユーザーにはできるだけ良いグラボを使ってもらうようお願いしよう(笑)

312:デフォルトの名無しさん
10/04/15 10:11:03
すみません、質問です。
現在 WinXPSP3 + DirectX9 (2008 August) でアプリケーションを作成しているのですが、
Direct3D で描画をする際に、実装予定の機能上の都合で 3D画面が重なったようなレンダリングをしたいと思っています。

具体的には、ポリゴンメッシュを通常通り3Dで描画した後、その上に重なって見えるように
また別のポリゴンメッシュを表示したいのです。
※丁度モデリングソフトで、メッシュ上にボーンや頂点移動のハンドルが重なって=見かけ上、常に手前に表示されているような状態

これらを実現する方法として、例えばデバイスコンパチブルなBitmapを別にバッファとして用意し、
そこに重ねて上に表示したい内容をレンダさせ、それを3D画面上にスプライトとして重ねてしまえばいいのかなと思ったのですが、
そのような方法(実現可能かどうかはこれから調べる)で良いのでしょうか。 あるいはもっとシンプルな方法がありますでしょうか。

よろしくお願いいたします。



313:デフォルトの名無しさん
10/04/15 10:19:36
>>312
一番簡単な方法は、裏になるレイヤを描画した後にZバッファだけクリアして
手前のレイヤを描画。

別々に描画して後から重ねたいなら、RenderTargetTextureに対して描画。

314:312
10/04/15 10:48:00
>>313
早速のレスありがとうございます!レスを頂いてからあっと気づきました・・・
Zバッファクリアだけで無事実現出来ました。ありがとうございました!


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch