안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

레이블이 Direct X인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Direct X인 게시물을 표시합니다. 모든 게시물 표시

2011년 4월 26일 화요일

d3d 기본 창 띄우기

#include <d3d9.h>

#include <string>
#pragma comment(lib, "d3d9.lib")
using namespace std;
//전역변수
LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 랜더링에 사용 될 D3D 디바이스

///Direct3D 초기화
HRESULT InitD3D(HWND hWnd)
{
///디바이스를 생성하기 위한 D3D 객체 생성

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; // 가장 효율적인 SWAP 효과
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //현재 바탕화면 모드에 맞춰서 후면 버퍼 생성

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

///디바이스 상태 정보를 처리할 경우 여기에서 함

return S_OK;
}

///초기화 된 객체들 소거

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

//화면 그리기
VOID Render()
{
if(NULL == g_pd3dDevice)
return;

//후면 버퍼를 파란색으로 지운다.
g_pd3dDevice->Clear(0,NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,255),1.0f,0);

//랜더링 시작
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//실제 랜더링 명령들이 나열될 곳
//랜더링 종료
g_pd3dDevice->EndScene();
}

//후면 버퍼가 보이는 화면으로
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

//윈도우즈 프로시저

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);
}

//프로그램의 시작점
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
string className = "D3D Tutorial";
wstring str2(className.length(), L' '); // Make room for characters

// Copy string to wstring.
copy(className.begin(), className.end(), str2.begin());
//...
//윈도우 클래스 등록
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
(LPCTSTR)"D3D Tutorial", NULL};
RegisterClassEx(&wc);
//윈도우 생성
HWND hWnd = CreateWindow((LPCTSTR)"D3D Tutorial", (LPCTSTR)"CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 600, 480,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
//Direct3D 초기화

if(SUCCEEDED(InitD3D(hWnd)))
{
//윈도우 출력
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//메시지 루프
MSG msg;
while(GetMessage(&msg, NULL, 0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//등록된 클래스 소거
UnregisterClass((LPCTSTR)"D3D Tutorial", wc.hInstance);
return 0;
}


P.S 창 이름이 한문으로 깨져서 나온다.

이유를 아시는 분은 꼭 댓글로 가려쳐 줬으면 합니다.

이 코드 인터넷 상에 많이 떠도는 데

붙여 넣기가 안되도록 많이 들 막아 놨더군요.

인터넷 세상 공유하면서 삽시다.

2011년 4월 5일 화요일

directx 9 튜터리얼

#include <d3d9.h>
//-----------------------------------------------------------------------------
// 전역 변수
//-----------------------------------------------------------------------------
LPDIRECT3D9         g_pD3D = NULL;
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; 
//-----------------------------------------------------------------------------
// Device 생성 및 초기화
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) ); /// 반드시 ZeroMemory로 깨끗이 초기화 해주어야 함
    d3dpp.Windowed = TRUE;  /// 창 모드로 생성
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; /// 가장 효율적인 SWAP 효과
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;  /// 현재 바탕화면 모드에 맞춤

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
    return S_OK;
}
//-----------------------------------------------------------------------------
// Device 해제
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();
    if( g_pD3D != NULL )
        g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// 랜더링
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        g_pd3dDevice->EndScene();
    }

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

create Directx Object

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

#pragma comment()

2. #pragma comment()

#pragma comment()로 사용할 수 있는 명령은 여러 개가 있는데, 그 중 가장 대표적인 것이
#pragma comment(lib, "*.ilb")로 해당 라이브러리를 링크 시켜준다.

예를 들어 VC++6.0에서 DirectDraw를 사용하기 위해서는 Project>>Settings의 Link 탭으로 이동하여
Object/library modules 항목란에 ddraw.lib 와 dxguid.lib를 적어 넣어 lib 파일을 링크해 줘야 한다.

하지만,

#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "ddraw.lib")
와 같이 소스코드 내에서 명시적으로 지정을 하면, Project>>Settings... 의 과정을 거치지 않고도 라이브러리를
링크할 수 있다.