★★★★ Engine 프로그래머 계획 ★★★★

이미지
== 1차 스킬 - C - C++ & STL 18.4 - C# 18.10 == 2차 스킬 - Operating System 18.7 - Data Structure & Algorithm - Database 18.7 - Network == 3차 스킬 - OpenGL < Graphics > 18.7 - Direct X < Rendering & Modeling & Shading > 18.10 - Game Math 18.5 - Game Physics 18.10 == 4차 스킬 - Unity 18.10 - Unreal - Mobile & Web & Pc & Xbox & Playstation Game Development - Game Runching & Live == 나만의 스킬 - 영어 커뮤니케이션 - 영어 원서를 읽고 이해할 수 있는 능력 - Script Programming < Python > - MS Office - 프레젠테이션, 글 쓰기

[ OpenGL 4 ] Culling, GL_ARRAY, GL_PROJECTION

이미지
OpenGL 로 육면체를 그리는 코드를 분석해보면서 기본 함수들을 배워보도록 하겠다.  실행 결과는 다음과 같다.  glMatrixMode(GL_PROJECTION); 부터 알아보자,  이 함수는 좌표에 원하는 도형을 모두 그린 후 최종적으로 화면에 출력할 때 적용할 변환 행렬을 설정한다. 이 기능이 있기 때문에 원근감을 느끼도록 멀리있는 물체를 상대적으로 작게 할수도 있고, 원근감을 제거하여 모든 물체를 거리에 상관없이 동일하게 출력할 수 있다. 결국, 최종적으로 우리 눈에 화면이 어떤 방식으로 보이는 지를 행렬로 나타내기 위해 있는 함수이다. 매개변수를 분석하면 이해가 쉽다.  먼저 GL_PROJECTION 이 있는데 이것은 투영 행렬을 사용한다 는 뜻이다. 투영이 뭔지 알아보고 지나가자. 투영이란 어떤 물체가 다른 물체위에 비친 그림자 를 뜻하는 단어이다.  다음 그림을 보자.  벡터b를 벡터a 에 투영시키면 초록색 벡터p가 된다 그래픽스에서 이 투영이 무슨 의미가 있냐면 벡터b를 사람 벡터a를 지면 그리고 a에서 보라색벡터의 방향으로 태양이 있다고 했을때 b의 a에 비친 그림자는 벡터p가 된다. 그리고 벡터b를 벡터p로 변환하는 행렬을 투영행렬 이라고 한다.  이 원리를 확장하여 투영행렬을 잘 설정하면 다음과 같은 효과를 낼 수 있는 것이다.  glLoadIdentity() 는 투영행렬을 Identity 행렬로 바꾼다는 의미이다.  Identity 행렬은 단위 행렬이다. 투영 행렬을 초기화해준다는 의미로 받아들일 수 있다. 이제 glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 를 한층 더 이해할 수 있다 OrthoGraphic은 직교투영 이라는 뜻으로, 물체를 정면에서 바라보는 효과를 낸다. 글로는 이해하기 힘드니 그림으로 알아보자.  여기서 실제로 출력되는 뷰 영역은...

[ OpenGL 3 ] 모르면 안되는 기본 함수

이미지
openGL 프로그램의 기본 틀을 알아야 이를 응용해서 원하는 프로그램을 만들 수 있다. 기본 틀 분석을 위해 사용할 코드는 다음과 같다. #include   "stdafx.h" #include   <math.h> #include   <GL/glut.h> #include   <GL/gl.h> #include   <GL/glu.h> void  MyDisplay() {          glClear( GL_COLOR_BUFFER_BIT );                  glColor3f(0.5, 0.5, 0.5);                     glBegin( GL_POLYGON );                           glVertex3f(-0.5, -0.5, 0.0);               glVertex3f(0.5, -0.5, 0.0);                glVertex3f(0.5, 0.5, 0.0);     ...

[ OpenGL 2 ] OpenGL ?

1. GL의 설계 GL은 C언어 또는 어셈블리 언어로 작성된 약 200여 개의 함수 모음이다. 따라서 C 프로그램 뿐 아니라, Java 심지어 FORTRAN 프로그램 까지도 지엘 함수를 사용할 수 있다. GL의 기본적인 설계 원리는 다음과 같다  - 범용성 : GL은 저수준 그래픽 언어로 하드웨어나 운영체제 에 관계없이 실행될 수 있도록 설계되었다.  - 효율성 : 각 그래픽 하드웨어 회사의 제품마다 지원하는 기능이 있고, 아닌 기능이 있을것이다. GL 은 이를 고려하여, 주어진 기능이 프로그램에 의해 활성화, 비활성화 될 수 있도록 기능모드Functional Mode 를 제공한다.  - ARB 확장 : 예를 들어 엔비디아의 AMD의 GPU를 생각해보자. 각 회사마다 자신들이 개발한 그래픽 기능 함수들이 있을 것이고, 이는 프로그래밍을 할 때 상당히 골치 아프게 작용할 것이다. 이를 체계적으로 관리하기 위해 OpenGL 위원회 Architecture Review Board,ARB 에서 해당 함수의 가치가 증면되면, ARB는 그 함수를 핵심기능으로 OpenGL 에 통합시킨다. 또한 이런 함수 내지 토큰 간의 이름 충돌을 피하기 위해 회사별로 이름 규칙을 만들었다. GL_NV_ .... 이라면, 이는 엔비디아사의 독점 확장이라는 의미이다. - 상호작업성 : GL은 명령을 내리는 주체와 명령을 수행(랜더링) 하는 주체가 별개의 체계로 동작한다. 이때 네트워크상으로도 전달이 가능하며 심지어 각 주체가 운영체제나 하드웨어가 달라도 가능하다. 한마디로 GL은 Server-Client 구조 이다. - 비객체지향 : GL의 함수는 객체지향 개념이 없다. 그래픽 작업에서 첫번째로 중요한 것은 속도 이기 때문에, GL 은 단지 이 속도 개선을 위해 절차지향언어로 구성되어 있다. 따라서 함수 오버로딩이 없으며 구분을 위해 명령어 구조가 정해져 있다. glVertex3fv(p) 는 gl의 3D Vertex 기능을 담당하는 함수이며...

[ Survival Shooter 5 ] Enemy 재생성 설계하기

이미지
Enemy의 Re-Spawn, 즉, Enemy의 재생성은 게임을 진행하는 중요 요소 중 하나이다. 해당 기능은 Managers 폴더의 EnemyManager Script가 담당하고 있으며, 내용은 다음과 같다. 현재는 3종류의 Enemy Object가 있는데, 물론 하나의 Script에 통합관리 할 수도 있겠지만, 해당 프로젝트에서는 Enemy마다 Script를 하나씩 추가해주고 있다. public 변수들의 역할은 이름을 보면 직관적으로 이해할 수 있다. 이 Script는 Enemy Manager라는 해당 기능만을 위한 비어있는 Object에 Component 로 들어간다. 이제 Script 를 천천히 살펴보자. 핵심 기능을 하는 메서드는 InvokeRpearing 으로, Start 함수에서 호출하고 있다. public void  InvokeRepeating (string  methodName , float  time , float  repeatRate ); time 초에 methodName 메서드를 호출한 후,  repeatRate 마다 반복 호출하는 함수이다. 즉 스크립트에서는 Spawn 이라는 메서드를 spawnTime 초 후에 첫 호출하여, spawnTime 마다 반복한다는 의미이다. InvokeRepeating에 의해 반복되는 Spawn의 내용에서 주의할 점은 Player의 체력이 0 이하라면 함수의 내용을 실행하지 않고 그냥 반환해 버리는 것으로 Spawn메서드의 기능을 형식적으로 종료하고 있다. 프로젝트에서는 게임이 종료되면 바로 다음 게임이 별다른 과정없이 바로 실행되기 때문에 이런식으로 코딩한것 같지만, InvokeRepeating 을 취소 키는 방법도 알아보고가자. 다음과 같다. CancelInvoke(string methodName) 메서드로 Invoke 로 호출이 멈출수있다. 다음으로 알아봐야 할 것은 spawn 메서드의 핵심은 Instantiate 메...

[ Survival Shooter 4 ] TPS 게임에서의 카메라 컨트롤

이미지
TPS게임에서의 카메라 조정 방식은 어느 게임에서나 비슷한 방식으로 작동하므로, 이번기회에 공부해둔다면 앞으로 많은 도움이 될것이고, 어느 유니티 입문서를 보아도 앞장에 항상 소개되는 내용이다. 한번 알아보도록 하겠다.  MainCamera : 사용자가 보는 화면을 관리하는 오브젝트이다. 컴포넌트는 About Unity 카테고리에서 분석하도록 하고, 여기서는 Script 위주로 살펴보겠다. 먼저 CameraFollow Script 는 다음과 같다. 핵심 기능은 FixedUpdate의 Transform.position = Vector3.Lerp 부분으로, 해당 컴포넌트가 포함된 transform 컴포넌트의 position 속성을 Vector3.Lerp 메서드를 통해 선형보간하여 이동하고 있다. 선형보간이 무엇인지는 수학카테고리에서 알아보도록하고, 일단은 함수의 원형과 기능만 알아보자 public static  Vector3   Lerp ( Vector3   a ,  Vector3   b , float  t );  a와 b를 t 로 보간하는데 t는 [0,1] 범위이다. t가 0에 가까울수록 a, 1에 가까울수록 b에 가까운 벡터을 반환하는데,   현재 프로젝트에서 t의 값을 출력하면 (smoothing*Time.deltatime) 0.09 로 transform.position 와 targetCampos, 사이의 위치를 계속 반환하여 다시 trasnform.position에 넣고 있다. a는 transform.position은 Player가 보는 화면을 결정하는 Main Camera 의 위치 b는 targetCamPos 즉, target.position에서 offset 만큼의 거리를 더한 값이다. target.position 은 Player Object의 position 이고, offset 은 tarnsform.position - target.position...