노력과 삽질 퇴적물

DX: 다이렉트X09_3D 튜토리얼 01~06 본문

📂기초 및 세팅 note/2D & 3D

DX: 다이렉트X09_3D 튜토리얼 01~06

MTG 2011. 10. 17. 19:59
* 각 소스마다 주석으로 소스내 구조흐름과 노트정리를 해두었습니다.
* 튜토리얼 3부터는 자체적으로 변형한것들입니다.





Tutorial 00: 다이렉트X 도큐먼트

 C:\Program Files\Microsoft DirectX SDK (August 2009)\Documentation\DirectX9\directx_sdk.chm 을 실행해서 참고하는것도 좋습니다.





Tutorial 01: CreateDevice






Tutorial 02: Vertices


 버텍스 포맷 종류
->동명이형인 포맷중 택1
->위치, 색상, 텍스쳐좌표등 

dwFVF = ( D3DFVF_XYZ | D3DFVF_DIFFUSE );
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE );
dwFVF = ( D3DFVF_XYZ | D3DFVF_TEX2 );
dwFVF = ( D3DFVF_XYZRHW | D3DFVF_TEX2 );
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE
                                                                | D3DFVF_SPECULAR | D3DFVF_TEX2 );

 변환된 버텍스
->예. 성분 수동입력 

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw;
    //FLOAT x, y, z;
    DWORD color;        // DWORD로 색깔표현가능. 16진수 사용.
                                //RGB조합[0xargb]으로 각 원소는 0~255[256].
};

 버텍스 포맷 세팅.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

그리기 방법 인자
-> 멤버중 택1해서 사용.

typedef enum _D3DPRIMITIVETYPE
{
    D3DPT_POINTLIST         = 1,
    D3DPT_LINELIST           = 2, //독립된 라인들
    D3DPT_LINESTRIP         = 3, //연결된 라인들
    D3DPT_TRIANGLELIST   = 4, //독립된 삼각형들. 버텍스정보 기준으로 맞닿는 변이 없다.
    D3DPT_TRIANGLESTRIP = 5,
    D3DPT_TRIANGLEFAN    = 6, //면을 폴리곤들의 집함으로 표현.
                                       //오로지 하나의 버텍스가 공통점.
    D3DPT_FORCE_DWORD   = 0x7fffffff,
} D3DPRIMITIVETYPE;

정점들에 대한 입력.

버텍스 버퍼
-> 버퍼를 비디오 메모리에
저장 가능.
-> 배열보다 빠른 작업 

D3DFVF_CUSTOMVERTEX,0,CUSTOMVERTEX Tutorial2[] =
{
      { 200.0f, 10.0f,  0.5f, 1.0f, 0xfff00000, }, // x→, y↓, z, rhw, color
      { 325.0f, 250.0f, 0.5f, 1.0f, 0x002ff200, },
      { 75.0f, 250.0f, 0.5f, 1.0f, 0x00002fff, }
  // { 100.0f, 10.0f, 0.5f, 0xfff00000, }, // x→, y↓, z, rhw, color
  // { 325.0f, 250.0f, 0.5f, 0x002ff200, },
  // { 75.0f, 250.0f, 0.5f, 0x00002fff, }
};//삼각형 그리는 구조체.

//버텍스 버퍼만들기
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ),
                                                                    0,
                                                                    D3DFVF_CUSTOMVERTEX,
                                                                    D3DPOOL_DEFAULT,//버퍼가 만들어지는 장소
                                                                    &g_pVB,//버텍스 버퍼가 포인터에 저장
                                                                    NULL // 언제나 NULL
  )))
{
       return E_FAIL;
}

VOID* pTutorial2;

//버텍스 구조체에 넣은 값을 버텍스 버퍼로 옮기기.
//메모리 주소를 얻어와서 집어넣음.
if( FAILED( g_pVB->Lock( 0,   //잠금을 시작할 버퍼위치의 오프셋값
                               sizeof( Tutorial2 ),     //잠글 바이트 수
                               ( void** )&pTutorial2, //잠근 메모리의 포인터
                               0    //잠금이 이루어질 방법
                             ))) //버텍스 버퍼 메모리 포인터 획득.
     return E_FAIL;

memcpy( pTutorial2, Tutorial2, sizeof( Tutorial2 ) );
               //포인터에 버텍스 버퍼값 복사해 넣기
g_pVB->Unlock(); // 잠갔던 메모리 해제

SetStreamSource
->  버텍스 버퍼를
     N번 데이터 스트림에
     연결.

DrawPrimitive 
-> 버텍스 내용 그리는 함수

g_pd3dDevice->Clear( 0,
                                 NULL, //표면의 특정영역만을 소거할수 있도록 해준다.
                                 D3DCLEAR_TARGET, //랜더대상 표면(보통은 후면버퍼)
                                 D3DCOLOR_XRGB( rgb_r, rgb_g, rgb_b ),
                                 1.0f, //Z버퍼
                                 0    //스텐실버퍼
                               );

// (Drawing)
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
     g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, // 그리기 방식 인자
                                             0,
                                             1 //그려질 라인이나 삼각형등의 갯수.
                                           );


     // End the scene
     g_pd3dDevice->EndScene(); //백버퍼에서의 랜더링 마무리.
}

//Device->Present
g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); //랜더링된 결과를 보임.







Tutorial 03: Matrices

-> 현재 포스팅한 소스는 기존 예제에서 버텍스버퍼를 활용한 2개의 매트릭스를 월드변환한 좌표에 넣었다.
-> D3DX 라이브러리에서 제공하는 기본매쉬중 육면체를 추가해서 그려넣었다.
          (참고1 : 용책 3장.)
          (참고2 : DirectX를 이용한 3차원 그래픽 프로그래밍 기초)
          (참고 : 게임코디, 월드변환에 대해.)






Tutorial 4: Lights


조명.
Diffuse : 난반사광의 양 조절.
Ambient : 환경광의 양 조절.
Specular : 정반사광의 양 조절.
Emissive : 전반적인 표면의 컬러. 물체 자체의 색상지정.
Power : 정반사광 강도 조절. 높은 값일수록 하이라이트 강조.

 typedef struct _D3DLIGHT9
{
    D3DLIGHTTYPE    Type;
    D3DCOLORVALUE   Diffuse;         /* Diffuse color of light */
    D3DCOLORVALUE   Specular;        /* Specular color of light */
    D3DCOLORVALUE   Ambient;         /* Ambient color of light */
    D3DVECTOR       Position;         /* Position in world space */
    D3DVECTOR       Direction;        /* Direction in world space */
    float           Range;
    float           Falloff;
    float           Attenuation0;     /* Constant attenuation */
    float           Attenuation1;     /* Linear attenuation */
    float           Attenuation2;     /* Quadratic attenuation */
    float           Theta;            /* Inner angle of spotlight cone */
    float           Phi;              /* Outer angle of spotlight cone */
} D3DLIGHT9;

광원.
① 점 광원(point light): 월드 스페이스내 존재. 광원에서 모든방향으로 빛을 방산.
-> 위치값O, 방향성X [백열전구]
-> Position, Range, Attenuation
② 방향성 광원(directional light): 빛의 진행방향으로 평행하게 발산.
-> 특정한 색상. 위치값X. 방향성O [태양]
-> Direction, 
③ 스포트 광원(spot light): 무대의 조명이나 손전등처럼 빛이 월뿔형으로 발산. 광원의 법선에 근접할수로 밝음.
-> 특정한 색상. 위치값O, 방향성O
-> Position, Direction, Range, Falloff(보통 1.0), Attenuation, Theta(원뿔의 내부각쯤?), Phi


표면, 면 법선(face normal)

표면, 버텍스 법선(vertex normal)

 [이미지 출처, 바로가기]






Tutorial 05: Textures







Tutorial 06: Meshes







1

2

3

1

2

3