다이렉트X 초기화 설명 (펌) by 김윤정

======= 출처 http://cafe.naver.com/corea9.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=120


여기서 잠깐 다이렉트X 초기화 부분설명

 

Direct3DCreate9() 과 CreateDevice()에 대해서 잠시 설명하겠다. 

먼저 Direct3DCreate9() <- 이거는 솔직히 왜 하는지 모르겠다(?) ㅋㅋ MS 사에서 DirectX 그래픽 부분을 사용할때

 꼭 초기화 해줘야하는 부분이 들어있을거 같다. 그리고 MS 사에서 버전에따라 업데이트 용이(초기화 부분 수정됬을경우) 하기 위함인거 같기도 하다.


어쨋든 우리는 이것을 반듯이 해줘야한다. 그것도 프로그램 전반적으로 초기에 한번만 해줘야한다.

 

그리고 CreateDevice() 이거 굉장히 중요하다. 그리고 다양한 생성방법이 있다.

 

이것을 하고 나면 m_pD3DDevice 또는 g_pD3DDevice 가 생기는데 우리는 이것을 소중히 여겨야한다.

 

이것을 잃어버리면 우린 아무것도(그래픽에대한) 할수가 없게 된다. 이것역시 한번만 해줘야한다는 사실. ㅋ

 

이것을 할때면 D3DPRESENT_PARAMETERS 라는 구조체를 설정후에 CreateDevice() 함수의 인자로 반드시 넣어주어야한다.

 

이사실만 보더라도 MS 사가 CreateDevice() 함수의 인자가 너무많기때문에(다양하게 만들수 있기때문에) 구조체에 몽땅 설정해서 인자로 넣는것을 볼수있다.

 

여기서 우리가 옅볼수 있는 센스는? 인자가 많으면 구조체를 활용하면좋다. 또는 구조체가 인자로 들어가면, 아~ 다양한 설정이 가능하구나.

 

하여튼 설정중에는 크게 윈도우모드 / 전체모드가 있으며, 또한 수직주파수동기화 / 동기화 무시 등이 있다.

 

케릭터 등이 빠르게 움직이는경우 화면에 잘림현상등이 일어나는데 이는 수직주파수 동기화를 해주지 않아서 이다.

 

수직주파수를 동기화 하기위해서는

 

m_d3dpp.PresentationInterval = 0; 으로 해주거나(기본이 수직주파수동기임)

 

동기화를 원치않는다면,

 

m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 을 해주면된다.

 

그리고 또한 그래픽카드드라이버옵션 메뉴에들어가서 "항상 수직주파수 동기화" 로 설정해줘도 된다.(영어로 버티컬씽크~)

 

 

렌더로 화면에 그림그리기

 

위의 방법으로 소중한 g_pD3DDevice 을 얻었다면 우리는

 

g_pD3DDevice -> clear() 로 화면을 깨끗이 지울수 있고

g_pD3DDevice ->Present() 로 화면에 멋지게 그릴수 있다.

 

물론 clear 과 present 사이에 무언가를 그려야하는데 이때

g_pD3DDevice -> BeginScene() 과 g_pD3DDevice -> EndScene() 사이에 그려야한다.

 

그릴때는 트라이앵글리스트, 트라이앵글스트립, 트라이앵글팬, 라인리스트, 라인스트립, 포인트, 등을 사용해야하니 이부분을 좀더 연구해보기로 하자; 이거 설명하려면 지면이 길어지겠군 생략 캬캬캬캬

 

여기서 잠시 g_pD3DDevice -> Present() 만 설명합니다.

 

이것은 "백버퍼와 전면버퍼의 입장을 바꾼다." 란 뜻입니다.

 

연극무대를 예를들어 설명하죠, 연극 1씬 -> 해변가에서 비치볼을한다. 연극2씨-> 커피숍에서 커피를 마신다.

 

연극무대의 중앙은 돌아가도록 되어있습니다. 원판이 돌아가고 원판 가운데에 벽이 있죠. 1번씬을 할동안 벽 뒤쪽에서는 커피숍에 해당하는 무대세트를 하게 됩니다.

 

그리고 1씬이 끝나면 커튼이 내려지고 이때 원판을 180도 돌린후 커튼이 걷히고 2씬인 커피숍을 하게됩니다.

 

프로그램에서 1번버퍼 2번버퍼가 있고

 

1번버퍼가 화면에 뿌려지는 동안 2번버퍼에 그림을 그리게 됩니다.

 

그리고 g_pD3DDevice -> Present() 하여 이제 2번버퍼가 화면에 뿌려지고 그동안에 1번버퍼에 그림을 그리게 됩니다.

 

그렇기 때문에 후면버퍼의 내용이 전면버퍼로 복사된다.... 가 아니고 후면버퍼와 전면버퍼의 입장이 바뀐다.... 가 맞습니다.

 

 


덧글

  • 왕풍뎅이 2008/04/01 08:27 #

    c언어를 공부하기 전엔 뭔말인지 몰랐는뎅...winapi랑 다이렉트sdk를 보니..뭔말인지 점점 이해가 되..
※ 로그인 사용자만 덧글을 남길 수 있습니다.


MyADD

<script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>