directXのプログラムが上手くいかぬ

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

directXのプログラムが上手くいかぬ

#1

投稿記事 by zettonsouls » 10年前

directXでbox.xを表示するプログラムです。
実行すると画面が灰色になって表示されません。
大変長文ですが、親切な人お願いします。

コード:

//ヘッダ//
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <tchar.h>

struct Model{
	LPD3DXMESH		pmesh;
	D3DMATERIAL9*		pmaterials;
	DWORD			nummaterials;
	BOOL        used;
};

//グローバル変数
extern LPDIRECT3D9		g_pD3D;
extern LPDIRECT3DDEVICE9 g_pd3dDevice;
extern float			g_aspect;
extern Model			g_models[];


//関数プロトタイプ宣言
HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h);
int LoadModel(LPCTSTR filename);
void RenderModel(int idx); 

コード:

//cpp//
#include "my3dlib.h"

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
float g_aspect = 1.0f;
const int MAXMODEL = 64;
Model g_models[MAXMODEL];
int modelindex;

void CleanupD3D(){
	for (int i = 0; i < MAXMODEL; i++){
		if (g_models[i].used == TRUE){
			if (g_models[i].pmaterials != NULL){
				delete[] g_models[i].pmaterials;
			}
			if (g_models[i].pmesh != NULL){
				g_models[i].pmesh->Release();
			}
		}
	}
	if (g_pd3dDevice != NULL) g_pd3dDevice->Release();
	if (g_pD3D != NULL) g_pD3D->Release();
}


LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
	switch (msg) {
	case WM_DESTROY:
		CleanupD3D();
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd, msg, wParam, lParam);
}


HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h) {
	ZeroMemory(&g_models, sizeof(Model)*MAXMODEL);
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL),
		NULL, NULL, NULL, NULL, _T("D3D Window Class"), NULL };
	RegisterClassEx(&wc);

	HWND hWnd = CreateWindow(_T("D3D Window Class"), wintitle, WS_OVERLAPPED | WS_SYSMENU, 100,
		100, w, h, NULL, NULL, wc.hInstance, NULL);

	g_aspect = (float)w / (float)h;

	if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
		return E_FAIL;

	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
	d3dpp.EnableAutoDepthStencil = TRUE;
	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

	if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
		&d3dpp, &g_pd3dDevice))){
		if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
			&d3dpp, &g_pd3dDevice))){
			return E_FAIL;
		}
	}

	g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
	ShowWindow(hWnd, SW_SHOWDEFAULT);

	return S_OK;
}

void Render(){
	g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 225), 1.0f, 0);
	if (SUCCEEDED(g_pd3dDevice->BeginScene() ) ){
		g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
		D3DXMATRIXA16 matWorld1, matWorld2;
		D3DXMatrixTranslation(&matWorld1, 0.0f, 0.0f, 1.0f);
		D3DXMatrixRotationY(&matWorld2, D3DX_PI);
		matWorld2 *= matWorld1;
		g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld2);
		RenderModel(modelindex);
		g_pd3dDevice->EndScene();
	}
	g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

int LoadModel(LPCTSTR filename){
	int idx;
	for (idx = 0; idx < MAXMODEL; idx = idx + 1){
		if (g_models[idx].used == FALSE) break;
	}
	if (idx >= MAXMODEL) return -1;

	LPD3DXBUFFER pD3DXMtrlBuffer;
	if (FAILED(D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM, g_pd3dDevice, NULL, &pD3DXMtrlBuffer,
		NULL, &g_models[idx].nummaterials, &g_models[idx].pmesh))){
		MessageBox(NULL, _T("Xファイルが見つかりません"), _T("3D Lib"), MB_OK);
		return -1;
	}

	D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
	int num = g_models[idx].nummaterials;
	g_models[idx].pmaterials = new D3DMATERIAL9[num];
	if (g_models[idx].pmaterials == NULL) return -1;

	for (int i = 0; i < num; i = i + 1){
		g_models[idx].pmaterials[i] = d3dxMaterials[i].MatD3D;
		g_models[idx].pmaterials[i].Ambient = g_models[idx].pmaterials[i].Diffuse;
	}
	pD3DXMtrlBuffer->Release();
	g_models[idx].used = TRUE;
	return idx;
}


void RenderModel(int idx){
	if (g_models[idx].used == FALSE) return;

	for (DWORD i = 0; i < g_models[idx].nummaterials; i++){
		g_pd3dDevice->SetMaterial(&g_models[idx].pmaterials[i]);
		g_models[idx].pmesh->DrawSubset(i);
	}
}


INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT){
	if (SUCCEEDED(InitD3DWindow(_T("My3DLibtest"), 640, 480))){
		modelindex = LoadModel(_T("box.x"));
		if (modelindex == -1) return 0;
		MSG msg = { 0 };
		while (msg.message != WM_QUIT){
			if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else {
				Render();
			}
		}
	}
	UnregisterClass(_T("D3D Window Class"), GetModuleHandle(NULL));
	return 0;
}

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: directXのプログラムが上手くいかぬ

#2

投稿記事 by Aozora0630 » 10年前

DirectXにはあまり詳しくありませんが、以前私が3Dプログラムのテストをしたときにxファイルの中身が表示されないという不具合に会いました。

結局、その原因はxファイルのモデルが小さすぎたためでした。

画面が灰色になるなら若しかしたらxファイルのモデルが大きすぎてカメラがモデルの中にいるのかもしれません。(もしも出るがその色ならその可能性大。)

そこら辺を、Xファイルビューワーとかで調べてみたらどうでしょうか?

zettonsouls
記事: 3
登録日時: 10年前

Re: directXのプログラムが上手くいかぬ

#3

投稿記事 by zettonsouls » 10年前

情弱ですいませんが、windows8にxfaile viewerは入ってますか?

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: directXのプログラムが上手くいかぬ

#4

投稿記事 by Aozora0630 » 10年前

入ってないと思います。

というか、ご自分で調べては?

閉鎖

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