質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

0回答

907閲覧

DirectX9でのMMDモデル描画(1モデルに複数テクスチャ)ができません

ryu_directx

総合スコア4

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2020/02/12 12:12

DirectX9でのMMDモデル描画(1モデルに複数テクスチャ)ができません

現在DirectX9においてMMDモデルの描画をしたいと考えているのですがうまくマッピングできません。
テクスチャはheadとbodyの2枚あるのですが、bodyのテクスチャが頭のマッピングに適用されてしまい、うまく表示されません。(画像1枚目)
コードはHLSLで書いたエフェクトファイルを用いているのですが、HLSLを使わず固定機能パイプラインを用いると正常に描画されます。(画像2枚目)エフェクトファイルを読み込むところやエフェクトファイル内の変数を設定するところ以外はほとんど書き換えていないので原因はエフェクトファイルではないかと考えているのですがどの箇所を書き換えればよいのか分かりません。

何卒回答よろしくお願いいたします。
bodyのテクスチャが頭に適用されてしまっています

固定機能パイプラインで描画すると正常に描画されます

発生している問題・エラーメッセージ

コード自体の実行は可能であり、エラーは発生しておりません。

該当のソースコード(問題の箇所の特定ができないのでcppとfxのコードを貼らせていただきました。

c++

1//cppファイルです。 2// 極小プログラマブルシェーダープログラム 3 4#pragma comment(lib, "dxguid.lib") 5#pragma comment(lib, "d3d9.lib") 6#pragma comment(lib, "d3dx9.lib") 7 8#include <windows.h> 9#include <tchar.h> 10#include <d3d9.h> 11#include <d3dx9.h> 12#include"Comptr.h" 13#include <crtdbg.h> 14 15using namespace IKD; 16 17 18_TCHAR gName[100] = _T("ミクさん"); 19 20 21 22// ウィンドウプロシージャ 23LRESULT CALLBACK WndProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam) { 24 switch (mes) 25 { 26 case WM_DESTROY: 27 PostQuitMessage(0); 28 break; 29 } 30 return DefWindowProc(hWnd, mes, wParam, lParam); 31} 32 33 34int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 35{ 36 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 37 38 // アプリケーションの初期化 39 MSG msg; HWND hWnd; 40 WNDCLASSEX wcex = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, NULL, 41 (HBRUSH)(COLOR_WINDOW + 1), NULL, (_TCHAR*)gName, NULL }; 42 if (!RegisterClassEx(&wcex)) 43 return 0; 44 45 DWORD WndStyle = WS_OVERLAPPEDWINDOW & ~(WS_MAXIMIZEBOX | WS_SIZEBOX); 46 RECT WndRect = { 0, 0, 800, 600 }; 47 AdjustWindowRect(&WndRect, WndStyle, false); 48 49 if (!(hWnd = CreateWindow(gName, gName, WndStyle, CW_USEDEFAULT, 0, 50 WndRect.right - WndRect.left, WndRect.bottom - WndRect.top, NULL, NULL, hInstance, NULL))) 51 return 0; 52 53 // Direct3Dの初期化 54 LPDIRECT3D9 g_pD3D; 55 LPDIRECT3DDEVICE9 g_pD3DDev; 56 if (!(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return 0; 57 Com_ptr<IDirect3D9> spD3D(g_pD3D); 58 59 D3DPRESENT_PARAMETERS d3dpp = { 0,0,D3DFMT_UNKNOWN,0,D3DMULTISAMPLE_NONE,0, 60 D3DSWAPEFFECT_DISCARD,NULL,TRUE,TRUE,D3DFMT_D24S8,D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL,D3DPRESENT_RATE_DEFAULT,D3DPRESENT_INTERVAL_DEFAULT }; 61 62 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDev))) 63 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDev))) 64 return 0; 65 Com_ptr<IDirect3DDevice9> cpDev(g_pD3DDev); 66 67 // Xファイルオブジェクト読み込み 68 Com_ptr<ID3DXBuffer> cpMatBuf; 69 Com_ptr<ID3DXMesh> cpMesh; 70 71 DWORD dwMatNum; 72 D3DXMATERIAL* pMatAry; 73 D3DMATERIAL9* pMeshMaterials; 74 LPDIRECT3DTEXTURE9* pMeshTextures; 75 D3DXLoadMeshFromX(_T("miku2.x"), D3DXMESH_MANAGED, cpDev.GetPtr(), NULL, cpMatBuf.ToCreator(), NULL, &dwMatNum, cpMesh.ToCreator()); 76 pMatAry = (D3DXMATERIAL*)cpMatBuf->GetBufferPointer(); 77 pMeshMaterials = new D3DMATERIAL9[dwMatNum]; 78 pMeshTextures = new LPDIRECT3DTEXTURE9[dwMatNum]; 79 80 for (DWORD i = 0; i < dwMatNum; i++) 81 { 82 pMeshMaterials[i] = pMatAry[i].MatD3D; 83 pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse; 84 pMeshTextures[i] = NULL; 85 if (pMatAry[i].pTextureFilename != NULL && 86 lstrlen(pMatAry[i].pTextureFilename) > 0) 87 { 88 if (FAILED(D3DXCreateTextureFromFile(g_pD3DDev, 89 pMatAry[i].pTextureFilename, 90 &pMeshTextures[i]))) 91 { 92 MessageBox(NULL,TEXT("テクスチャの読み込みに失敗しました"), NULL, MB_OK); 93 } 94 } 95 } 96 97 98 // エフェクトの読み込み 99 Com_ptr<ID3DXEffect> cpEffect; 100 D3DXCreateEffectFromFile( 101 cpDev.GetPtr(), 102 _T("Effect01.fx"), 103 NULL, 104 NULL, 105 D3DXSHADER_DEBUG, 106 NULL, 107 cpEffect.ToCreator(), 108 NULL 109 ); 110 111 // ビュー変換・射影変換 112 D3DXMATRIX View, Proj; 113 D3DXMatrixPerspectiveFovLH(&Proj, D3DXToRadian(45), 640.0f / 480.0f, 1.0f, 10000.0f); 114 115 // ウィンドウ表示 116 ShowWindow(hWnd, SW_SHOW); 117 118 float f = 0.0f; 119 DWORD i; 120 do { 121 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 122 TranslateMessage(&msg); 123 DispatchMessage(&msg); 124 } 125 else 126 { 127 f += 0.025f; 128 g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(10, 150, 190), 1.0f, 0); 129 g_pD3DDev->BeginScene(); 130 131 // エフェクト内のワールドビュー射影変換行列を設定 132 D3DXMATRIX mat,WIT; 133 D3DXMatrixLookAtLH(&View, &D3DXVECTOR3(30/5.0 * sin(f), 20/5.0, -30/5.0 * cos(f)), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, 1, 0)); 134 D3DXMatrixIdentity(&mat); 135 mat = mat * View * Proj; 136 cpEffect->SetMatrix("WVP",&mat); 137 cpEffect->SetMatrix("WIT", D3DXMatrixTranspose(&WIT, D3DXMatrixInverse(&WIT, NULL, &mat))); 138 cpEffect->SetVector("LightDir", &D3DXVECTOR4(-1, -1, -1, 0)); 139 cpEffect->SetVector("LightIntensity", &D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f)); 140 cpEffect->SetValue("Diffuse", &D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f), 16); 141 142 // 描画開始 143 cpEffect->SetTechnique("tecLambert"); 144 UINT numPass; 145 cpEffect->Begin(&numPass, 0); 146 cpEffect->BeginPass(0); 147 for (i = 0; i < dwMatNum; i++) 148 { 149 cpDev->SetMaterial(&(pMatAry[i].MatD3D)); 150 cpEffect->SetTexture("texDecal",pMeshTextures[i]); 151 cpMesh->DrawSubset(i); 152 } 153 cpEffect->EndPass(); 154 cpEffect->End(); 155 156 g_pD3DDev->EndScene(); 157 g_pD3DDev->Present(NULL, NULL, NULL, NULL); 158 } 159 } while (msg.message != WM_QUIT); 160 161 delete[] pMeshTextures; 162 delete[] pMeshMaterials; 163 return 0; 164} 165 166///////////////////////////// 167//エフェクトファイル(HLSL)です。 168texture texDecal; 169 170sampler Sampler = sampler_state{ 171 Texture = <texDecal>; 172 MinFilter = LINEAR; 173 MagFilter = LINEAR; 174 MipFilter = NONE; 175 AddressU = Clamp; 176 AddressV = Clamp; 177}; 178 179/////////////////////////////////////////////////////////////////////////////////// 180//型定義 181/////////////////////////////////////////////////////////////////////////////////// 182struct VS_OUT 183{ 184 float4 Position : POSITION; 185 float4 Color : COLOR; 186 float2 f2Texture : TEXCOORD; 187}; 188 189/////////////////////////////////////////////////////////////////////////////////// 190//グローバル 191/////////////////////////////////////////////////////////////////////////////////// 192 193float4x4 WVP; //ワールドから射影までの変換行列 194float4x4 WIT; //ワールド行列の逆行列の転置行列 195float4 LightDir; //rライトの方向ベクトル 196float4 LightIntensity; //入射光の強度 197float4 Diffuse; //拡散反射率 198 199///////////////////////////////////////////////////////////////////// 200//バーテックス・シェーダー 201/////////////////////////////////////////////////////////////////////////////////// 202VS_OUT VS(float4 Position : POSITION,float3 Normal : NORMAL,float2 f2Texture : TEXCOORD) 203{ 204 VS_OUT Out = (VS_OUT)0; 205 206 Out.Position=mul(Position,WVP); 207 208 float3 WNormal=normalize(mul(Normal,(float3x3)WIT)); 209 210 Out.Color=LightIntensity * Diffuse * dot(WNormal,LightDir);//この式はランバートの余弦則だけですが、通常、ランバート照明モデルと言えば環境光の項を含めることが多いようです 211 212 Out.f2Texture = f2Texture; 213 return Out; 214} 215/////////////////////////////////////////////////////////////////////////////////// 216//ピクセル・シェーダー 217/////////////////////////////////////////////////////////////////////////////////// 218float4 PS(float2 f2Texture : TEXCOORD) : COLOR 219{ 220 return tex2D(Sampler,f2Texture); 221} 222 223/////////////////////////////////////////////////////////////////////////////////// 224// テクニック 225/////////////////////////////////////////////////////////////////////////////////// 226technique tecLambert 227{ 228 pass P0 229 { 230 VertexShader = compile vs_2_0 VS(); 231 PixelShader = compile ps_2_0 PS(); 232 } 233} 234

試したこと

ネットで調べたのですがマルチテクスチャのサイトぐらいしかなく、解決方法はわかりませんでした。

補足情報(FW/ツールのバージョンなど)

・コードはvs2019です。
・テクスチャが1枚のモデルは正常に描画され、MMDモデルのテクスチャ2枚がプロジェクトと同じフォルダにあることも確認済みです。
・コードは必携DirectX9とマルペケ様のサイトを参考にさせていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問