최상단

컨텐츠

2. Direct3D

글 정보

Category
● 프로그래밍/다이렉트 후킹[D3D]
2014.05.14 00:21

본문

2. Direct3D
 2-1. Direct3D 란?
 Direct3D는 마이크로소프트의 DirectX API에서 3차원 그래픽 연산과 출력을 담당하는 부분
이다. 마이크로소프트의 윈도 운영체제(윈도 95이상)에서만 작동하며, Xbox와 Xbox360 게임
콘솔의 그래픽 API로 사용되고 있다. Direct3D와 비슷한 역할을 하는 API로는 OpenGL이
있으며 역할은 같지만 각자가 서로 다른 장단점을 가지고 있다.
출처 : http://ko.wikipedia.org/wiki/Direct3D
요약해보자면 3D게임이나 3D를 요구하는 작업에서 뭔가를 그릴 때 사용하는 게 Direct3D이다.

 

void init( void )
{
    g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );  
        if( g_pD3D == NULL )

         {
                // TO DO: Respond to failure of Direct3DCreate8
                return;

         }
 
    D3DDISPLAYMODE d3ddm;  


    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )

         {
                // TO DO: Respond to failure of GetAdapterDisplayMode
                return;

         }
 
        HRESULT hr;  
        if( FAILED( hr = g_pD3D->CheckDeviceForma( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,             d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, 
 D3DRTYPE_SURFACE, D3DFMT_D16 ) ) )

         {
                if( hr == D3DERR_NOTAVAILABLE )

                         // POTENTIAL PROBLEM: We need at least a 16-bit z-buffer!

                         return;

         }
 
        // 

 // Do we support hardware vertex processing? if so, use it.

         // If not, downgrade to software.

         //  
        D3DCAPS9 d3dCaps;  
        if( FAILED( g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT,                                                D3DDEVTYPE_HAL, &d3dCaps ) ) )

         {
                // TO DO: Respond to failure of GetDeviceCaps
                return;

         }
 
        DWORD dwBehaviorFlags = 0;  
        if( d3dCaps.VertexProcessingCaps != 0 )
                dwBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;         else
                dwBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;  
        //

         // Everything checks out - create a simple, windowed device.

         //  
        D3DPRESENT_PARAMETERS d3dpp;

         memset(&d3dpp, 0, sizeof(d3dpp));  
    d3dpp.BackBufferFormat 

      = d3ddm.Format;
    d3dpp.SwapEffect

             = D3DSWAPEFFECT_DISCARD;
    d3dpp.Windowed

               = TRUE;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;  
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,                                       dwBehaviorFlags, &d3dpp, &g_pd3dDevice ) ) )

         {
                return;

         }
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void shutDown( void )
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();  
    if( g_pD3D != NULL )
        g_pD3D->Release();
}
//----------------------------------------------------------------------------- 
//-----------------------------------------------------------------------------
void render( void )
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,                          D3DCOLOR_COLORVALUE(0.0f,1.0f,0.0f,1.0f), 1.0f, 0 );  
    g_pd3dDevice->BeginScene();  
    g_pd3dDevice->EndScene();  
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

}

 

[출처] http://www.codesampler.com/dx9src.htm

위의 sample source는 D3D 관련 함수 부분만 첨부했다.
D3D 코딩 경험이 없다면 한번 보는 것이 좋다. 이 소스코드를 후킹 관점에서 본다면
Direct3DCreate9(), CreateDevice(), EndScene() 이므로 다른 함수들은 물론 이 함수들이
낯설다면 msdn을 통해 함수에 대해 꼭 숙지하고 넘어가자.


 

 

저작자 표시 비영리 변경 금지
신고

트랙백과 댓글 여닫기

트랙백 0 댓글 0

페이징

PREV NEXT

1 1 2 3 4 5 6 7 8 9 ··· 14

TOP

티스토리 툴바