태그 : 정점

D3D Chapter 04>> 정점 그리기(Sample Code:Tut02_Vertices)


2008/04/13 일요일. D3D Chapter 03>> 정점 그리기(Sample Code:Tut02_Vertices)

:: 오늘의 넋두리---------------------------------------------------------------------------------
 pm 10:57 ... 나의 취침 3분전... 오늘도 늑장 정리와 산만함 때문에 취침 시간을 지키지 못하련가?
------------------------------------------------------------------------------------------------

바로 앞 글에서 예고 했듯이 오늘은 Tut02_Vertices 예제 코드를 분석해 가면서 정리한다.
(__  >>ㅑ~~~ 깔끔해~~ 군더더기 없는 출발~ 이렇게 정리 해야만 해! ㅋ ^^)


째. 프로그램의 흐름을 파악한다!

[Figure. 01]Tuto02_Vertices 처리과정


 말이 필요 없다. 지금 보고 있는 예제는 위와 같은 흐름을 보이고 있다. Tuto01과 무엇이 달라졌는가?
 ① VertexBuffer에 대한 interface를 global 변수로 선언했다.
 ② Vertex 구조체를 정의하고, 이를 표현하기위해 FVF flag조합으로 메크로 상수를 정의하였다.
 ③ InitVB 메소드를 추가하여 Vertex Buffer를 초기화 하였다.



째. 변수를 파악하라.

27| LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices

29|// A structure for our custom vertex type
30| struct CUSTOMVERTEX
31| {
32|     FLOAT x, y, z, rhw; // The transformed position for the vertex
33|     DWORD color;        // The vertex color
34| };

36|// Our custom FVF, which describes our custom vertex structure
37| #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

  앞서 말했듯, 정점은 그림을 그리는 가장 기초 단위가 되는 것이다.
 이 정점은 위치를 비롯하여 색상, 조명, 텍스쳐 등의 포멧을 갖게 되는데 이것은 프로그래머에 의해 결정된다.
30|번 줄 이하 구조체가 바로 그 부분이 된다.
36|번 줄은 이렇게 정의된 Vertex Format에 대하여 표현하기 위한 FVF flag의 조합으로 메크로 상수화 한 것이다.

FVF flag는 다음과 같다. >>  FVF Flags(Flexible vertex format bits)_ Link
 
 이 포멧으로 정점 데이터가 만들어 지고, 정점버퍼(VertexBuffer)에 저장이 되는데, 27|번 줄에서 선언된 VertexBuffer interface가 바로 그것이다.


째. 세부기능을 파악하라


[Figure. 02] InitD3D

_Tuto01과 동일하다.


[Figure. 03] InitVB

_이번 장의 핵심이 있는 곳이다. 크게 3부분으로 나눌 수 있다.
1. Vertex Data 초기화
2. VertexBuffer 생성
3. VertexBuffer에 Vertex Data 채우기


1. Vertex Data 초기화

    CUSTOMVERTEX vertices[] =
    {
        { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
        { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
        {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
    };

 : 예제에서는 위와 같은 Vertex Data를 가지고 있고 각 3개의 정점의 정보를 가지고 삼각형을 그린다.

2. VertexBuffer 생성                    >>IDirect3DDevice9::CreateVertexBuffer

    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

3. VertexBuffer에 Vertex Data 채우기

    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) //Unlock이 호출 되기 전까지 vertex buffer에 대한 접근을 막는다.
        return E_FAIL;
    memcpy( pVertices, vertices, sizeof(vertices) ); // vertex buffer에 vertex data를 채운다
    g_pVB->Unlock();//Unlock을 호출함으로 해서 Vertex Buffer에 대한 접근을 허용한다.




[Figure. 04] Render

 이 부분에 대해서는 Rendering의 흐름이라는 제목으로 따로 정리가 필요할 듯하다. (정점에 대한 이야기를 약간 벗어나기 때문에...)
 아무튼! Device로 부터 BeginScene와 EndScene사이에서 그리고자 하는 장면(scene)을 설정한다.

1. SetStreamSource
    정점 버퍼들 중에 그려지길 원하는 버퍼를 선택한다. (예제에서 정점 버퍼는  단 하나)

2. SetFVF
    Vertex Buffer를 생성할때 사용한 FVF를 그대로 사용한다.

3. DrawPrimiteve
    Vertex Buffer의 정점들의 정보를 활용해 그리고자 하는 primitive설정(예제에서는 TriangleList를 1개 그렸다.)

4. Present
    위에서 설정한 BackBuffer의 정보를 화면에 보여준다.



[Figure. 05] Cleanup





드를 실행시켜 보면 뭔가 이상한(?)점을 발견할 수 있다.
일반적인 2차원 직교좌표로 예상을 했던 삼각형과는 반대의 그림이 그려졌을 것이다.
(난 이미 Window 좌표에 익숙해진 후라서 이상하다고 생각하진 않았다... 쩝... 하지만! 여기서는 이상하게 생각해야 옳다! 왜냐?! )
 Direct3D에서 렌더링 하는 과정에서 Window좌표(오른쪽으로 x증가, 아랫쪽으로 y증가)가 바로 사용되었기 때문이다. Direct3D는 특별한 Vertex Format을 제외하고는 Window좌표를 사용하지 않는다.
특별한 포멧이라 함은 위에서 정의한 FVF에서 x,y,z좌표를 제외한 rhw라는 녀석을 포함한 D3DFVF_XYZRHW 타입의 포멧 형태를 말한다. (FVF Flags(Flexible vertex format bits)_ Link)
 
[Figure. 06] 예상


[Figure. 07] 결과





by 케간지무늬 | 2008/04/14 02:01 | ▶▷DirectX◁◀ | 트랙백 | 덧글(0)

D3D Chapter 03>> 정점(Vertex)를 잡아라!

2008/04/13 일요일. D3D Chapter 03>> 정점(Vertex)를 잡아라!

:: 오늘의 넋두리---------------------------------------------------------------------------------
 이게 지금 며칠을 공친거란 말인가! 이제서야 정점을 잡으러 오다니...
사실 학교 강의는 Texture mapping까지 나갔다. 참! 더구나 지난번 강의를 빼먹었었다.
뭐... 두통이 밀려오는 바람에 약국을 들러야 했던 이유로 1교시는 패스했었던 것이지.
------------------------------------------------------------------------------------------------

지난 시간까지 우리는 D3D 9의 초기화 과정으로 Direct3D Device까지 생성하였다.
그리고 그곳에서 PRESENT와 Back Buffer에 대해서도 논하였다.


 
오늘은 본격적으로 그림을 그려보려고 한다!
그림을 그리기 위해선 작업실이 필요하고 그림을 그릴만한 도화지나 스케치북 같은것이 필요하다. 또한 여러 미술도구가 필요하다.

지금까지는 그러한 것들을 준비하는 단계였다고 하자!

모든것이 준비되었다.
이젠 그림을 그림만 그리면 된다. 펜이여도 좋고 연필이여도 좋고 색연필이여도 좋다 무엇이든 손에 들고 그림을 그려 보도록하라!

나는 방금 새하얀 도화지에 가느다란 실선을 그리는 것으로 시작하여 그림을 그렸다.

지금은 미술시간이다. 지극히 감상적인... 하지만 잠시 수학시간을 떠올려 보도록하자.
(학창 시절 수학시간에 미술시간을 떠올린 학생은 더러있었겠지만 미술시간에 수학시간을 떠올린 학생은 아마도... 없었으리라 생각이 들긴 하지만...)

방금 그렸던 그 선! 선에 대한 정의는 무엇이였던가?
중학교때 배웠던가?

점들의 연속된 집합으로 이루어 진것! 이였을 것이다. 아마도... ㅋㅋ

정확하진 않아도 이 비슷한 무엇이였을 것이다. 점들이 모여서 선이 된다는 것은 확실하다.

아참~!
지금까지 너무 말을 많이 써서 필요할때 검색을 해봐도 요점을 찾아보기 힘이 들었으면서 또... 저리도 주저리 주저리 말이 많네 

에라잇! 이제 요점만 파박!

--------------------------------------------->> ㅡㅡ;


그림을 그리기 위해선 가장 먼저 
점(Vertex)이 있어야 한다. 그 다음은? ... 다음과 같다.

점 --> 선 --> 면 --> 입체



점(Point) _ Vertex


선(Line)



면(Direct3D 9의 Primitive를 따라서 Triangle) _ Polygon
3D의 기본은 Polygon! 즉, 정점 3개가 모인 삼각형을 이루는 면이 3D 기본이 된다.


결국 Direct3D 9도 시작은 점이란 얘기다.

 이러한 정점은 단순히 그려지는(정확히는 찍히는) 위치에 대한 정보 뿐만 아니라 , 조명, 텍스처 등의 정보가 포함 될 수 있다. 이러한 정점에 대한 포멧은 프로그래머가 원하는 형태로 달라질 수 있다. 즉! 유연성(Flexible)을 갖게 된다. 그래서 정점의 포멧을 FVF(Flexible Vertex Format_유연한 정점 포멧)라고 한다.

이렇게 포멧이 결정 되고 나면 그 포멧에 맞게 정점 데이터를 만들어야 한다. 그리고 그 데이터를 화면에 그려지기 위해서는 특별한 버퍼에 저장이 되어야 하는데 그 특별한 버퍼가 VertexBuffer이다.

이번 글은 이것으로 마무리 하고
다음 글에는
FVF를 정의하고 VertexBuffer를 생성에서 VertexBuffer에 정점 데이터를 저장에서 Rendering하기까지를 정리하도록 하겠다.
늘 그랬듯이 DirectX SDK에서 지원해 주는 Tutorial을 통해서 할것이다.

by 케간지무늬 | 2008/04/13 22:36 | ▶▷DirectX◁◀ | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶