태그 : VertexBuffer
2008/04/14 D3D Chapter 04>> 정점 그리기(Sample Code:Tut02_Vertices)
2008/04/13 D3D Chapter 03>> 정점(Vertex)를 잡아라!
2008/04/13 D3D Chapter 03>> 정점(Vertex)를 잡아라!
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 앞서 말했듯, 정점은 그림을 그리는 가장 기초 단위가 되는 것이다. 이 정점은 위치를 비롯하여 색상, 조명, 텍스쳐 등의 포멧을 갖게 되는데 이것은 프로그래머에 의해 결정된다. 30|번 줄 이하 구조체가 바로 그 부분이 된다. 36|번 줄은 이렇게 정의된 Vertex Format에 대하여 표현하기 위한 FVF flag의 조합으로 메크로 상수화 한 것이다. FVF flag는 다음과 같다. >> FVF Flags(Flexible vertex format bits)_ Link 이 포멧으로 정점 데이터가 만들어 지고, 정점버퍼(VertexBuffer)에 저장이 되는데, 27|번 줄에서 선언된 VertexBuffer interface가 바로 그것이다. 셋째. 세부기능을 파악하라 ![]() [Figure. 02] InitD3D _Tuto01과 동일하다. ![]() _이번 장의 핵심이 있는 곳이다. 크게 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)



# by | 2008/04/13 22:36 | ▶▷DirectX◁◀ | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶