DirectX11でMMDファイルを表示したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
のどぐろ
記事: 1
登録日時: 9年前

DirectX11でMMDファイルを表示したい

#1

投稿記事 by のどぐろ » 9年前

C++、DirectX11、Visual Studio2012の環境でMMDファイルを表示したいと思い、コードを書いたのですが、
(Mai.cppの173行目)どうしてもDeviceの中の変数が足りないのか(Nullと表示される?)、実行しても途中で中断してしまいます。
Devaice関数はDevice.cppファイルに記述しています。
どうも、描画か何かの初期化処理が記述されていないから?らしいのですが、どこが抜けているのか、どう記述して良いのか解らず困っています。
数日考え、様々な資料を読んだりしましたが、手がかりを掴めませんでした。出来る限り今日明日で描画したいです。
どこが足りないのか、アドバイス頂けませんでしょうか。

Main.cpp(464行まで)

コード:

#include <windows.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <cstdio>
#include <vector>
#include <xnamath.h>

#include "Device.h"
#include "PMDLoader.h"
#include "UIWidget.h"
#include "BackGround.h"
#include "RepeatUI.h"

//定数定義
#define APP_NAME L"ウィンドウタイトル"
#define PI ((float)3.141592654f)
#define D3DXToRadian(degree)((degree) * (D3DX_PI / 180.0f))
#define WINDOW_WIDTH 640 //ウィンドウ幅
#define WINDOW_HEIGHT 480 //ウィンドウ高さ

//テクスチャ
ID3D11ShaderResourceView*nulltex = nullptr;
ID3D11ShaderResourceView*numTex = nullptr;

//グローバル変数
HWND g_hWnd = nullptr;
ID3D11RenderTargetView* g_pRTV;
ID3D11Texture2D* g_pDS;
ID3D11DepthStencilView* g_pDSV;

//シェーダー
ID3D11VertexShader* p_vertexShader;
ID3D11VertexShader* p_2DUIVShader;

ID3D11PixelShader* p_pixelShader;
ID3D11PixelShader* p_2DUIpixelShader;

// バッファ
ID3D11Buffer* materialBuffer = nullptr;
ID3D11Buffer* cameraBuffer = nullptr;
ID3D11Buffer* batuBuffer = nullptr;
ID3D11Buffer* planeBuffer = nullptr;

// レイアウト
ID3D11InputLayout* ilayout = nullptr;
ID3D11InputLayout* ilayoutUI = nullptr;


// 行列
XMMATRIX view, proj;

// キー
BYTE keystate[256];

//モデル情報
const char *modelName = "描画したいMMDファイル.pmd";
float angleX, angleZ;

struct Position
{
	float x, y, z;
	float u, v;	
};

RepeatUI* shield;
RepeatUI* boost;
RepeatUI* bomIcon;
BackGround* ground;

//前方宣言
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void App();
HRESULT InitDirect3D();

void InitMaterialBuffer();
void InitShader();
void InitSumpler();
void InitTexture(const char*, ID3D11ShaderResourceView**);
void InitCamera();
void SetWVPMatrixToBuffer(XMMATRIX&, XMMATRIX&, XMMATRIX&);
void UpdatePlayer();
void Alpha();
void InitUI();
void InitGround();

//main関数(必ず一度だけ呼び出される)
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szStr, INT iCmdShow)
{
	Device& device = Device::Instance();

	// ウィンドウの作成
	WNDCLASSEX  wc = {};
	wc.cbSize = sizeof(wc);
	wc.lpfnWndProc = WndProc;
	wc.hInstance = hInst;
	wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
	wc.lpszClassName = APP_NAME;
	if (!RegisterClassEx(&wc)) return 1;
	g_hWnd = CreateWindow(APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, hInst, 0);
	ShowWindow(g_hWnd, SW_SHOW);
	UpdateWindow(g_hWnd);

	//Direct3Dの作成
	if (FAILED(device.Init(g_hWnd))) return 1;
	InitShader();
	InitCamera();
	InitGround();
	Alpha();

	// メッセージループ
	MSG msg = {};
	while (msg.message != WM_QUIT)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ? DispatchMessage(&msg) : App();

	return 0;
}

//
//ウィンドウプロシージャー関数
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	switch (iMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, iMsg, wParam, lParam);
}

//自機の更新
void UpdatePlayer()
{
	XMMATRIX world;
	world = XMMatrixIdentity();
	world *= XMMatrixRotationZ(XMConvertToRadians(angleZ));
	world *= XMMatrixRotationX(XMConvertToRadians(angleX));


	world *= XMMatrixRotationY(XMConvertToRadians(180));
	world *= XMMatrixScaling(0.2, 0.2, 0.2);
	world *= XMMatrixTranslation(0, 5, 0);

	SetWVPMatrixToBuffer(world, view, proj);
}

void App()
{
	Device& device = Device::Instance();
	PMDLoader& loader = PMDLoader::Instance();
	PMDMeshInfo* model = loader.GetMeshInfo(modelName);

	device.CrearContext();

	ID3D11Buffer* modelVertBuf = model->GetVertexBuffer();

	// モデルの描画
	UINT stride = 38;
	UINT offset3d = 0;
	device.GetDeviceContext()->VSSetShader(p_vertexShader, nullptr, 0);
	device.GetDeviceContext()->PSSetShader(p_pixelShader, nullptr, 0);
	device.GetDeviceContext()->IASetVertexBuffers(0, 1, &modelVertBuf, &stride, &offset3d);
	device.GetDeviceContext()->IASetInputLayout(ilayout);
	device.GetDeviceContext()->VSSetConstantBuffers(0, 1, &cameraBuffer);
	device.GetDeviceContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

	D3D11_MAPPED_SUBRESOURCE materialMap = {};

	int indexMax = 0;
	for (int i = 0; i < model->GetMaterials().size(); i++)
	{
		//MAPで変更するデータの設定
		device.GetDeviceContext()->Map(materialBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &materialMap);
		
		*(XMFLOAT3*)materialMap.pData = model->GetMaterials()[i].diffuse;

		//アンマップ処理
		device.GetDeviceContext()->Unmap(materialBuffer, 0);

		if (model->GetTextures()[i] != nullptr)
		{
			device.GetDeviceContext()->PSSetShaderResources(0, 1, &model->GetTextures()[i]);
		}
		else 
		{
			device.GetDeviceContext()->PSSetShaderResources(0, 1, &nulltex);
		}

		device.GetDeviceContext()->DrawIndexed(model->GetMaterials()[i].indexCount, indexMax, 0);
		indexMax += model->GetMaterials()[i].indexCount;

	}

	// 背景の描画
	ground->Draw();

	// UIの描画
	device.GetDeviceContext()->VSSetShader(p_2DUIVShader, nullptr, 0);
	device.GetDeviceContext()->PSSetShader(p_2DUIpixelShader, nullptr, 0);

	device.GetDeviceContext()->IASetInputLayout(ilayoutUI);

	device.GetDeviceContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
	UINT uiStride = sizeof(Position);
	UINT uiOffset = 0;
	device.GetDeviceContext()->IASetVertexBuffers(0, 1, &batuBuffer, &uiStride, &uiOffset);
	device.GetDeviceContext()->PSSetShaderResources(0, 1, &numTex);
	device.GetDeviceContext()->Draw(4, 0);
	device.GetDeviceContext()->IASetVertexBuffers(0, 1, &planeBuffer, &uiStride, &uiOffset);
	device.GetDeviceContext()->PSSetShaderResources(0, 1, &numTex);
	device.GetDeviceContext()->Draw(4, 0);
	bomIcon->Draw();
	shield->Draw();
	boost->Draw();

	device.GetSwapChain()->Present(0, 0);//画面更新
}

// シェーダーの初期化
void InitShader()
{
	Device& device = Device::Instance();
	ID3DBlob* compiledShader = nullptr;
	ID3DBlob* error = nullptr;
	ID3DBlob* compiledUIShader = nullptr;
	ID3DBlob* errorUI = nullptr;

	// 頂点シェーダーの読み込み
	// 3Dのシェーダ-
	HRESULT result = D3DX11CompileFromFile(L"shader.hlsl", nullptr, nullptr, "VS", "vs_5_0", 0, 0, nullptr, &compiledShader, &error, nullptr);
	result = device.GetDevice()->CreateVertexShader(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), nullptr, &p_vertexShader);


	// 2D頂点シェーダー読み込み
	result = D3DX11CompileFromFile(L"shader2D.hlsl", nullptr, nullptr, "VS_2DUI", "vs_5_0", 0, 0, nullptr, &compiledUIShader, &errorUI, nullptr);
	result = device.GetDevice()->CreateVertexShader(compiledUIShader->GetBufferPointer(), compiledUIShader->GetBufferSize(), nullptr, &p_2DUIVShader);



	// 頂点レイアウトの定義
	D3D11_INPUT_ELEMENT_DESC ildesc[] =
	{
		{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
		{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
		{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
	};

	// UI頂点レイアウトの定義
	D3D11_INPUT_ELEMENT_DESC ildescUI[] =
	{
		{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
		{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
	};



	// 3D用レイアウトの作成
	result = device.GetDevice()->CreateInputLayout(ildesc, sizeof(ildesc) / sizeof(D3D11_INPUT_ELEMENT_DESC), compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), &ilayout);
	//レイアウトを返す
	device.GetDeviceContext()->IASetInputLayout(ilayout);
	// シェーダーのリリース
	compiledShader->Release();
	compiledShader = nullptr;



	// 2D用レイアウト作成
	result = device.GetDevice()->CreateInputLayout(ildescUI, sizeof(ildescUI) / sizeof(D3D11_INPUT_ELEMENT_DESC), compiledUIShader->GetBufferPointer(), compiledUIShader->GetBufferSize(), &ilayoutUI);
	device.GetDeviceContext()->IASetInputLayout(ilayoutUI);
	compiledUIShader->Release();
	compiledUIShader = nullptr;


	// 3Dピクセルシャーダの読み込み
	result = D3DX11CompileFromFile(L"shader.hlsl", nullptr, nullptr, "PS", "ps_5_0", 0, 0, nullptr, &compiledShader, &error, nullptr);
	result = device.GetDevice()->CreatePixelShader(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), nullptr, &p_pixelShader);

	// 2Dピクセルシャーダの読み込み
	result = D3DX11CompileFromFile(L"shader2D.hlsl", nullptr, nullptr, "PS_2DUI", "ps_5_0", 0, 0, nullptr, &compiledUIShader, &errorUI, nullptr);
	result = device.GetDevice()->CreatePixelShader(compiledUIShader->GetBufferPointer(), compiledUIShader->GetBufferSize(), nullptr, &p_2DUIpixelShader);

	InitUI();

	// モデルデータのロード
	PMDLoader::Instance().Create(modelName);

	Position batu[] = {
		{ 43, 34, 0.0f, 260.0f / 336.0f, 1.0f },
		{ 43, 0, 0.0f, 260.0f / 336.0f, 0.0f },
		{ 77, 34, 0.0f, 294.0f / 336.0f, 1.0f },
		{ 77, 0, 0.0f, 294.0f / 336.0f, 0.0f }
	};

	D3D11_BUFFER_DESC bufdesc = {}; // 初期化をする
	bufdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
	bufdesc.ByteWidth = sizeof(Position)* 4;
	bufdesc.CPUAccessFlags = 0;
	bufdesc.MiscFlags = 0;
	bufdesc.Usage = D3D11_USAGE_DEFAULT;


	D3D11_SUBRESOURCE_DATA initdata = {};
	initdata.pSysMem = batu;

	// バッファの生成
	result = device.GetDevice()->CreateBuffer(&bufdesc, &initdata, &batuBuffer);


	Position plane[] = {
		{ 0, 42, 0, 294.0f / 336.0f, 1 },
		{ 0, 0, 0, 294.0f / 336.0f, 0 },
		{ 42, 42, 0, 336.0f / 336.0f, 1 },
		{ 42, 0, 0, 336.0f / 336.0f, 0 }
	};

	D3D11_SUBRESOURCE_DATA initdata2 = {};
	initdata2.pSysMem = plane;

	result = device.GetDevice()->CreateBuffer(&bufdesc, &initdata2, &planeBuffer);


	InitSumpler();
	// nulltexにテクスチャをロードする
	result = D3DX11CreateShaderResourceViewFromFile(device.GetDevice(), L"nulltex.bmp", nullptr, nullptr, &nulltex, nullptr);
	result = D3DX11CreateShaderResourceViewFromFile(device.GetDevice(), L"numeric_etc.png", nullptr, nullptr, &numTex, nullptr);

}

void InitSumpler()
{
	Device& device = Device::Instance();
	//サンプラーの生成
	ID3D11SamplerState* sampler;

	//サンプラーの設定
	D3D11_SAMPLER_DESC smdesc = {};
	smdesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
	smdesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
	smdesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
	smdesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;

	//サンプラーの設定を渡す
	HRESULT result = device.GetDevice()->CreateSamplerState(&smdesc, &sampler);
	device.GetDeviceContext()->PSSetSamplers(0, 1, &sampler);

}

void InitUI()
{
	shield = new RepeatUI(0, 400, 150, 80, "shield_gauge.png", 1);
	boost = new RepeatUI(400, 400, 240, 80, "boost_gauge.png");
	bomIcon = new RepeatUI(400, 350, 34, 34, "bomb_icon.png", 5);
}

void InitTexture(const char* filePath, ID3D11ShaderResourceView** srv)
{
	Device& device = Device::Instance();
	//ロード処理
	HRESULT result = D3DX11CreateShaderResourceViewFromFileA(device.GetDevice(),
		filePath,
		nullptr,
		nullptr,
		srv,
		nullptr);
}


void InitCamera()
{
	Device& device = Device::Instance();
	HRESULT result;
	XMMATRIX camera;
	// カメラの位置
	XMVECTOR eye = { 0, 10, -30 };
	// 注視位置
	XMVECTOR target = { 0, 10, 0 };
	//自機の位置
	XMVECTOR upper = { 0, 1, 0 };

	view = XMMatrixLookAtLH(eye, target, upper);

	float rad = 90 * PI / 180.0;
						
	proj = XMMatrixPerspectiveFovLH(rad, (float)(WINDOW_WIDTH) / (float)(WINDOW_HEIGHT), 0.1f, 100.0f);

	camera = view * proj;
	XMMATRIX world;
	world = XMMatrixIdentity();

	world *= XMMatrixRotationY(XMConvertToRadians(180));
	world *= XMMatrixScaling(0.2, 0.2, 0.2);
	world *= XMMatrixTranslation(0, 0, 0);

	XMMATRIX matrix;
	matrix = world * camera;

	// カメラのバッファを作成
	D3D11_BUFFER_DESC buffdesc = {};
	buffdesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//コンスタントバッファとして生成
	buffdesc.ByteWidth = sizeof(camera);//サイズ
	buffdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;//CPUからの書き込み可
	buffdesc.Usage = D3D11_USAGE_DYNAMIC;//CPUから書き込まれ、GPUから読み取られる


	D3D11_SUBRESOURCE_DATA data = {};
	data.pSysMem = &matrix;

	result = device.GetDevice()->CreateBuffer(&buffdesc, &data, &cameraBuffer);

	device.GetDeviceContext()->VSSetConstantBuffers(0, 1, &cameraBuffer);
}

void InitMaterialBuffer(){
	Device& device = Device::Instance();
	XMFLOAT3 color = { 0.5f, 0.0f, 0.5f };
	D3D11_BUFFER_DESC buffdesc = {};
	buffdesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//コンスタントバッファとして生成
	buffdesc.ByteWidth = sizeof(color)+(16 - sizeof(color) % 16) % 16;//サイズ
	buffdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;//CPUからの書き込み可
	buffdesc.Usage = D3D11_USAGE_DYNAMIC;//CPUから書き込まれ、GPUから読み取られる


	D3D11_SUBRESOURCE_DATA data = {};
	data.pSysMem = &color;

	HRESULT result = device.GetDevice()->CreateBuffer(&buffdesc, &data, &materialBuffer);

	device.GetDeviceContext()->PSSetConstantBuffers(0, 1, &materialBuffer);
}

void SetWVPMatrixToBuffer(XMMATRIX& wor, XMMATRIX& vie, XMMATRIX& projec)
{
	D3D11_MAPPED_SUBRESOURCE matrixMap = {};
	Device& device = Device::Instance();
	//違うデータが必要?
	device.GetDeviceContext()->Map(cameraBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &matrixMap);
	*(XMMATRIX*)matrixMap.pData = wor * vie * projec;
	device.GetDeviceContext()->Unmap(cameraBuffer, 0);
}

void Alpha() {
	Device& device = Device::Instance();
	ID3D11BlendState* blendstate = nullptr;
	D3D11_BLEND_DESC blenddesc = {};
	blenddesc.AlphaToCoverageEnable = false;
	blenddesc.IndependentBlendEnable = false;
	D3D11_RENDER_TARGET_BLEND_DESC&  blrtdesc = blenddesc.RenderTarget[0];
	blrtdesc.BlendEnable = true;
	blrtdesc.SrcBlend = D3D11_BLEND_SRC_ALPHA;
	blrtdesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
	blrtdesc.BlendOp = D3D11_BLEND_OP_ADD;
	blrtdesc.SrcBlendAlpha = D3D11_BLEND_ONE;
	blrtdesc.DestBlendAlpha = D3D11_BLEND_ZERO;
	blrtdesc.BlendOpAlpha = D3D11_BLEND_OP_ADD;
	blrtdesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
	float blendFactor[] = { 0.0f, 0.0f, 0.0f, 0.0f };
	device.GetDevice()->CreateBlendState(&blenddesc, &blendstate);
	device.GetDeviceContext()->OMSetBlendState(blendstate, blendFactor, 0xffffffff);
}

void InitGround()
{
	ground = new BackGround(WINDOW_WIDTH, WINDOW_HEIGHT, PI);
}





//ここからDevice.cpp (上記のMain.cppとは別ファイルです)
#include "Device.h"

#define WINDOW_WIDTH 640 //ウィンドウ幅
#define WINDOW_HEIGHT 480 //ウィンドウ高さ

Device::Device()
{
}


Device::~Device()
{
}


HRESULT Device::Init(HWND hwnd){
	_hwnd = hwnd;
	return InitDirect3D();
}

void Device::Terminate(){
	
}

//DirectX11初期化関数
HRESULT Device::InitDirect3D()
{
	//デバイスとスワップチェーンの作成
	DXGI_SWAP_CHAIN_DESC sd = {};//構造体初期化
	//ここからスワップチェインへの指定
	sd.BufferCount = 1;//バックバッファの数=1
	sd.BufferDesc.Width = WINDOW_WIDTH;//バックバッファ幅
	sd.BufferDesc.Height = WINDOW_HEIGHT;//バックバッファ高
	sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//バックバッファのフォーマットARGB
	sd.BufferDesc.RefreshRate.Numerator = 60;//分子
	sd.BufferDesc.RefreshRate.Denominator = 1;//分母
	sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;//このサーフェスはレンダーターゲットとして使用する
	sd.OutputWindow = _hwnd;//ウィンドウハンドルを指定
	sd.SampleDesc.Count = 1;//サンプリング数
	sd.Windowed = true;//ウィンドウモード

	D3D_FEATURE_LEVEL pFeatureLevels = D3D_FEATURE_LEVEL_11_0;//使用したいフィーチャレベル(DirectX11モード)
	D3D_FEATURE_LEVEL* pFeatureLevel = NULL;//実際に使用可能なフィーチャレベル配列へのポインタ

	HRESULT result = D3D11CreateDeviceAndSwapChain(nullptr,//規定のアダプタを使用
		D3D_DRIVER_TYPE_HARDWARE,//ハードウェアアクセラレータを使用
		nullptr,//ソフトウェアラスタライザ
		0,//0でいい(特に指定しない)
		&pFeatureLevels//使いたいフィーチャレベルへのアドレス
		, 1
		, D3D11_SDK_VERSION,//ここは固定
		&sd,//スワップチェイン指定
		&_pSwapChain,//得られるスワップチェイン
		&_pDevice,//得られるデバイスポインタ
		pFeatureLevel,//実際に使用できるフィーチャレベル配列へのポインタ
		&_pDeviceContext);//得られるデバイスコンテキスト

	//バックバッファーのレンダーターゲットビュー(RTV)を作成
	ID3D11Texture2D *pBack;
	//バックバッファのサーフェイスをシェーダリソース(テクスチャ)として抜き出す
	_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBack);
	//そのテクスチャをレンダーターゲットとするようなレンダーターゲットビューを作成
	_pDevice->CreateRenderTargetView(pBack, NULL, &_pRTV);
	pBack->Release();

	//デプスステンシルビュー(DSV)を作成
	//デプスステンシルビューっは所謂「Zバッファ」を有効にするために必要
	//Zバッファっは描画順によらず前後のオブジェクトを正確に描画するのに必要
	D3D11_TEXTURE2D_DESC descDepth;
	descDepth.Width = WINDOW_WIDTH;//画面幅
	descDepth.Height = WINDOW_HEIGHT;//画面高
	descDepth.MipLevels = 1;
	descDepth.ArraySize = 1;//テクスチャの数
	descDepth.Format = DXGI_FORMAT_D32_FLOAT;//深度バッファのビット数と型の指定(32ビットFloat型)
	descDepth.SampleDesc.Count = 1;
	descDepth.SampleDesc.Quality = 0;
	descDepth.Usage = D3D11_USAGE_DEFAULT;
	descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
	descDepth.CPUAccessFlags = 0;
	descDepth.MiscFlags = 0
	_pDevice->CreateTexture2D(&descDepth, NULL, &_pDS);//深度値用テクスチャの生成

	_pDevice->CreateDepthStencilView(_pDS, NULL, &_pDSV);//作ったテクスチャ元にデプスステンシルビューを生成

	//ビューポートの設定
	D3D11_VIEWPORT vp;
	vp.Width = WINDOW_WIDTH;
	vp.Height = WINDOW_HEIGHT;
	vp.MinDepth = 0.0f;
	vp.MaxDepth = 1.0f;
	vp.TopLeftX = 0;
	vp.TopLeftY = 0;
	_pDeviceContext->RSSetViewports(1, &vp);

	//レンダーターゲットビューとデプスステンシルビューをセット
	_pDeviceContext->OMSetRenderTargets(1, &_pRTV, _pDSV);

	return S_OK;
}



ID3D11Device* Device::GetDevice() const{
	return _pDevice;
}

ID3D11DeviceContext* Device::GetDeviceContext() const{
	return _pDeviceContext;
}

IDXGISwapChain* Device::GetSwapChain() const{
	return _pSwapChain;
}

void Device::CrearContext()
{
	//画面クリア
	float ClearColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };// クリア色作成 RGBAの順
	_pDeviceContext->ClearRenderTargetView(_pRTV, ClearColor);//カラーバッファクリア
	_pDeviceContext->ClearDepthStencilView(_pDSV, D3D11_CLEAR_DEPTH, 1.0f, 0);//デプスステンシルバッファクリア
}

KAWANOT

Re: DirectX11でMMDファイルを表示したい

#2

投稿記事 by KAWANOT » 9年前

DirectX11でMMDを動かそうとは頑張っていますね。
と思って、コードと投稿者コメントを見ましたが、これは学校の課題でしょうか?

YS正直なところ、MainとDeviceのソースコードだけを見せられて、Nullが返るといわれても判断つきません。実行もできませんし。

ソースコードから推測するに、DeviceのInit3D関数内のDirect3D初期化でしくじっている可能性が高いです。
戻り値のresult値は確認されましたか?自分でできることもしないうちから掲示板に丸投げはやめましょう。プログラマとして恥ずべき行為です。

ともかくこれだけでは原因の特定は困難です。
どこかにZipで全ソースコードをアップロードしてみてはいかがでしょうか?

もし学校の課題であるならば、潔く学校のせんせーに質問してみればいいんじゃないでしょうか?そういう時に対応するのが先生の仕事でしょ?

閉鎖

“C言語何でも質問掲示板” へ戻る