posted by REDFORCE 2017. 4. 17. 21:53

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics  (현재 글)

 + Image - SpriteData

 + Layer

 + Input

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------


Graphics Class의 핵심 내용에 이어서 나머지 함수들에 대해서 정리하도록 하겠습니다.


아래 코드는 Graphics class에서 제공해주는 VertexBuffer / Draw Quad / Draw Line 함수 입니다.



1. createVertexBuffer


VertexBuffer 라는 말에서 볼 수 있듯이


createVertexBuffer 함수는 directX를 공부하셨다면 Vertex 라는 개념을 이해할 수 있습니다.

이때 사용하는 함수인데, 모든 이미지나 어떤 출력물은 vertex라 하는 좌표점들을 통해 구성이 되어집니다.


특히 3D의 모델은 삼각형으로 이루어진 폴리곤의 집합체라 볼 수 있습니다.


마찬가지로 2D 에서도 Vertex를 이용한 Drawing이 필요할 때가 있습니다.


그 예시들은 다음에 기회가 되면 설명드리기로 하고, 지금은 일단 넘어가겠습니다.



2. DrawLine / DrawQuad


DrawLine과 DrawQuad는 Vertex를 이용하여 어떤 선 / 면을 그리는 함수 입니다.

인게임 자체에서 자주 이용할지 여부는 때에 따라 다르나,


맵툴에서의 타일 또는 간단한 테스팅을 위한 UI용도로는 상당히 편리한 함수입니다.




3. showBackBuffer


세 번째 showBackBuffer 함수는 매우 심플하여 별거 없어보이지만

의미 자체는 정말 중요한 함수입니다.


showBackBuffer의 내용을 보면 간단히 코드 한줄로만 이루어져 있습니다.

(return 문은 계산에서 제외..)


device3d->Present(NULL, NULL, NULL, NULL);


가 그 코드인데요.


present(NULL, NULL, NULL, NULL)로 주는 순간. 


Device에서는 "아~ 내가 출력할 것들다 넣어줬어? 그럼 이제 렌더링해야지~"

하고 받아들이게 됩니다.


결국 showbackbuffer 라는 함수는 매 프레임 렌더할 내용들이 끝나는 시점인 마지막에

호출하게 됩니다.



4. isAdapterCompatible


isAdapterCompatible 함수는 원래 initialize 를 다룰때 설명해드렸어야 했으나


제가 실수로 이제와서 언급하게 되었네요.


함수의 내용을 보면 UINT 값 modes 를 통해 현재 모니터의 어댑터 모드를 볼 수 있습니다. DVI라던지...HDMI라던지...그리고 받아온 값을 통해 전체화면으로 출력 할 시


adapter 값을 확인하고 화면의 width height 값 만큼 전체 화면으로 출력 해줍니다.



5. drawSprite


5번째로 설명할 drawSprite 함수는 Graphics 클래스에서 가장 많이 사용 되어지며


결과적으로 Graphics 클래스가 궁극적으로 'rendering' 이라는 역할을 수행하는

함수가 바로 drawSprite 입니다.




drawSprite 함수는 2가지 파라미터 값을 받습니다.


 (1) SprtieData 구조체 타입 값

 (2) 투명 적용시킬 컬러 값


SpriteData 구조체는 앞에서 몇번 언급했듯이 모든 이미지들이 담겨져있는 데이터 구조체 입니다.


SpriteData 구조체를 까먹으신 분들을 위해 다시 한번 SpriteData 구조체안에 어떤 정보들이 담겨있는지 다시 살펴보겠습니다.



구조체 안에 있는 정보들을 보면 


 (1) width / height  (텍스쳐 그림 크기)

 (2) x, y (출력할 x, y 좌표)

 (3) scale (스케일 크기)

 (4) angle (출력 할 그림의 각도)

 (5) rect (텍스쳐 안에서 출력 할 부분)

 (6) 기타..(texture / 반전 여부)


들이 있습니다. 위 항목들을 토대로 drawSprite 함수에서 필요한 내용들이 수행되어집니다.


차례대로 함수안의 내용을 나열해보겠습니다.


 A. spriteCenter : SpriteCenter 값은 출력 할 스프라이트(그림)의 센터를 받아옵니다.

 B. translate : 스크린상의 x, y 좌표로 변환 값

 C. scaling : SpriteData 안에 있는 scale 값을 토대로 이미지에 연산 시킬 스케일 값

 D. 좌우상하 반전 여부를 통해 센터값을 기준으로 상하좌우 반전을 계산합니다.

 E. D3DXMatrixTransformation2D 함수를 통해 연산 값들을 넣어 최종 D3DMATRIX (matrix)에 넣습니다.

 F. 나온 결과 값을 토대로 sprite에 matrix 값을 transform 시킵니다.

 G. 마지막으로 Draw 함수 수행.


위 과정을 간추려 요약하자면  3가지 단계로 이루어지게 됩니다.


 ① SpriteData구조체 값을 통해 출력 할 내용을 D3DMatrix 값으로 변환 

 ② LPD3DXSPRITE 에 SetTransform (위치나 스케일 등 Setup)

 ③ LPD3DXSPRITE Draw


첫 번째 과정이 조금 길게 느껴지실 수 있으나 한번 위와같이 설정해두면 우리는 어떤 그림이든 이제 이 함수 자체만을 통해 바로바로 그림을 출력 할 수 있게 됩니다.


계속해서 적으면 글이 너무 길어지므로, 이번 글에서는 DrawSprite 까지만 다루도록 하겠습니다.

'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #3_Image (Class) & SpriteData (Struct)  (0) 2017.04.19
June_Engine #2_Graphics.cpp (3)  (0) 2017.04.18
June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
June_Engine #2_Graphics.h  (0) 2017.04.07
June_Engine #1_MainNode  (0) 2017.04.07