메뉴 건너뛰기

창조도시 기록보관소

언어 2. Direct로 그림그리기!

2006.09.03 06:03

케이코냥이 조회 수:166 추천:2

하아- 글쓰기 이전에 10초전에 컴퓨터 다운이 있엇습니다.


 


글을 쓰는데 갑자기 팅긴것..<


 


아 .. 정말 .. 윈인을 말하자면.. 길어서.. 젠장.. 그 긴 강의를 또 반복해야하다니...


 


의욕이 없네요..


 


그래도 써야겟죠.. 다소 설명이 부족한 부분이 많을겁니다.. 잘 이해해 주시길 바랍니다...


의욕 생길때 수정하겟습니다.. 아니면 댓글을 달아주시면 답변을 해드리겠습니다..


 


2. DirectX SDK 그림(삼각형)드로잉!


 


순차-


(1). 버텍스 버퍼 생성.


(2). 버텍스 구조체 생성.


(3). FVF(유동 정점 포맷)설정


(4). 버텍스 버퍼 초기화.


(5). 드로잉


(6). 메모리에서의 삭제


 


(1). 버텍스 버퍼 생성.


드로잉을 하기 이전에 몇가지 과정을 걸쳐야 한다. 버텍스 버퍼는 그 과정 중 하나이다.


버퍼에 대한 계념을 아실거라 믿는다.. 버텍스 버퍼라 하면 간단히 말하자면 버텍스(꼭지점)의 정보를 저장하는 것이라 생각하면 된다.


우린 삼각형을 그릴것인데 그러면 버텍스 버퍼를 3개를 생성해 주어야 할까? 그렇지는 않다. 한 버텍스버퍼에 많은 버텍스 정보를 넣을 수 있다.


버텍스 버퍼는 아래와 같이 선언(생성)한다.


 


LPDIRECT3DVERTEXBUFFER8 g_pVB        = NULL;


 


위 버퍼선언(생성)을 전역변수에 넣어주면 되겠다.


 


(2). 버텍스 구조체 생성.


 자, 버텍스 버퍼 생성은 쉽게 끝났다. 구조체라 하면 한 형태를 이루는 "것"에 대한 정보를 다른 형태의 변수들로 모아 놓은것을 의미하지않는가? 뭐, 고차원적으로 말하자면 길어질것 같고, 모두 구조체를 능숙하게 다룰거라 생각하니, 더 의상 설명은 무의미 하다고 생각된다.


 


struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; 


    DWORD color;       
};


 


위 구조체가 버텍스 구조체이다. 보면 알것이다. 다만 rhw는 무엇인가? 바로 시점과 정점사이의 거리를 뜻한다. 대부분의 프로그래머는 이 값을 1.0으로 넣어준다.(1.0값이 가장 안전한 값이다.)


위 구조체를 프로잭트 안에 포함시키기 바란다.


 


(3). FVF(유동 정점 포맷)설정


 벌써 3번째 과정이다! 여기 까진 간단하나 FVF를 잘 이해하기엔 약간 어려울것같다.


유동 정점 포맷이란, Direct가 지원하는 정점의 형식을 말하는것인데, 이 값은 5-6가지가 있다.


그 값은 그 형식을 사용할때마다 설명하겠다. 지금 우리가 사용할 값은 다음과 같다.


 


#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)



매크로를 선언하여 FVF값을 쉽게 쓸 수 있게 하였다.


일단 D3DFVF_XYZRHW값은 X,Y,Z,RHW값을 사용하겠다고 Direct에 알린다는 것이다.


위 구조체에 변수가 X,Y,Z,RHW가 있었지 않앗는가? 그렇듯 이 FVF에도 위 처럼 써주어야 한다.


만약 RHW값을 사용하지 않을 경우 구조체에서 RHW값을 삭제해주고, FVF값도 D3DFVF_XYZ로 하면 된다.


다음 값인 D3DFVF_DIFFUSE은 색칠을 한다는 뜻이다. 버텍스구조체에 color란 변수가 있지 않은가? 그 값에 따라 색상을 칠해주겠다는 의미가 되는것이다. 이것을 안써준다면 우리가 그릴 삼각형은 흰색이 될것이다.


(4). 버텍스 버퍼 초기화.


 이것이 꾀 길다. 뭐. 그렇게 길지도 않지만..


일단 생각해야 할것은 우리가 필요한것은 버텍스구조체를 사용하는것일 것이다.


삼각형을 만들것이니 이 구조체는 3개가 있어야 할것이고, 이것은 배열을 사용하면 효율적으로 할수 있을것이다.


 


일단, 버텍스를 초기화 시키는 함수를 하나 만들기 바란다.


그 함수 내에


 


    CUSTOMVERTEX g_Vertices[] =
    {
        { 150.0f,  50.0f, 0.5f, 1.0f, RGB(0,255,0), }, 
        { 250.0f, 250.0f, 0.5f, 1.0f, RGB(0,255,0), },
        {  50.0f, 250.0f, 0.5f, 1.0f, RGB(0,255,0), },
    };


 


를 넣어 주기 바란다.


위 변수는 알다시피 각 버텍스 마다 좌표값과 RHW값, 컬러값을 넣어 주었다.


다음으로 버텍스 버퍼를 초기화 시켜주어야 할것이다.


 


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


 


뭐, 어렵게 보이는데 하나도 어려울것 없다. 첫번째 인수로 버텍스버퍼의 크기를 넘긴다. "3"은 버텍스의 숫자라고 생각하면 될것이다. 만약 4각형을 만들때엔 위 값을 4*SIZEOF~ 로 해주면 된다. 다음 인수인 0은 대부분 0이라 써주는데 버퍼의 속성을 설정해 주는거라 생각하면 될것이다.


다음 인수는 "D3DFVF_CUSTOMVERTEX" 잘 봐보면 아까 우리가 매크로로 써준 FVF이다! 그렇다 이곳에 FVF값을 인자로 넘겨주어 버텍스의 속성을 설정해주는것이다.


다음 인자는 신경 쓸 필요를 못느끼겟 지만, 리소스가 배치되는 유효한 메모리 클래스를 기술하는 것이다. 다음은 바로 버텍스 버퍼를 인자로 받는다, 전에 인자들을 잘 요리해 이 버텍스 버퍼에다가 넣어주는것이다.


 


초기화의 마지막으로 버텍스 lock을 걸어주는게 끝인데, 소스는 다음과 같다.


 


    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();


 


락을 걸어주고 메모리를 복사해주는 소스인데 왜 락을 걸어줘야 하는걸까?


그 이유에선 엑세스의 유무를 바꾸기 위해서이다. 락을 걸어주면 엑세스 가능 메모리 영역에 포함되여 메모리 포인터를 사용해서 정점버퍼 메모리를 복사 할 수 있기 때문이다.


이로써 버텍스 버퍼의 초기화를 끝냈다,


위 소스들을 한 함수에 넣어준후 윈도우를 생성한후 메세지루프에 들어가기 이전에 이 함수를 호출해주면 될것이다.


 


(5). 드로잉


  드로잉을 시작하기 전에 백 버퍼를 싹 지워주고 시작하자.


  즉, 그림을 그리기전에 도화지를 깨끗하게 하자는 것이다.


 


   g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );


파란색으로 백버퍼를 지워준다는 말이다.


도화지를 깨끗하게 했다면 다음엔 그림을 그릴 준비를 해야할것이다.


 


    g_pd3dDevice->BeginScene();


그림그리기를 선언한다는것이다.


별다른 설명이 필요 없을 것이다.


 


    g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );


 


위 소스는 고대하던 그림그리기 소스! 허허, 왠지 심오하면서 간단하지 않은가?


처음의 SetStreamSource은 이 인자들로 정점의 정보로 삼겠다는 이야기 이다. 즉, 정점정보셋팅이라 생각하면 될것이다. 인자는 그대로 바뀔일이 없다. 굳이 설명하자면 첫번째 인자는 장치의 정보 스트림을 넘겨주는것이다. 심오하겠지만 그냥 0을 넣어주면 된다. 다음 인자는 버텍스버퍼이다. 다음은 메모리 사이즈일것이라 알수있다.


 


다음 SetVertexShader 이것은 어떠한 정점 쉐이더를 사용할지 Direct에게 알리는 함수이다.


인자로는 FVF를 넘기고 있다. 여기에서 FVF값이 진정한 힘(?)을 발휘하는것이다.


 


마지막으로 DrawPrimitive.. 보니 드로우라는것이 보인다.


이것은 그림을 위 설정대로 그림을 그린다는 것이다.  첫번째 인자로는 버텍스를 그리는 순서를 말하는 것이다. 이 설명은 (그림 . 01) -첨부파일-을 참고해 주기 바란다. 다음 값은 두번째 인자는 정점의 인덱스를 성명하는것이다. 3번째 인자는 폴리곤의 숫자이다. 폴리곤은 삼격형을 말하는데 우리는 삼각형 하나를 출력할것이기에 1을 넣어주면 된다. (사각형은 삼각형2개로 이루워져있다는 것은 다들 아실것이다. 사각형을 그릴때엔 2를 넣어주면 된다.)


자 설명은 끝났다.


 


 


 


 


(6). 메모리에서의 삭제


 이젠 프로그램이 종료 되기 직전에 우리가 썻던 메모리를 다시 풀어주어야 할것이다. 만약 그렇지 않으면 메모리공간이 비효율적으로 돌아갈 것이다.


 메세지루프가 끝났을때



        g_pVB->Release();


 


다음과 같이 써주면 된다.


자! 이로써 드로잉 끝! 컴파일을 시켜보면 삼각형이 보일것이다..


버텍스의 색상도 바꾸면서 해보자..


 


다음은 이 삼각형에 옷을 입혀보자!


 


첨부파일 1 - 이번 파일 소스.


 


첨부파일 2 - 그림 .01


  -  이 그림의 플래그들은 알아서 잘 연구해 뭐가 무슨 효과이며 뭐가 뭐엇인지 혼자의 힘으로 알기바란다.


 


이번 강의도 끝이 났네요. 하아- 똑같은 내용을 두번씩 쓸려하니 머리도 아프고=ㅂ=;;


강의 내에선 말을 딱딱하게 하는게 싫으시다면 댓글을 달아주기시 바래요~<


전 왠지 딱딱하게 하는게 분위기(?) 있어 보여서 ㅎㅎ <


그럼 이만 강의를 마치겠습니다


 


모두 즐프~ 


 


p.s 어엇? 첨부파일이 안먹히는듯 하네요..


첨부파일 1 : Vertices-dlrhkdrb86.cpp


첨부파일 2 : http://blogfiles2.naver.net/data20/2006/9/2/225/DRAW-dlrhkdrb86.gif


관련 게시물 : http://blog.naver.com/dlrhkdrb86/120028480492


 그림그리느라 어려웠습니다=ㅂ=.. 순수 광마우스 그림판작...ㄷㄷㄷ


 

번호 제목 글쓴이 날짜 조회 수
31 MSN 주소를 알려주세요. [3] MrGeek 2006.09.16 85
30 [소스첨부] 인자값 변경. 청연 2006.09.14 59
29 주석제거 프로그램 (수정) 청연 2006.09.13 128
28 ★C언어 처음 하시는분들 보세요.. [3] 청연 2006.09.13 202
» 2. Direct로 그림그리기! [1] file 케이코냥이 2006.09.03 166
26 한국 위키백과를 추천합니다. MrGeek 2006.09.01 84
25 1. DirectX 8.0 sdk 해보기. file 케이코냥이 2006.08.28 154
24 C#.NET 유용한 포인터 사용법(1) - 스택기반의 배열 괴짜인간 2006.08.14 124
23 VB/VC 키코드 리스트 [1] 알닭 2006.04.23 202
22 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -4- [2] 울스M 2006.02.08 215
21 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -3- [2] 울스M 2006.02.08 160
20 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -2- [5] 울스M 2006.02.08 173
19 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -1- [2] 울스M 2006.02.08 558
18 [비법은 아니지만] 비주얼 베이직에 이스터 에그 발견! [1] StartCraft 2006.02.06 287
17 질문이요. [2] 블랙호크 2006.01.06 125
16 비트맵&브레인스토밍&프로그래밍의 도(道) [1] 성령의분노 2006.01.04 307
15 자료구조 (3) - 링크리스트 [3] 성령의분노 2006.01.01 209
14 자료구조 (2) - Queue[민프레스 강의정리] [1] 성령의분노 2005.12.31 150
13 자료구조 (1) - Stack [민프레스 강의정리] 성령의분노 2005.12.30 321
12 [VB] [CD-ROM] CD-ROM 열고 닫기 StartCraft 2005.08.21 351