X파일 출력실패

각 게시판의 주제에서 벗어나는 게시물을 삭제 전에 임시로 보관하는 곳입니다. 읽기 전용이나, 자신의 글을 삭제, 수정하는 것은 가능합니다.
Post Reply
acediasecury
Posts: 4
Joined: 2009-12-31 11:10

X파일 출력실패

Post by acediasecury »

//D3DGame.cpp
//*************************************************************
#include <windows.h>
#include <d3dx9.h>

#include "XFileUtil.h"

//************************************************************
// 전역변수
//************************************************************

LPDIRECT3D9 g_pD3D = NULL; //Direct3D 객체
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //랜더링 장치(비디오카드)

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //버텍스 버퍼
LPDIRECT3DVERTEXBUFFER9 g_pVBLight = NULL; //라이트용 버텍스 버퍼

LPDIRECT3DVERTEXBUFFER9 g_pVBTexture = NULL; //텍스쳐 출력용 버텍스 버퍼
LPDIRECT3DTEXTURE9 g_pTexture = NULL; //텍스쳐 로딩용 변수

CXFileUtil g_XFile; //X파일 출력을 위한 클래스 객체

//커스텀 버텍스 타입 구조체
struct CUSTOMVERTEX
{
FLOAT x, y, z; //3D 좌표값
DWORD color; //버텍스 색상
};

//커스텀 버텍스의 구조를 표시하기 위한 FVF(Flexible Vertex Format) 값
//D3DFVF_XYZ(3D 월드 좌표)와 D3DFVF_DIFFUSE(점의 색상) 특성을 가지도록.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)


//조명 처리를 위한 버텍스 구조체

struct LIGHTVERTEX{
D3DXVECTOR3 position; //3D 좌표 구조체
D3DXVECTOR3 normal; //버텍스 노말
};

//버텍스 구조를 지정하는 FVF 정의
#define D3DFVF_LIGHTVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

//텍스쳐 좌표를 가지는 버텍스 구조체 정의
struct TEXTUREVERTEX
{
D3DXVECTOR3 position; //버텍스의 위치
D3DCOLOR color; //버텍스의 색상
FLOAT tu, tv; //텍스쳐 좌표
};

//위 구조체의 구조를 표현하는 FVF 값 정의
#define D3DFVF_TEXTUREVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)




//************************************************************
// 이름: InitD3D()
// 기능: Direct3D 초기화
//************************************************************

HRESULT InitD3D(HWND hWnd)
{
//Direct3D 객체 생성
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
}

//장치 생성용 데이터 준비
D3DPRESENT_PARAMETERS d3dpp; //장치 생성용 정보 구조체 변수 선언
ZeroMemory(&d3dpp, sizeof(d3dpp)); //구조체 클리어
d3dpp.BackBufferWidth = 800; //버퍼 해상도 넓이 설정
d3dpp.BackBufferHeight = 600; //버퍼 해상도 높이 설정
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //버퍼 포맷 설정
d3dpp.BackBufferCount = 1; //백버퍼 수
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //스왑 방법 설정
d3dpp.hDeviceWindow = hWnd; //윈도우 핸들 설정
d3dpp.Windowed = true; //윈도우 모드로 실행 되도록 함
d3dpp.EnableAutoDepthStencil= true; //스탠실 버퍼를 사용하도록 함
d3dpp.AutoDepthStencilFormat= D3DFMT_D24S8; //스탠실 버퍼 포맷 설정

//D3D객체의 장치 생성 함수 호출(디폴트 비디오카드 사용, HAL 사용, 소프트웨어 버텍스 처리사용 지정)
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}

//이제 장치가 정상적으로 생성되었음.

//zbuffer 사용하도록 설정
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);

return S_OK;
}

//************************************************************
// 이름:Cleanup()
// 기능: 초기화되었던 모든 객체들을 해제한다.
//************************************************************

VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();

if(g_pD3D != NULL)
g_pD3D->Release();
}

//************************************************************
// 이름: SetupLight
// 기능: 조명을 설정한다.
//************************************************************
VOID SetupLight()
{
D3DLIGHT9 light; //Direct3D 9 조명 구조체 변수 선언

ZeroMemory(&light, sizeof(D3DLIGHT9));
light.Type = D3DLIGHT_DIRECTIONAL; //조명 타입을 디렉셔널로 설정

light.Diffuse.r = 1.0f; //조명의 Red 색 설정
light.Diffuse.g = 1.0f; //조명의 Green 색 설정
light.Diffuse.b = 1.0f; //조명의 Blue 색 설정

D3DXVECTOR3 vecDir; //방향 벡터 변수 선언
vecDir = D3DXVECTOR3(10, -10, 10); //조명의 방향(진행하는 방향)
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir); //벡터 정규화

g_pd3dDevice->SetLight(0, &light); //라이트 번호 지정(여기서는 0번)
g_pd3dDevice->LightEnable(0, TRUE); //0번 라이트 켜기

//라이트 사용 기능을 TRUE로 함.(이 기능을 끄면 모든 라이트 사용은 중지됨)
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
//최종적으로 엠비언트 라이트 켜기(환경광의 양을 결정)
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00808080);
}

//************************************************************
// 이름: SetupViewProjection()
// 기능: 뷰 변환과 프로젝션 변환을 설정한다.
//************************************************************

VOID SetupViewProjection()
{
//뷰 변환 설정
D3DXVECTOR3 vEyePt( 100.0f, 250.0f, -400.0f); //카메라의 위치
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f); //바라보는 지점
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f); //업벡터 설정
D3DXMATRIXA16 matView; //뷰 변환용 매트릭스
//뷰 메트릭스 설정
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
//Direct3D 장치에 뷰 메트릭스 전달
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);

//프로젝션 변환 설정
D3DXMATRIXA16 matProj; //프로젝션용 매트릭스
//프로젝션 매트릭스 설정
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f);
//Direct3D 장치로 프로젝션 매트릭스 전달
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}


//************************************************************
// 이름: Render()
// 기능: 화면을 그린다.
//************************************************************

VOID Render()
{
if(NULL == g_pd3dDevice) //장치 객체가 생성되지 않았으면 리턴
return;

//뷰 및 프로젝션 변환 설정
SetupViewProjection();

//삼각형의 앞/뒤 변을 모두 렌더링하도록 컬링 기능을 끈다.
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

//조명을 끈다. (조명에 의한 색상이 아니고, 버텍스 자체의 색상을 사용하도록)
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

//백버퍼를 지정된 색상으로 지운다. (여기에서는 청색으로 지움)
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

//화면 그리기 시작
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{

////버텍스 출력 부분
//버텍스 버퍼지정
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
//버텍스 포멧지정
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

D3DXMATRIXA16 matWorld; //월드 변환용 매트릭스 선언

for (float x= -200;x<=200; x+=20){ //z축에 평행한 라인을 여러 개 그리기
D3DXMatrixTranslation(&matWorld, x, 0.0, 0.0); //x축에 따라 위치 이동 매트릭스
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //변환매트릭스 적용
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 2, 1); //z축 라인 그리기
}

for (float z = -200;z<=200; z+=20){ //x축에 평행한 라인을 여러 개 그리기
D3DXMatrixTranslation(&matWorld, 0.0, 0.0, z); //z축에 따라 위치 이동 매트릭스
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //변환매트릭스 적용
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 1); //x축 라인 그리기
}

D3DXMatrixIdentity(&matWorld); //매트릭스를 단위 행렬로 리셋
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //변환 매트릭스 전달
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 4, 1); //y축 그리기

//변환이 적용되지 않은 상태에서 삼각형 그리기
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 6, 1);

//matWorld를 x축으로 100만큼 이동 변환 매트릭스로 만들기
D3DXMatrixTranslation(&matWorld, 100.0, 0.0, 0.0);
//매트릭스 변수 추가
D3DXMATRIXA16 matWorld2;
//matWorld2를 y축을 중심으로 -45도 회전하는 매트릭스로 만들기
D3DXMatrixRotationY(&matWorld2, -45.0f * (D3DX_PI / 180.0f));
//matWoirld를 이동 후 회전을 하는 매트릭스로 만들어주는 곱하기
D3DXMatrixMultiply(&matWorld, &matWorld2, &matWorld);
//matWorld2를 y축 방향으로 2배 확대하는 매트릭스로 만들기
D3DXMatrixScaling(&matWorld2, 2.0f, 1.0f, 1.0f);
//matWorld에 확대 기능까지 추가하기 위한 곱하기
D3DXMatrixMultiply(&matWorld, &matWorld2, &matWorld);
//복합변환이 적용된 최종 매트릭스 matWorld를 장치로 전달
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

//삼각형 출력
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 6, 1);

////라이트 설정
SetupLight();

//재질 설정
D3DMATERIAL9 mtrl; //재질 설정용 구조체

ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
//확산광과 주변광 재질에 대하여 r,g,b,a 값을 설정
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f; //노란색
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; //노란색
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
//설정한 재질을 적용
g_pd3dDevice->SetMaterial(&mtrl);

//삼각형 출력을 위한 이동
D3DXMatrixTranslation(&matWorld, 0, 0, -100); //앞쪽(-z방향)으로 이동
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //변환 매트릭스 전달

//삼각형 출력을 위한 버텍스 버퍼 지정
g_pd3dDevice->SetStreamSource(0, g_pVBLight, 0, sizeof(LIGHTVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_LIGHTVERTEX); //버텍스 포맷 지정
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); //삼각형 2개 그리기

//x파일 출력
D3DXMatrixScaling(&matWorld, 100.0f, 100.0f, 100.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

g_XFile.XFileDisplay(g_pd3dDevice);

D3DXMatrixScaling(&matWorld, 1.0f, 1.0f, 1.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

////텍스쳐 출력

//조명 중지
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

//텍스쳐 설정
g_pd3dDevice->SetTexture(0, g_pTexture);

//텍스쳐 출력 환경 설정
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

//출력할 버텍스 버퍼 설정
g_pd3dDevice->SetStreamSource(0, g_pVBTexture, 0, sizeof(TEXTUREVERTEX));
//FVF 값 설정
g_pd3dDevice->SetFVF(D3DFVF_TEXTUREVERTEX);
//사각형 영역(삼각형 2개를 이용하여 사각형 영역을 만들었음) 출력
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

//텍스쳐 설정 해제
g_pd3dDevice->SetTexture(0, NULL);

//화면 그리기 끝
g_pd3dDevice->EndScene();
}

//백버퍼의 내용을 화면으로 보낸다.
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

//************************************************************
// 이름: InitGeometry()
// 기능: 버텍스 버퍼를 생성한 후 버텍스로 채운다.
//************************************************************

HRESULT InitGeometry()
{
//삼각형을 그리기 위하여 3개점에 대한 임시 배열을 만든다.
CUSTOMVERTEX vertices[]=
{
{-200.0f, 0.0f, 0.0f, 0xff00ff00,}, //x축 라인을 위한 버텍스
{200.0f, 0.0f, 0.0f, 0xff00ff00,},
{0.0f, 0.0f, -200.0f, 0xffffff00,}, //z축 라인을 위한 버텍스
{0.0f, 0.0f, 200.0f, 0xffffff00, },
{0.0f, -200.0f, 0.0f, 0xffff0000, },//y축 라인을 위한 버텍스
{0.0f, 200.0f, 0.0f, 0xffff0000, },
{0.0f, 50.0f, 0.0f, 0xffff0000, }, //삼각형의 첫번째 버텍스
{-50.0f, 0.0f, 0.0f, 0xffff0000, }, //삼각형의 두번째 버텍스
{50.0f, 0.0f, 0.0f, 0xffff0000, }, //삼각형의 세번째 버텍스
};

//버텍스 버퍼를 생성한다.
//각 버텍스의 포맷은 D3DFVF_CUSTOMVERTEX라는 것도 전달
if(FAILED(g_pd3dDevice->CreateVertexBuffer(9*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL)))
{
return E_FAIL;
}

//버텍스 버퍼에 락을 건 후 버텍스를 넣는다.
VOID* pVertices;
if(FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
return E_FAIL;
memcpy(pVertices, vertices, sizeof(vertices));
g_pVB->Unlock();

return S_OK;
}

//************************************************************
// 이름: InitGeometryLight()
// 기능: 조명 처리를 위한 버텍스 버텍스 버퍼를 생성한 후 버텍스로 채운다.
//************************************************************

HRESULT InitGeometryLight()
{
//버텍스 버퍼를 생성한다.
if( FAILED(g_pd3dDevice->CreateVertexBuffer(6*sizeof(LIGHTVERTEX),
0, D3DFVF_LIGHTVERTEX,
D3DPOOL_DEFAULT, &g_pVBLight, NULL)))
{
return E_FAIL;
}

//버텍스 버퍼에 락을 건 후 버텍스를 넣는다.
LIGHTVERTEX* pVertices;
if(FAILED(g_pVBLight->Lock(0, 0, (void**)&pVertices, 0)))
{
return E_FAIL;
}

//삼각형 1
pVertices[0].position = D3DXVECTOR3(-30.0f, 0.0f, -30.0f);
pVertices[1].position = D3DXVECTOR3(-60.0f, 30.0f, 0.0f);
pVertices[2].position = D3DXVECTOR3(-90.0f, 0.0f, 30.0f);

//삼각형1에 대한 노말 구하기
D3DXVECTOR3 p1 = pVertices[1].position - pVertices[0].position;
D3DXVECTOR3 p2 = pVertices[2].position - pVertices[0].position;
D3DXVECTOR3 pNormal;
D3DXVec3Cross(&pNormal, &p2, &p1);

//삼각형1의 각 버텍스에 노말 값 할당
pVertices[0].normal = pNormal;
pVertices[1].normal = pNormal;
pVertices[2].normal = pNormal;

//삼각형 2
pVertices[3].position = D3DXVECTOR3(90.0f, 0.0f, 30.0f);
pVertices[4].position = D3DXVECTOR3(60.0f, 30.0f, 0.0f);
pVertices[5].position = D3DXVECTOR3(30.0f, 0.0f, -30.0f);

//삼각형1에 대한 노말 구하기
p1 = pVertices[4].position - pVertices[3].position;
p2 = pVertices[5].position - pVertices[3].position;
pNormal;
D3DXVec3Cross(&pNormal, &p2, &p1);

//삼각형1의 각 버텍스에 노말 값 할당
pVertices[3].normal = pNormal;
pVertices[4].normal = pNormal;
pVertices[5].normal = pNormal;

g_pVBLight->Unlock();

return S_OK;
}

//************************************************************
// 이름: InitGeometryTexture()
// 기능: 텍스쳐 출력을 위한 버텍스 버퍼를 생성한 후 버텍스로 채운다.
//************************************************************

HRESULT InitGeometryTexture()
{
//텍스쳐 로딩
if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, "C:/images/Tree01s.dds", &g_pTexture)))
{
return E_FAIL;
}

//버텍스 버퍼 생성
if(FAILED(g_pd3dDevice->CreateVertexBuffer(4*sizeof(TEXTUREVERTEX), 0,
D3DFVF_TEXTUREVERTEX, D3DPOOL_DEFAULT, &g_pVBTexture, NULL)))
{
return E_FAIL;
}

//버텍스 버퍼 설정
TEXTUREVERTEX* pVertices;
if(FAILED(g_pVBTexture->Lock(0, 0, (VOID**)&pVertices, 0)))
{
return E_FAIL;
}

pVertices[0].position = D3DXVECTOR3(-50, 100, 100); //버텍스 위치
pVertices[0].color = 0xffffffff; //버텍스 알파 및 색상
pVertices[0].tu = 0.0f; //버텍스 U텍스쳐 좌표
pVertices[0].tv = 0.0f; //버텍스 V텍스쳐 좌표

pVertices[1].position = D3DXVECTOR3(50, 100, 100); //버텍스 위치
pVertices[1].color = 0xffffffff; //버텍스 알파 및 색상
pVertices[1].tu = 1.0f; //버텍스 U텍스쳐 좌표
pVertices[1].tv = 0.0f; //버텍스 V텍스쳐 좌표

pVertices[2].position = D3DXVECTOR3(-50, 0, 100); //버텍스 위치
pVertices[2].color = 0xffffffff; //버텍스 알파 및 색상
pVertices[2].tu = 0.0f; //버텍스 U텍스쳐 좌표
pVertices[2].tv = 1.0f; //버텍스 V텍스쳐 좌표

pVertices[3].position = D3DXVECTOR3(50, 0, 100); //버텍스 위치
pVertices[3].color = 0xffffffff; //버텍스 알파 및 색상
pVertices[3].tu = 1.0f; //버텍스 U텍스쳐 좌표
pVertices[3].tv = 1.0f; //버텍스 V텍스쳐 좌표

g_pVBTexture->Unlock();

return S_OK;
}

//************************************************************
// 이름: InitGameData()
// 기능: 게임에 관련된 각종 데이터를 초기화 한다.
//************************************************************

HRESULT InitGameData()
{
g_XFile.XFileLoad(g_pd3dDevice, "C:/images/tiny.x");

return S_OK;
}

//************************************************************
// 이름: MsgProc()
// 기능: 윈도우 메세지 핸들러
//************************************************************

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup(); //프로그램 종료시 객체 해제를 위해 호출
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render(); //화면 출력을 담당하는 렌더링 함수 호출
ValidateRect(hWnd, NULL);
return 0;
}

return DefWindowProc(hWnd, msg, wParam, lParam);
}

//************************************************************
// 이름: WinMain()
// 기능: 프로그램의 시작점
//************************************************************

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//윈도우 클래스 변수 선언 및 설정
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc,
0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"D3D Game", NULL};
//윈도우 클래스 등록
RegisterClassEx(&wc);

//윈도우 생성
HWND hWnd = CreateWindow("D3D Game", "D3D Game Program",
WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
GetDesktopWindow(), NULL, wc.hInstance, NULL);

//Direct3D 초기화에 성공하면 진행하고, 실패하면 종료한다.
if(SUCCEEDED(InitD3D(hWnd)) && //Direct3D의 초기화도 성공
SUCCEEDED(InitGeometry()) && //버텍스 버퍼 생성
SUCCEEDED(InitGeometryLight()) && //라이트 버텍스 버퍼 생성
SUCCEEDED(InitGeometryTexture()) && //텍스쳐 버텍스 버퍼 생성
SUCCEEDED(InitGameData())) //기타 게임 데이터 로드
{
//윈도우 출력
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);

//메세지 루프 시작하기
MSG msg;
ZeroMemory( &msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
//메세지가 있으면 가져온다.
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else
Render(); //메세지가 없을때는 항상 Render()를 호출
}
}

UnregisterClass("D3D Game", wc.hInstance);
return 0;
}














// XFileUtil.cpp : CXFileUtil 클래스
//
//***************************************************************************

#include "XFileUtil.h"

CXFileUtil::CXFileUtil()
{
g_pMesh = NULL; //메쉬 객체
g_pMeshMaterials = NULL; //메쉬에 대한 재질
g_pMeshTextures = NULL; //메쉬에 대한 텍스쳐
g_dwNumMaterials = NULL; //메쉬 재질의 갯수
}

CXFileUtil::~CXFileUtil()
{
}

int CXFileUtil::XFileLoad(LPDIRECT3DDEVICE9 pD3DDevice, char *xFileName)
{
LPD3DXBUFFER pD3DXMtrlBuffer;

//x파일을 로딩한다.
if(FAILED(D3DXLoadMeshFromX(xFileName, D3DXMESH_SYSTEMMEM,
pD3DDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,
&g_pMesh)))
{
MessageBox(NULL, "X파일 로드 실패", "메쉬로드 실패", MB_OK);
return E_FAIL;
}

//텍스쳐 파일이 다른 폴더에 있을 경우를 위하여 텍스쳐 패스 위치 얻기
char texturePath[256];
if(strchr(xFileName, '/') == NULL) //현재 폴더의 경우
{
wsprintf(texturePath, "./");
}else{
char temp[256], *pChar;
strcpy_s(temp, xFileName);
_strrev(temp);
pChar = strchr(temp, '/');
strcpy_s(texturePath, pChar);
_strrev(texturePath);
}

///x 파일 로딩 코드
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];

for(DWORD i=0;i<g_dwNumMaterials; i++)
{
//재질 복사
g_pMeshMaterials = d3dxMaterials.MatD3D;

//재질에 대한 앰비언트 색상 설정(D3DX가 해주지 않으므로)
g_pMeshMaterials.Ambient = g_pMeshMaterials.Diffuse;

g_pMeshTextures = NULL;
//텍스쳐 파일이 존재하는 경우
if(d3dxMaterials.pTextureFilename != NULL &&
lstrlen(d3dxMaterials.pTextureFilename) > 0)
{
//경로 + 텍스쳐 파일 이름 만들기
char tempFile[256];
wsprintf(tempFile, "%s%s", texturePath, d3dxMaterials.pTextureFilename);
//텍스쳐 생성
if(FAILED(D3DXCreateTextureFromFile(pD3DDevice,
tempFile, &g_pMeshTextures)))
{
g_pMeshTextures = NULL;
}
}
}

//재질 버퍼 사용 끝 & 해제
pD3DXMtrlBuffer->Release();

return S_OK;
}
int CXFileUtil::XFileDisplay(LPDIRECT3DDEVICE9 pD3DDevice)
{
//메쉬 출력
for(DWORD i=9; i<g_dwNumMaterials; i++)
{
//현재 Sub Set에 대한 재질 설정
pD3DDevice->SetMaterial(&g_pMeshMaterials[i]);
//현재 Sub Set에 대한 텍스쳐 설정
pD3DDevice->SetTexture(0, g_pMeshTextures[i]);

//Sub Set 그리기
g_pMesh->DrawSubset(i);
}

pD3DDevice->SetTexture(0, NULL);

return 0;
}










//XFile.h
//********************************************************
#pragma once

#include<d3dx9.h>

class CXFileUtil
{
private:
//x 파일 로드용 변수
LPD3DXMESH g_pMesh; //메쉬 객체
D3DMATERIAL9* g_pMeshMaterials; //메쉬에 대한 재질
LPDIRECT3DTEXTURE9* g_pMeshTextures; //메쉬에 대한 텍스쳐
DWORD g_dwNumMaterials; //재질의 수

public:
int XFileDisplay(LPDIRECT3DDEVICE9 pD3DDvice);
int XFileLoad(LPDIRECT3DDEVICE9 pD3DDevice, char *xFileName);
CXFileUtil();
virtual ~CXFileUtil();
};



어째서인지 X파일을 화면에 띄우질 않습니다.
C:\images 에 tiger.x 파일이랑 tiger.bmp, tree.dds를 넣엇습니다. (저 3파일은 SDK에 샘플로 있는겁니다.)

책보고 하는데 어떻게 할 도리가 없습니다. (5번정도 훝어봤는데 다른점을 못찾겟습니다.)

F9눌러서 확인해봤는데 로딩은 그냥 넘어가고 X파일을 출력하는데서 문제가 있는것 같습니다.

그리고 어느 게시판에 질문을 해야할지...
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Re: X파일 출력실패

Post by 류광 »

acediasecury wrote: 책보고 하는데 어떻게 할 도리가 없습니다. (5번정도 ㅤㅎㅜㅌ어봤는데 다른점을 못찾겟습니다.)

F9눌러서 확인해봤는데 로딩은 그냥 넘어가고 X파일을 출력하는데서 문제가 있는것 같습니다.

그리고 어느 게시판에 질문을 해야할지...
GPG 3권 글 4.5에 저런 코드가 있던가요? 몇 페이지인지요?
acediasecury
Posts: 4
Joined: 2009-12-31 11:10

비슷한...

Post by acediasecury »

그나마 비슷한 분야 쪽에다가 올렷는데요...
Zeprod
Posts: 480
Joined: 2006-11-04 16:24
Location: Creaty Networks
Contact:

4.5는... 삼각형 스트립생성에 대한 내용이네요.

Post by Zeprod »

X 파일하고는 연관이 없는 파트인 것 같습니다.

지금은 GPG보다 DX Tutorial. Mesh 쪽을 확인하시는게 더 나을 것 같네요.
세상이 기다리는 나만의 SHOW!
----------------------------------------------
Zeprod 홈 : http://Zeprod.org
Project. Creaty : http://Creaty.net/
Creaty 게임제작 커뮤니티 : http://Creaty.net/game/
----------------------------------------------
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Re: 비슷한...

Post by 류광 »

acediasecury wrote:그나마 비슷한 분야 쪽에다가 올렷는데요...
이 정도로는 안 됩니다.... 임시보관소로 이동했습니다.
Post Reply