블로그 이미지
by Thunders

NOTICE

CALENDAR

«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

TAG CLOUD

  • Total :
  • Today :  | Yesterday :

CATEGORY

분류 전체보기 (30)
Enjoy (1)
Study (0)
Movies (0)
Trip (0)
Sports (5)
Interest News (6)
Samsung software M.. (1)
Computer Programme.. (1)
with my Girl (0)
Computer Engineeri.. (16)
MFC (4)
C# (0)
WPF (1)
Google Earth API (0)
C (0)
DirectX (8)
TCP/IP (2)
AJAX (0)
Algorithm (0)
Regular Expression (0)
openGL (1)
Diary_in my life (0)

RECENT ARTICLE

RECENT COMMENT

ARCHIVE



  1. 2009.08.14
    Direct Draw 초기화 및 종료
  2. 2009.04.24
    DirectX를 이용한 정 사면체 Sierpinski Gasket
  3. 2009.04.21
    X 파일 로드 예제
  4. 2009.03.31
    핸들에 대한 이해
  5. 2009.03.31
    D3D 디바이스 생성 및 초기화
  6. 2009.03.31
    directX에서 d3dx9dt.lib 파일 관련 에러
  7. 2009.03.31
    visual studio directX sdk 와 링크 하기
  8. 2009.03.31
    3D 기본 용어와 이론

  Direct X에서 가장 기본적이고 중요하며, M/S에서 투자를 가장 많이 하고 있는 부분입니다. 모든 화면 처리는 최종적으로 DirectDraw를 통해 이루어지며, 각종 애니메이션과 배경등에 대한 처리를 위한 기본적인 설정작업은 여기에서 이루어지게 됩니다. 즉, 팔레트라는 요소를 직접 제어하게 해 주는 요소 입니다. 이 처럼 DirectDraw를 어떻게 사용하느냐에 따라, 게임의 속도가 판가름 난다고 해도 과언이 아닌 아주 중요한 부분입니다. DirectDraw를 능숙하게 다루기 위해서는 표면처리에 대한 개념을 확실히 알고 넘어가는 것이 중요합니다. 즉, 전면 표면(Primary Surface), 후면 표면(Back Surface), 그리고 각종 오프스크린(OffScreen)에 대한 처리를 능숙하게 할 수 있다면 게임에서 절반 정도는 처리를 할 수 있는 능력이 생기게 됩니다. 처음에는 H/W의 접근을 기계어(Assembly, C 등)를 이용하여 접근 하였습니다. 하지만 Direct X를 이용하면서 부터는 이들에 대한 접근도 훨씬 쉽게 처리할 수 있게 되었습니다. 다음은 DirectDraw를 사용하기 위한 기본적인 설정 부분을 설명하겠습니다. 나머지 부분은 게임 제작 가이드라는 항목에서 자세히 설명하도록 하겠습니다.
DirectDraw 초기화 및 종료
1. DirectDraw 객체 생성하기
DirectDraw를 사용하기 위해서는* lpGUID, LPDIRECTDRAW FAR * lplpDD,
   IUnknown FAR * pUnkOuter );
lpGUID : DirectDraw 객체를 생성하기 위한 Display device의 GUID(Global Unique Identifier).
인자가 NULL 이면, DirectDrawCreate() 함수는 Display device를 활성화 하기 위해 DirectDraw 객체를 생성한다.

lplpDD : DirectDraw 객체를 저장하고 있는 포인터를 지시하는 포인터. 이 포인터는 DirectDraw를 초기화 할 때 사용한다.

pUnkOuter : 이 인자는 많은 DirectX 함수를 호출할 때 사용된다. 미래에 사용될 것에 대한 확장형으로, 현재는 NULL을 대입하면 된다.

다음은 이들의 사용예이다.
HRESULT ddrval; ...
ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if(ddrval != DD_OK) // DD_OK가 아니면 DirectDraw 객체 생성 실패
{
    error 처리 routine 과 return FALSE;
}
2. Process 독점하기
일단 게임을 위해서는 Process를 독점할 필요가 있다. 이는 프로그램이 CPU를 독점하여 수행속도를 빨리하며, 다른 응용 프로그램과의 연계등에 대한 신경을 쓸 필요가 없게 하기 위함이다. CPU를 독점하기 위해서는 아래와 같이 SetCooperativeLevel() 함수를 써야 한다.

HRETULT SetCooperativeLevel (LPDIRECTDRAW lpDD, HWND hWnd,
DWORD dwFlags);
lpDD : 초기화에서 설명한 DirectDraw 객체에 대한 포인터
hWnd : Windows handle. 보통 이 handle은 작업전환(ALT+TAB key)에 관한
     message를 보낼 때 사용한다.
dwFlags : 매개 변수의 적용 방법은 다음과 같다.
dwFlags 내 용
DDSCL_ALLOWMODEX ModeX(해상도 : 320 × 320, 320 × 400)를 지원
DDSCL_ALLOWREBOOT 전체 화면을 사용할 때 Ctrl + Alt + Del key 가능
DDSCL_EXCLUSIVE 해상도를 바꾸거나 flipping 작업을 할 때 사용
DDSCL_FULLSCREEN GDI를 사용하지 않는 전체화면 모드 사용 가능
DDSCL_NORMAL 일반적인 Windows 창에서 프로그램이 가능
DDSCL_NOWINDOWCHANGES 활성화 된 프로그램의 Windows 창 변경이 불가능
HRESULT ddrval; ddrval = SetCooperativeLevel ( hWnd, DDSCL_EXCLUSIVE |
     DDSCL_FULLSCREEN );
if(ddrval != DD_OK) // DD_OK가 아니면 SetCooperativeLevel() 실패
{
     error 처리 routine 과 return FALSE;
}
3. Video Mode 설정
DirectDraw는 320 × 320, 320 × 400, 640 × 480 등의 해상도를 지원하며, 색상도 256 color(8 bits)
에서 true color(24 bits)까지 지원이 된다.

HRESULT SetDisplayMode ( LPDIRECTDRAW lpDD, DWORD dwWidth,
     DWORD dwHeight, DWORD dwBpp );

lpDD : DirectDraw 객체의 포인터
dwWidth, dwHeight : 가로 × 세로의 해상도
dwBpp : color 수 -> Bpp(Bit per pixel)

HRESULT ddrval;
ddrval = lpDD->SetDisplayMode ( 640, 480, 8 ); // 해상도 : 640 × 480, 256 color 사용
if(ddrval != DD_OK) // DD_OK가 아니면 SetDisplayMode() 실패
{
     error 처리 routine 과 return FALSE;
}
4. DirectDraw 종료하기
DirectDraw를 초기화한 경우 프로그램을 종료하기 전에 반드시 DirectDraw 객체와 지금까지 생성한 모든 Direct 객체들을 종료해야 한다.

void DDDestroy()
{
lpPrimary->Release(); // 자식 Class ( 즉, lpDD 내부에 lpPrimary가 존재 )
lpDD->Release(); // 부모 Class
}
표면(surface) 생성
표면이란 이미지(Image)를 저장하기 위한 메모리의 특정 부분을 말하며, 화면과 바로 연결된 표면(Surface)과 그렇지 않은 표면(Offscreen)으로 나누어 진다.
1. 1차 표면 ( 전면, Primary Surface )
우리가 보는 화면은 보통 1차 표면(전면, Primary Surface)이라 불리는 표면과 동일하다. 즉, 전면에 어떤 값을 대입하면, 이에 대한 내용이 화면에 그대로 반영된다. 따라서 전면의 크기는 화면 해상도와 칼라 수에의해 결정된다.
2. 2차 표면 (후면, Back Surface)
후면은 화면과 직접 연결되어 있지 않기 때문에 그리는 내용이 바로 표면에 나타나지는 않는다. 그러나 애니메이션(Animation)과 같은 연속적인 그림을 보여 주려면, 후면에 한 장의 완전한 그림을 그린 후 이를 전면과 서로 바꾸어서 보여주어야 한다. 이 처럼 화면에 바로 나타나지는 않지만, 다음에 보여주어야 할 내용을 저장하는 장소로서 사용이 가능하다.
3. 표면 버퍼 ( Offscreen )
화면에 보이는 표면이 아니라, 그림 이미지(Image)를 저장하는 임시 기억 공간. 저장된 이미지는 전면이나 후면에 복사를 하여 화면에 보여줄 수 있게 된다.
4. 표면 만들기
표면을 만들려면 먼저 DirectDraw를 초기화 해야 한다 그리고 나서 DirectDraw 객체에 대한 표면을 생성한다. 여기서는 DDInit() 라는 함수로 DirectDraw를 초기화 하고 표면을 생성하는 방법을 정리하였다.
#include <windows.h>
#include <ddraw.h>

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSprimary;
LPDIRECTDRAWSURFACE lpDDSBack;
HRESULT ddrval;

BOOL DDInit(HWND hWnd) // DirectDraw 객체 생성
{

ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if(ddrval != DD_OK) // DD_OK가 아니면 DirectDraw 객체 생성 실패
{
     return FALSE;
}
ddrval = SetCooperativeLevel ( hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if(ddrval != DD_OK) // DD_OK가 아니면 SetCooperativeLevel() 실패
{
     return FALSE;
}

ddrval = lpDD->SetDisplayMode ( 640, 480, 8 ); // 해상도와 칼라 설정
if(ddrval != DD_OK) // DD_OK가 아니면 SetDisplayMode() 실패
{
     return FALSE;
}

// 1차 표면 생성
DDSURFACEDESC ddsd;
ZeroMemory (&ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FILP | DDSCAPS_COMPLEX;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);

if(ddrval != DD_OK)
{
     return FALSE;
}

// 2차 표면 생성
DDSCAPS ddscaps;
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);

if(ddrval != DD_OK)
{
     return FALSE;
}

return TRUE;

}
back

 

And


알고리즘은 간단하다.

1. 삼각형 내부에서 무작위로 한 개의 시작점을 잡는다.
2. 무작위로 세 개의 정점 중 한 개를 선택한다.
3. 시작점과 무작위로 선택된 정점의 중간 점을 잡는다.
4. 그 위치에 작은 원 같은 표지를 함으로써 새로운 점을 표시.
5. 이 새로운 점을 시작점으로 대치
6. 단계 2로 돌아간다.

간단한 마우스 / 키보드 입출력을 넣었지만
완벽하지는 못하다.








'Computer Engineering > DirectX' 카테고리의 다른 글

Direct Draw 초기화 및 종료  (0) 2009.08.14
X 파일 로드 예제  (0) 2009.04.21
핸들에 대한 이해  (0) 2009.03.31
D3D 디바이스 생성 및 초기화  (0) 2009.03.31
directX에서 d3dx9dt.lib 파일 관련 에러  (0) 2009.03.31
And

약간의 도움이 될 듯 하다.









And

핸들(handle)이란 구체적인 어떤 대상에 붙여진 번호이며 문법적으로는 32비트의 정수값이다. 도스 프로그래밍에서는 거의 유일하게 파일 핸들만이 사용되었으며 그래서 도스에서 핸들은 곧 파일 핸들을 의미하는 경우가 많았다. 그러나 윈도우즈에서는 여러 가지 종류의 핸들이 사용되고 있다. 만들어진 윈도우에는 윈도우 핸들(hWnd)을 붙여 윈도우를 번호로 관리하며 아직은 잘 모르겠지만 DC에 대해서도 핸들을 사용하고 논리적 펜, 브러시에도 핸들을 붙여 관리한다. 심지어 메모리를 할당할 때도 할당한 메모리의 번지를 취급하기보다는 메모리에 번호를 붙인 메모리 핸들을 사용한다. 왜 이렇게 핸들을 자주 사용하는가 하면 대상끼리의 구분을 위해서는 문자열보다 정수를 사용하는 것이 훨씬 더 속도가 빠르기 때문이다.

윈도우즈에서 핸들을 이렇게 많이 사용하므로 우리는 핸들의 일반적인 특성에 관해서 미리 숙지하는 것이 좋다. 핸들은 일반적으로 다음과 같은 특징이 있다.

① 일단 핸들은 정수값이며 대부분의 경우 32비트값이다. 핸들을 사용하는 목적은 오로지 구분을 위한 것이므로 핸들끼리 중복되지 않아야하며 이런 목적으로는 정수형이 가장 적합하다.

② 핸들은 운영체제가 발급해 주며 사용자는 쓰기만 하면 된다. 예를 들어 윈도우를 만들거나 파일을 열면 운영체제는 만들어진 윈도우나 열려진 파일에 핸들을 붙여준다. 사용자는 이 핸들을 잘 보관해 두었다가 해당 윈도우나 파일을 다시 참조할 때 핸들을 사용하면 된다. 사용자가 직접 핸들을 만들 경우란 없다.

③ 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다. 만약 이렇게 된다면 핸들은 구분을 위해 사용할 수 없을 것이다. 물론 다른 종류의 핸들끼리는 중복된 값을 가질 수도 있다.

④ 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다. 핸들은 크고 작음의 성질을 가지는 숫자가 아니라 단순한 표식일 뿐이다. 핸들형 변수를 만들어 핸들을 대입받아 쓰고 난 후에는 버리면 된다.

윈도우즈에서 핸들은 예외없이 접두어 h로 시작되며 핸들값을 저장하기 위해 별도의 데이터형까지 정의해 두고 있다. HWND, HPEN, HBRUSH, HDC 등이 핸들을 담기 위한 데이터형들이며 모두 부호없는 정수형이다.

And

3D 2개월차 첫날..

 

* SIMD(Single Instruction Multiple Data)

     : 하나의 연산에서 여러개의 데이타를 처리한다.

 

* VGA 가속 얻는방법 2가지..

   1. T&L Engine  (Transform & Lighting)

         :  하드웨어 버텍스 프로세싱.. 칩셋이 박혀있다

   2. Vertex Shader

         : 소프트웨어 버텍스 프로세싱..  GPU 이용

 

DX90 한글판 도움말을 보면서 함수와 함수의 파라메터 등을 설명을 들었고..

그중에 중요한것만 추려서 정리를 해보면...

 

함수들 일단 나열함번 해보자..

Direct3DCreate9()

CreateDevice()

Clear()

BeginScene()

EndScene()

Present()

 

도움말을 봐도 한글이긴한데 알아먹기가 영 까탈스러워서 다시 정리를 해보면..

 

* Direct3DCreate9()

 IDirect3D9 *Direct3DCreate9( UINT SDKVersion )// D3D 객체생성함수

- SDKVersion
: 이 파라미터의 값은 D3D_SDK_VERSION 가 아니면 안된다.
성공했을 경우IDirect3D9 인터페이스의 포인터를 돌려준다.실패는 NULL 포인터를 돌려준다.

* IDirect3D9::CreateDevice()

 HRESULT CreateDevice(      

    UINT Adapter,
    D3DDEVTYPE DeviceType, 
    HWND hFocusWindow,     
    DWORD BehaviorFlags,     
    D3DPRESENT_PARAMETERS *pPresentationParameters,     
    IDirect3DDevice9** ppReturnedDeviceInterface );
 
- UINT Adapter
만들어질 IDirect3DDevice9 객체와 대응될 그래픽카드.
모니터가 한대이면 신경쓸필요 없다.
 
- DeviceType - 이용할 장치 타입
 D3DDEVTYPE_HAL = 하드웨어 가속을 사용.
 D3DDEVTYPE_REF = 디버깅때 설정하고 사용한다. S/W렌더링 H/W가속을 받지 않는다.
 
- hFocusWindow - 장치가 출력할 윈도우의 핸들
 
- BehaviorFlags 
 여러가지가 있지만.. 일단 중요도가 높은..
 D3DCREATE_HARDWARE_VERTEXPROCESSING // 정점 쉐이더를 지원할때 하드웨어 가속사용
 D3DCREATE_SOFTWARE_VERTEXPROCESSING // 정점 쉐이더를 지원할때 소프트웨어적 지원
 D3DCREATE_MIXED_VERTEXPROCESSING // H/W, S/W 가속을 프로그램중에 전환이 가능
 
- pPresentationParameters
 D3DPRESENT_PARAMETERS 구조체 주소.
 
- ppReturnedDeviceInterface
 IDirect3DDevice9 의 인터페이스를 갖고있는 포인터가 담겨진다.
 
* IDirect3DDevice9 인터페이스를 만드는데 필요한 구조체..
typedef struct _D3DPRESENT_PARAMETERS_
{
    UINT                BackBufferWidth;
    UINT                BackBufferHeight;
    D3DFORMAT      BackBufferFormat;
    UINT                BackBufferCount;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD              MultiSampleQuality;
    D3DSWAPEFFECT SwapEffect;
    HWND                hDeviceWindow;
    BOOL                Windowed;
    BOOL                EnableAutoDepthStencil;
    D3DFORMAT        AutoDepthStencilFormat;
    DWORD               Flags;
    UINT                FullScreen_RefreshRateInHz;
    UINT                PresentationInterval;
} D3DPRESENT_PARAMETERS;
 
BackBufferWidth/BackBufferHeight - 픽셀 단위의 백 버퍼 너비/높이.

BackBufferFormat - 백 버퍼의 픽셀 포맷. BackBufferFormat에 사용되는 인자는 밑에.

    D3DFMT_R8G8B8 - 24 Bit 픽셀 포맷.
    D3DFMT_X8R8G8B8 - 32 Bit 픽셀 포맷. 가장 왼쪽의 8비트는 사용되지 않음.
    D3DFMT_A8R8G8B8 - 32 Bit 픽셀 포맷. 가장 왼쪽의 8 Bit는 Apha 값.
    D3DFMT_A16B16G16R16F - 64 Bit 부동 소수점 픽셀 포맷. (순서가 BGR임인 것을 유의하세요.)
    D3DFMT_A32B32G32R32F - 128 Bit 부동 소수점 픽셀 포맷. (순서가 역시 BGR.)

BackBufferCount - 백 버퍼의 갯수. 보통, 1개만 생성하므로 "1"을 넘겨준다.

MutiSampleType - 멀티 샘플링을 사용할 것인지의 여부. (안티 앨리어싱을 할건지..)

MultiSampleQuality - 백버퍼에 멀티 샘플링을 어느정도 가할 것인지..(안티 앨리어싱 퀄리티)

SwapEffect - 플리핑 체인의 버퍼가 교환되는 방법을 지정하는 D3DSWAPEFFECT 열거형 멤버.
 Blt로 할지 아니면 Flip으로 할지 설정..
   보통, 그냥 D3DSWAPEFFECT_DISCARD를 지정해 준다.(백버퍼 내용날리고 다시 새로잡는다)


hDeviceWindow - 서비스와 연결된 윈도우 핸들. 드로잉의 대상이 될 애플리케이션 윈도우를 지정해 줌.

Windowed - 윈도우 모드로 실행할 경우 true, 풀 스크린 모드로 실행할 경우 false로 지정.

EnableAutoDepthStencil - Direct3D가 자동으로 깊이/스텐실 버퍼를 만들고 관리할것인 가의 여부. 보통 true.

AutoDepthStencilFormat - 깊이/스텐실 버퍼의 포맷을 지정한다.

    D3DFMT_D32 - 32 Bit 깊이 버퍼를 지정한다.
    D3DFMT_D24S8 - 24 Bit 깊이 버퍼를 지정하고 스텐실 버퍼로 8비트를 예약한다.
    D3DFMT_D24X8 - 24 Bit 깊이 버퍼를 지정한다.
    D3DFMT_D24X4S4 - 24 Bit 깊이 버퍼를 지정하고, 스텐실 버퍼로 4비트를 예약한다.
    D3DFMT_D16 - 16 Bit 깊이 버퍼를 지정한다.

Flags - 몇 가지 부가적인 특성들을 추가로 지정해 준다.

    D3DPRESENTFLAG_LOCKABLE_BACKBUFFER - 후면 버퍼를 잠글수 있음을 지정한다. 
    D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL - 다음 후면 버퍼를 시연한 뒤에 깊이/스텐실 버퍼를
 버리거나 무효화할 것임을 지정한다.

FullScreen_RefreshRateInHz - 재생률을 지정한다. 보통, D3DPRESENT_RATE_DEFAULT.

PresentationInterval - D3DPRESENT 집합의 멤버로, 시연간격을 지정한다.
                      보통, D3DPRESENT_INTERVAL_IMMEDIATE으로 정해주어 즉시 시연한다.
뭐.. 이렇게 많은데..걍 제로메모리 하고 대충 몇개만 셋팅해주면 된다..

 
* IDirect3DDevice9::Clear() 
 : 백버퍼 및 Z버퍼,스텐실 버퍼를 클리어한다.
 
HRESULT Clear(      

    DWORD Count, // 밑에 pRects 가 여러개일때 배열의 수.
    const D3DRECT *pRects, // 특정영역을 소거하고 싶을때 배열의 시작주소(NULL은 전체)
    DWORD Flags, // 소거할 표면지정
    D3DCOLOR Color,    // 백버퍼 소거할 표면 색상.
   float Z,   // Z버퍼 깊이의 초기화.. (0.0 ~ 1.0)
    DWORD Stencil ); // 스텐실 버퍼의 초기화..
 
 - Flags
 D3DCLEAR_TARGET - 렌더 대상 표면. 보통 백버퍼.
        D3DCLEAR_ZBUFFER - 깊이 버퍼.

        D3DCLEAR_STENCIL - 스텐실 버퍼.

 

* IDirect3DDevice9::Begin Scene()

: 렌더링 시작.

 

* IDirect3DDevice9::End Scene()
: 렌더링 종료.

 

* IDirect3DDevice9::Present()

  : 백버퍼를 보이는 화면으로.. 2D에서 Flip 랑 같다.
 
 HRESULT Present(      

     CONST RECT *pSourceRect,
     CONST RECT *pDestRect, 
     HWND hDestWindowOverride,   
     CONST RGNDATA *pDirtyRegion );
 
pSourceRect
[in] 스왑 체인이 D3DSWAPEFFECT_COPY 로 생성 되고 있는 경우를 제외해,
NULL 를 지정해야 하는 값의 포인터. pSourceRect 는, 전송원직사각형을 포함한 RECT
구조체의 포인터이다. NULL 의 경우는, 전송원표면 전체가 표시된다. 직사각형이
전송원표면을 넘었을 경우, 직사각형은 전송원표면에 클리핑 된다.
pDestRect
[in] 스왑 체인이 D3DSWAPEFFECT_COPY 로 생성 되고 있는 경우를 제외해, NULL 를
지정해야 하는 값의 포인터. pDestRect 는, 윈도우 클라이언트 좌표내에서의,
목적지 직사각형을 포함한 RECT 구조체의 포인터이다. NULL 의 경우는,
클라이언트 영역 전체가 목적지 직사각형으로 채워진다. 직사각형이 목적지의
클라이언트 영역을 넘었을 경우, 직사각형은 목적지의 클라이언트 영역에 클리핑 된다.
hDestWindowOverride
[in] 클라이언트 영역이 이 프레젠테이션의 대상으로 해 다루어지는 목적지 윈도우의
포인터. 이 파라미터가 NULL 의 경우는,D3DPRESENT_PARAMETERS
hWndDeviceWindow 멤버가 사용된다.
pDirtyRegion
[in] 이 값은, 스왑 체인이 D3DSWAPEFFECT_COPY 로 생성되지 않은 한,
NULL 이어야 한다. 이 값이 NULL 가 아닌 경우, 저장 되는 범위는, 백 버퍼 좌표로 표현된다.
범위내의 직사각형은, 갱신의 필요가 있는 픽셀의 최소 세트이다. 범위내의 픽셀만, 또는
적절히 확장된 직사각형 세트만을 복사 해 프레젠테이션을 최적화할 때, 이 메서드는 이러한
직사각형을 고려한다. 이것은, 최적화의 지원에만 사용되는 것이어, 애플리케이션은,
복사 되는 범위의 정확함에 의존해서는 안된다. 처리시에, 전송원직사각형 전체를
복사 하도록(듯이) 선택할 수도 있다.
 
- 걍 대충 NULL,NULL,NULL,NULL 넣으면 된다..
 
소스..
 
HRESULT InitD3D( HWND hWnd ) // 초기화 함수
{
     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = FALSE;
 d3dpp.BackBufferWidth = 1024;
  d3dpp.BackBufferHeight = 768;
  d3dpp.BackBufferCount = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
    
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
 
    return S_OK;
}
 
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() ) )
    {
        // Rendering of scene objects can happen here
   
        // End the scene
        g_pd3dDevice->EndScene();
    }
    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
 
이렇게 하면 아무것도 없이 퍼런 화면이 뜬다. 킁..
 
d3d 관련 헤더파일 인클루드 빼먹지말고..
메뉴에툴에옵션에디렉토리에인클루드랑라이브러리설정하는것도빼먹지말고.. ㅡㅡ;;
 
 
<< 파일설명 >>
 
Tut01_CreateDevice.zip       :   DX SDK 튜토리얼 소스 (풀모드로 수정한것)
D3D_test1.zip : 튜토리얼 소스 똑같이 다시 작성한것.

'Computer Engineering > DirectX' 카테고리의 다른 글

X 파일 로드 예제  (0) 2009.04.21
핸들에 대한 이해  (0) 2009.03.31
directX에서 d3dx9dt.lib 파일 관련 에러  (0) 2009.03.31
visual studio directX sdk 와 링크 하기  (0) 2009.03.31
3D 기본 용어와 이론  (0) 2009.03.31
And

.. DX가 서서히 변하고 있다더니.. October 버젼 쓰는 중인데

 

summer버젼 쓰는 분들의 이야기로는 해결이 안됐다.  

결국 October 버젼 안에 영문문서 안되는 영어로 해메서..   시간 다 날리고 해결.   쩝..

 

 

dinput8.lib d3dxof.lib dxguid.lib d3dx9dt.lib d3d9.lib winmm.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

 

 

이것은 이전까지 .net에서 컴파일시 쓰였던 Additional Indepencies. 

 

 

허나 이것을 쓰면 d3dx9dt.lib파일이 없다고 에러난다.

밑의 글을 보면 알겠지만 d3dx9dt.lib는 debug모드로 컴파일할때 필요한데..

 

하지만 이것은 이제 사라졌다.

 

이제부터 이것을 링크해야한다.

 

 

dxerr9.lib d3dx9.lib d3d9.lib d3dxof.lib dxguid.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib

 

 

100% 컴파일된다.   .NET 에서   

vc 6.0은 9.0c 부턴가 잘 안된다고 하던데.. 

밑에나와 있는 꽁수에 이걸 잘 덧붙여서 생각해보시길. (vc 6.0에선 안해봄)

 

 

단 2005 October버젼.

 

 

바뀐게 많아서 이젠 외우기도, 알려고 노력하기도 싫다 ㅡㅡ

'Computer Engineering > DirectX' 카테고리의 다른 글

X 파일 로드 예제  (0) 2009.04.21
핸들에 대한 이해  (0) 2009.03.31
D3D 디바이스 생성 및 초기화  (0) 2009.03.31
visual studio directX sdk 와 링크 하기  (0) 2009.03.31
3D 기본 용어와 이론  (0) 2009.03.31
And

흠...

visual studio directX sdk 와 링크 하기

한번 올려보자.

 

 

 

 

dx를 처음 독학했을때의 어려움은.

돌이켜보면 어캐 시작하는지도 알아내기 힘들었다는 것이었다.

 

 

특히나 무슨 버젼마다 vc6.0에선 안되고 닷넷에선 되고..

멀 또 수정했다는 둥.     등록 라이브러리파일이 버젼마다 다르다는둥.

summer버젼부터는 vc6.0에서 안 먹힌다는 둥.

 

 

그리고 고민에 고민을 하다가 2005october을 깔고...  2005 december를 깔고...

 

 

헌데 미치고 팔짝뛰게 시리 visual studio 2005나 vc 6.0에선 진짜 안 먹히는 것이었다.

 

5번 인스톨 하면... 가끔 될 때가 있었다.

-_-..   어쩌라는건지..

 

 

 

삽질을 하다가 알아낸건데..

너무 쉬우면서도 당연하면서도.....    지극히 뻔한 방법이었다.

 

이거 삽질한 덕분에 visual studio 툴 옵션을 꽤나 많이 알게 됐다. -_-..

삽질도 삽질 나름대로 좋은 점이 있는 듯.   그 당시 1,2주동안 머리털 빠지게 스트레스

받은거 빼면 말이다..

 

 

여튼 이제부터 본론이다.

 

일단 VC 6.0과 링크하는 법 부터 보겠다.

 

 

일단 확실치는 안지만 최근 DX버젼을 쓰는 사람이라면 DX Wizard는 포기하는게 낫다.

dx가 2개월 단위로 업데이트 하는건,  급격한 변화를 겪으면 프로그래머가 따라오기 힘들었기에

서서히 2개월 단위로 변화를 주기로 결정한 것이라고 한다.

 

DX가 원래 com 기반이 약간 있는건 좀 들어본 분이라면 다 아실것이다.

헌데 이것을 버리고 점점 static한 기반으로 간다고 한다.

 

때문에 dx wizard는 더 이상 과거의 방법으로 간단한 방법으로 만들어 지지 않게 되었다.

언젠가 지금의 변화가 끝나서 어느정도 정착이 되면 다시 wizard가 나올지도 모르는 일이지만

일단 당분간은 포기하는 것이 낫다.

 

간단한 dx를 구동시키는 framework정도는 자신만의 것을 만들어서 가지고 있는 것이 낫다.

 

초보자라면.. 그나마 호출시키는 함수도 많은데.. 자신만의 프레임웍 만들기가 힘들고

참고할 서적도 드물겠지만..

 

그나마 보기 쉬운것이라면 김용준 씨의 3D 게임 프로그래밍을 추천한다.

각 장 앞에 함수 상관도가 있어서 머리속에 넣기 좋다.

 

글고 어짜피 wizard가 만들어지는 코드는 최적화 시키기도 어려우니 애당초

자신만의 프레임웍을 노리자.

 

....

;; 링크시키는 글 쓴다 하고 삼천포로 빠졌군 ㅡㅡ..

 

일단 2005 December버젼까지 전부 다 VC 6.0에서 된다.    아주 세세한 사항이나 고급사항

까지는 잘 모르겠지만   본인이 일반적인 게임을 만들때 까진 아무 이상이 없었다.

도움말도 VC 6.0이 2005년 msdn을 참조하게 하는 방법도 나와있지 않은가.

 

일단 3개의 경로명을 적어준다.

 

VC 6.0  에서 Tool -> Option -> Directories 탭으로 간다.

 

 


 
 
Excutable의 경로명은
C:\Program Files\Microsoft DirectX SDK (December 2005)\Utilities\Bin\x86
 
을 넣어준다.  (Dx 2005 December Defaults 기준)
 
 

 
 
include 의 경로명은
 
C:\Program Files\Microsoft DirectX SDK (December 2005)\Include
을 넣어준다.
 
 
 
 

 
 
Library의 경로명은
 
C:\Program Files\Microsoft DirectX SDK (December 2005)\Lib\x86
을 넣어준다.
 
 
 
그리고 기본 라이브러리 파일 추가 사항에
dxerr9.lib d3dx9.lib d3d9.lib d3dxof.lib dxguid.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
을 넣어줘야 하는데
 
좀더 자세한 정보는 http://blog.naver.com/serufi/24830498  를 보시길.
 
VC 6.0의 Project -> Settings -> Linker 탭으로 이동
 

 
 
선택되어진 곳에 위의 *.lib파일들을 추가시켜 주고 ok하면 된다.
 
 
이제부터 VC 6.0에서도 2005 December dx sdk를 쓸 수 있다.
 
 
 
 
 
 
이번엔 visual studio 2005에 대해서 말해보겠다.
 
VC 6.0과 똑같다.
 
 
Tool -> Option을 간다.
 
그리고 똑같이 3가지 경로명을 추가해 준다.
 
 

 
 
excutable
C:\Program Files\Microsoft DirectX SDK (December 2005)\Utilities\Bin\x86
 
 
 
 

 
 
include
C:\Program Files\Microsoft DirectX SDK (December 2005)\Include
 
 
 
 

 

 

library

C:\Program Files\Microsoft DirectX SDK (December 2005)\Lib\x86

 

 

 

추가해 주면 된다.

 

그리고 *.lib의 파일 추가는

 


 
 
오른쪽 상단에 Tri 라고 선택되어진 부분을 마우스 오른 클릭하고 Property를 누르면 뜨는 창에서
위와 같이 Linker -> input으로 간 뒤에 위에 VC 6.0에서 설명한 *.lib파일들을 넣어주면 된다.
 
 
 
 
헌데 Visual studio 2005에서는 특별하게 LPCSTR, LPCWSTR 변환에러가 날 때가 있다.
 
다음을 참조하면 된다.
 
내가 여러버젼을 깔아보았는데 일반적인 visual studio 2005에서는 저렇게 유니코드가
디폴트로 잡힌다.
 
그런데 신기하게 Team Edition Sortware Developer 버젼이나 Team suite 버젼에선
multi-byte가 기본으로 잡혀서 따로 신경써줄 필요가 없었다.
 
 
 
 
 
 
이제 마지막이다.
 
구식 파일을 읽어들일때 발생하는 에러 중에서
VC가 표준의 적법한 문법을 정상적으로 처리 못해서 나는 것이 있다.
 
예를 들면 다음 것들이다.
 
Common 디렉토리에서 변수가 재선언 되었다는 에러가 화면에 뜬다.
가령이런 에러일것이다.
 
for(int i = 0; i < 10; i++) ....
for(int i = 0; i < 10; i++) ....
 
 
비쥬얼 C 6에서는 허용되지 않기 때문에 이런식으로 고친다.
int i;
for(i = 0; i < 10; i++) ....
for(i = 0; i < 10; i++) ....
 
 
 
 
visual .net 2002 버젼 이상이라면 신경 쓸 필요가 없다.
 
여기까지라면.. 아마도 dx sdk를 visual studio에서 link 하기 위해 하는 고생이 훨 줄어들
것이라고 생각한다.
 
 
이상하게 책이나 문서를 뒤져봐도 알아낼 방법이 없어서
1,2주 삽질한 본인같은 절차를 거치지 않기 위해
제목도 신경을 써서 올려본다.

'Computer Engineering > DirectX' 카테고리의 다른 글

X 파일 로드 예제  (0) 2009.04.21
핸들에 대한 이해  (0) 2009.03.31
D3D 디바이스 생성 및 초기화  (0) 2009.03.31
directX에서 d3dx9dt.lib 파일 관련 에러  (0) 2009.03.31
3D 기본 용어와 이론  (0) 2009.03.31
And

3차원 좌표계 (3D Coordinate System)
Direct3D는 왼손 좌표계를 사용.
 
벡터(Vector)
크기와 방향을 모두 가진 값.
 
정점(Vertex)
2차원이나 3차원 공간에서의 위치를 나타내는 점(꼭지점)
 
변환(Transform)
가장 기본적인 변환에는 이동(transition), 회전(rotation), 크기(scale) 변환이 있으며, 이들 변환은 모두 행렬로 표현됨.
이동과 회전만으로 이루어진 행렬을 아핀변환(affine transform)이라하며, 이 변환은 계(system)를 유지하는 특성이 있어 여러모로 유용하다.
 
행렬(Matrix)
행렬은 3차원 그래픽에서 데이터량이 많아질 수록 유용하다.
 
폴리곤(Polygon)
3개의 정점이 모이면 하나의 면(face)를 만들수 있는데 이렇게 3개의 정점으로 만들어진 삼각형을 폴리곤이라 한다. 몇개의 폴리곤이 모인 것을 면이라고 부르는 경우도 있지만 이 책에서는 면과 폴리곤을 동일하게 삼각형으로만 이루어진 것으로 가정하겠다.
 
변(Edge)
폴리곤에서는 정점과 정점을 연결하는 직선을 변 혹은 모서리(edge)라고 한다. 데이터를 저장하는 방식에 따라 half-edge 모델 등의 방식이 존재하기도 한다. Direct3D같은 실시간 3D의 경우 정점+인덱스 의 방식이 대부분이므로 변은 프로그래밍시에 중요하게 취급되지 않지만, 그림자 볼륨(volume shadow) 기법처럼 변을 사용해야만 하는 특별한 기술도 있다.
 
메시(Mesh)
폴리곤은 최소한의 3차원 공간 위에 면을 만들지만 이것으로는 우리가 생각하는 복잡한 물체를 표현하는 데 무리가 있다. 이러한 폴리곤들이 모여서 하나의 3차원 물체를 만들게 되는데, 이것을 메시라고 한다. 다시 말해서, 메시는 폴리곤이 모여서 만들어진 3차원 공간의 객체(object)다.
 
셰이딩(Shading)
셰이딩이란 폴리곤에 음영을 넣는 작업을 말한다. 폴리곤은 3차원상의 좌표값을 가진 정점으로 구성되어 있기 때문에, 실제 이것이 화면에 표시(render)되기 위해서는 셰이딩이라는 과정이 필요하다. 셰이딩 기법에는 다양한 방법이 존재하는데, 대표적인 것으로는 플랫 셰이딩(flat shading), 고로셰이딩(gouraud shading), 퐁 셰이딩(phong shading), 라디오시티(radiosity), 광선추적(raytracing) 등이 있다. 이 중 대부분의 비디오카드에서 지원하는 하드웨어 가속은 플랫 셰이딩과 고로 셰이딩 2가지다. 나머지 기법들은 연산량이 많아서 비디오카드의 하드웨어 가속으로 지원하기 어렵기 때문에 많이 사용되지 않는다.
플랫 셰이딩은 하나의 폴리곤을 단색으로 처리하는 방식으로 가장 빠른 방식이긴 하나, 딱딱하게 각이 진 모양이 된다. 대표적인 게임으로는 일본 남코(Namco)의철권1, 2와 ㅎ세가(Sega)의 버추어파이터 1,2가 있다.
고로 셰이딩은 폴리곤의 내부를 정점의 색에 따라서 보간(interplate)하여 칠하는 부드러운 셰이딩 기법이다. 철권 3와 버추어 파이터 3를 보면 영상이 비약적으로 발전한 것을 볼 수 있는데, 이것이 바로 고로 셰이딩의 위력이다.
이외에도 퐁 셰이딩의 기법이 있으나, 아직까지는 하드웨어적인 지원을 받지 못하고 있다. 그러나 HLSL등의 정점 셰이더등을 통하여 퐁셰이딩, 라디오시티, 광선추적을 GPU 수준에서 구현할 수 있으며, 이 중 일부는 셰이더 프로그래밍을 직접 구현해 볼 것이다.
 
텍스쳐(Texture)
3차원 정점만으로 화면에 물체를 나타내려면 제약이 많다. 섬세한 물체를 표현하기 위해서는 많은 수의 정점이 필요하고, 이는 PC와 같이 제한된 메모리와 CPU의 시스템에서는 큰 문제가 아닐 수 없다. 물론 고가의 그래픽 전용 장비도 메모리가 무한대는 아니기 때문에 결국 같은 문제에 직면하게 된다. 텍스처란 3차원 물체에 2차원의 이미지(jpg, bmp, gif 등) 를 입혀서 정점만으로는 나타낼 수 없는 훨씬 다양한 표현을 가능하게 해 준다. 이렇게 3차원 정점에 2차원 이미지를 입히는 작업을 맵핑(mapping)한다고 표현한다. 따라서 3차원 물체에 텍스처를 입히는 것을 텍스처 맵핑이라 하고, 맵핑되는 2차원 이미지를 텍스처, 혹은 텍스처 맵이라고 한다.
최근의 텍스처 맵핑 기법에는 단순 2차원 이미지를 사용하는 것을 넘어서 3차원 텍스처가 사용되고 있으며, Cube 맵등의 환경 맵핑 기법도 사용되고 있다.
And