언어/기타
2006.09.10 03:12

2. Direct로 그림그리기!

조회 수 530 추천 수 2 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

하아- 글쓰기 이전에 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


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


 

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
984 RPG Maker -Jindow_v0.1-체험판 file -제이- 2007.01.16 1357
983 언어/기타 -_- 훗... 비법따위 이정도로.. 예화 2005.12.09 355
982 언어/기타 -ㅅ- 누가 아이디어좀 제공해주세요. 린쌍 2005.11.26 418
981 언어/기타 0.0 [S's-S] 2006.01.05 277
980 언어/기타 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요) [S's-S] 2006.09.01 397
979 언어/기타 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요) [S's-S] 2006.09.01 394
978 언어/기타 0.0초를 다룰때 조심할점 3 A. 미스릴 2009.03.13 2646
977 언어/기타 0707후반기[제작자포럼]공성결과 천무 2007.08.01 1372
976 RPG Maker 1 - 1. 변수 응용 프로그램 만들기 (난수) 천영진 2007.03.06 1279
975 언어/기타 1. DirectX 8.0 sdk 해보기. file 케이코냥이 2006.08.26 478
974 언어/기타 1. 게임 시나리오의 기초 1 샤르엘 2007.11.27 1884
973 언어/기타 1. 변수 응용 프로그램 만들기 천영진 2007.02.21 1602
972 언어/기타 100%고수강의!(변수이론) 늑대소년 2005.05.18 2428
971 RPG Maker 11. 맵배치 (숲길, 건물, 건물 안속 만들기) 천영진 2007.02.24 2065
970 언어/기타 1맵=1bgm? 고정관념을 깨자! rukia 2006.02.10 710
969 언어/기타 1픽셀씩 맵스크롤 1 file 설사즙 2010.07.12 1141
» 언어/기타 2. Direct로 그림그리기! file 케이코냥이 2006.09.10 530
967 RPG Maker 2000,2003으로만드는 전략시뮬 무역장사 2005.07.30 1470
966 언어/기타 2000용 케릭의 모션 도트 "몸통만" 1 ◈ÐÆЯΚ◈찰드 2007.05.15 930
965 RPG Maker 2006.6.19 님의 질문에 대한 설명..... 『연금술사』 2006.02.16 440
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)