[MFC :: OpenGL] OpenGL 시작하기

simpled 2013.09.22 09:15 조회 수 : 2571

# 사설
벌써부터 이런 말 꺼내기가 상당히 불편하다. 
하지만 몇몇 분들이 오해를 하실 수도 있어서, 미리 선을 그을 필요가 생겼다.
현재 진행되고 있는 [MFC :: OpenGL] 시리즈들은 모두 [3D Scanning] 게시물을 위해 진행되고 있는 것 이다.
누군가의 과제를 위해 올리고 있는 게시물이 아님을 밝힌다.
내 사정에 따라 언제든지 비공개 되고, 삭제 처리 될 수 있음을 알린다.

#01. 게시글을 시작하면서...
이 게시글의 대부분의 코딩 방식은 
[OpenGL을 이용한 컴퓨터 그래픽스 실습, 김재준*차경애 공저] 의 교재와
OpenGL SuperBible 제 3판 에서
 제공하는 코드를 바탕으로 전개된다. 
교훈 삼지 못할 책이 어디있겠냐만, OpenGL은 커녕 C 및 CPP도 모르는 학생들에게는 매우 좋지 못한 교재다.
MFC의 M이 무슨 약어인지도 모르는 학생들에게 기본 셋팅 방식을 3%도 알려주지 않고 곧바로 진도를 진행하기 때문이다.
또한 VC++2008 뿐만 아니라 VC++2010으로 넘어간지가 언제인데, 이 책은 VC++6.0의 예제를 사용하고 있다.
하지만, 아주 나쁜것은 아니다.
C, CPP, API, MFC 의 스텝을 차근차근 밟은 학생들에게 이 책은 OpenGL을 배우는 것에 대해 정말 많은 도움을 준다.
만약 약간의 프로그래밍 개념이 있다면 VC++의 버전은 그리 큰 영향을 주지 않으므로, 이 책은 아주 훌륭한 교재라고 할 수 있겠다.
실제로 필자는 C, CPP, API, MFC, OpenGL에 대한 각각의 개념은 있는데, API+OpenGL, MFC+OpenGL의 개념은 매우 희박하다.
그래서 이 책은 내게 굉장히 유익한 매체로 작용되고 있다.
하지만 전자의 입장도 생각해줘야 한다.
그리고 아마 이 글을 정독하고 있는 모든 사람들이 전자의 입장이라고 생각한다.
그래서 이 게시글을 쓰게 되었다.
부디 많은 도움이 되기를 바란다.

#02. 당신이 이 게시글을 읽기 전에.
나는 당신이 부디 C, C++, API 개념이 있기를 정말 (간절히x100) 바라고 있다.
하지만 이 게시글을 정독하고 있다는 것 자체가, C의 기본도 모르기 때문이라는 것을, 아주 잘 알고 있다.
하지만 나는 당신을 그렇게 까지 배려하지 않을 것이다.
이 게시글은 내 깜냥껏 상당히 불친절 할 수 있다.
인정하자.
이 블로그를 통해 한큐에 C와 C++과 API, MFC, OpenGL을 해결하는 것은 애초부터 불가능 하다.
나는 C를 독학으로 좀 하기까지 1년이 걸렸고,
C++을 컴공에서 듣고 싶어서, 예습 겸 시작한 C++독학으로 한학기 분량의 방학을 날려먹었다.
API를 컴퓨터 공학에서 들으며 그 학기 동안 매일 밤새며 책에 줄치고, 손에 익을 때 까지 코딩했었다.
프로그래밍은 제법 만만한것이 아니다.
그런것을 일일이 알려주며 진도를 나가는것은 내게 이곳에다가 책을 쓰라는 말과 같다.
그래서 만약 이해를 못하더라도, 그림으로 코드를 따라 할 수 있도록
모든 코드를 그림으로 캡쳐떠서 올릴 것이다.
이해가 잘 안되면 그림이라도 잘 따라오기를 바란다.

#03. 권장 도서
필수 : Visual C++ 2008 MFC 윈도우 프로그래밍 (프리렉) 최호성 지음
필수 : OpenGL을 이용한 컴퓨터 그래픽스 실습 (홍릉과학출판사) 갬재준*차경애 공저
권장 : 윈도우즈 API 정복 제 1개정판 (한빛미디어) 김상형 지음

#04. 프로그램 방향
이 [MFC :: OpenGL] 프로젝트는, 하나의 OpenGL 프로젝트를 연속적으로 개선시키는 것에 의의를 둘 것이다.
이 [MFC :: OpenGL] 프로젝트에 기술되는 프로젝트들은 전부 다른 프로젝트가 아닌, 하나의 목적을 위해, 계속적으로 Develop 되는 프로젝트임을
미리 #define !









일단 이전 게시글 
[OpenGL] OpenGL 표현에 필요한 파일들...
에 OpenGL에 필요한 파일들을 올려놓았으니 다운받기를 바란다.


001.jpg EXIF Viewer사진 크기500x464

<그림 1 :: VC++ 2008의 경로>

 

glut.h 와 같은 헤더 파일은 VC++의 설치폴더에서 Include 폴더의 GL 폴더에 복사한다.
glut32.lib 와 같은 정적 라이브러리 파일은 VC++ 설치 폴더의 Lib 폴더에 복사한다.
glut 32.dll 과 같은 동적 라이브러리 파일은 C드라이브의 Windows 폴더의 System32 폴더에 복사한다.

002.jpg EXIF Viewer사진 크기500x357

<그림 2 :: MFC 프로젝트의 시작>



MFC 프로젝트의 생성에 대해서는 꼼꼼하게 설명하지 않겠다.

그냥 이렇게 생성하는 거다.
필자는 2011.10.07 First 란 이름으로 프로젝트를 생성시켰다.

003.jpg EXIF Viewer사진 크기500x330

<그림 3 :: MFC 프로젝트 속성 수정>

 

MFC 프로젝트는 싱글도큐먼트 타입으로 생성하고 COOOOOL 하게 완료를 눌러라.
'다음'을 눌러봐도 평생 써먹지도 못할 옵션들의 선택에 갈등만 할 뿐이다.

일단  MFC 프로젝트가 생성되면, ALT+F7로 프로젝트 속성을 <그림 3>과 같이 바꿔준다.
프로젝트 속성의 좌측 트리에서, 구성속성 -> 링커 -> 추가 라이브러리 디렉터리 -> opengl32.lib; glu32.lib; glut32.lib; 로 수정했다.
물론 Release모드에서도 exe파일을 생성해야 하므로 구성은 모든 구성으로 필히 바꿔놓아야 한다.

004.jpg EXIF Viewer사진 크기276x458

<그림 4 :: 클래스 뷰 On!>

 

Ctrl + Shift + C를 통해 클래스 뷰 보기를 <그림 4>와 같이 활성화 시킬 수 있다.


005.png  <그림 5 :: Warning C4819 발생>

 

일단 독자의 입장에서, 현재 프로그램 안에, 어떤 코딩이 존재하는지는 그리 중요하지 않다.

아무튼 OpenGL에 관련된 코딩을 작성하고 컴파일을 돌렸다는 사실에 주목하자.

만약 아무런 옵션 조작을 하지 않았다면 <그림 5>와 같이 Warining이라 표기된 경고문이 많이 뜨는 것을 볼 수 있을 것이다.


006.png

 <참고 자료 : http://blog.naver.com/khs01016?Redirect=Log&logNo=44587778 >


Warning C4819 은 한글 주석이 달려 있을 때 유니코드와 충돌하여 나타나는 경고문이다.

(un유니코드는 알파벳과 숫자만 표현하지만, 유니코드는 전 세계의 언어를 표현 할 수 있는 표현 수단이다.)

경고문은 Error가 아니므로 무시해도 되지만, 출력 창에 중요한 Error와 뒤섞이면 나중에 디버그 하기 여간 짜증나는게 아니므로 꼭 고치고 넘어가자.


006R.png

<그림 6 :: Warning C4819 수정>


007.png

<그림 7 :: Warning C4819 차단>

 

ALT + F + V 를 통해 '저장 고급옵션'을 들어가서 인코딩 사항을 <그림 6>과 같이 바꿔준다.

그리고 View 클래스의 헤더파일로 들어가서 5, 6 줄의 코드를 입력한다. (View 클래스의 해더파일은 끝에 ~View.h라고 기입되어 있다.)


5번째 줄의 코드는 Warning C4819 를 무시하는 선언이며 

6번째 줄의 코드는 OpenGL의 헤더파일들을 선언하는 선언이다. 물론 해결 방안은 네이버 블로그들을 뒤져서 알아내었다.


GL폴더에 있는 헤더파일을 아무렇지 않게 그냥 선언해도 Error가 나오지 않는 이유는 

필자가 opengl에 관련된 헤더파일을 include폴더 및 include/GL폴더에 동시에 복사해 두었기 때문이다.

매번 #include "GL/opengl.h" 하면 귀찮기 때문에 필자는 위와 같은 선언을 지향한다.


008.png

<그림 8 :: 코드 이동>


여기까지 했다면 Ctrl + F5 로 디버그를 실행하여 오류가 하나도 없음을 확인하기 바란다.

만약 정상적으로 창이 뜨는 것을 확인 했다면,

번거롭겠지만 <그림 8>과 같이 stdafx.h로 코드를 옮겨주는 것을 적극 권장한다.

MFC는 APP, FRAME, VIEW, DOCU', 등등의 다양한 클래스가 존재한다.

이 모든 클래스에서 <그림 7>과 같이 해더파일 및 오류 무시 선언을 하는 것은 상당히 번거로운 일이다.

stdafx.h는 미리컴파일되는 헤더파일이며, 이곳에 선언하면 모든 클래스에 골고루 적용된다.


009.png

<그림 9 :: View 클래스>

 

일단 이 게시물을 본 자체가 C++의 Class 개념을 전혀 모른다고 가정하고, 

일단 닥치고 따라하자. 

<그림 9>와 같이 View 클래스 해더파일의 클래스 이름을 복사(Ctrl+C) 해둔다.

앞으로 그림 내에서 빨간 선으로 밑줄 쳐진 것은 클래스 이름으로 덮어씌우며 수정해야 할 것이다.


010.png

<그림 10 - a :: 클래스 멤버 선언>


010B.jpg EXIF Viewer사진 크기372x186

 <그림 10 - b :: 클래스 멤버 선언>



그리고 조금 아래로 내려가서 <그림 10 - a>와 같이, 48~59 라인의 변수들을 입력해주자. 

또한 <그림 10 - a>바로 밑으로 <그림 10 - b>와 같이 protected 메서드를 추가하자.

이해가 중요한가, 창을 띄우는게 중요한가? 만약 후자라면 그냥 닥치고 따라하자.


011.png

 <그림 11 :: 메서드(method) 외부 선언>

 

~View 클래스의 cpp 파일에서 메서드의 선언을 다음과 같이 선언한다.

이 때, 예전에 Ctrl+V를 이용하여    클래스 이름 :: 메서드(함수) 이름    의 규칙을 따라준다.

자세한것은 <그림 11>을 참고하기 바란다.

여기까지 했으면 확인차, Ctrl + F5 키를 눌러서 디버그가 정상적으로 실행되는지 확인한다.


012.png

<그림 12 :: Create 메서드 추가>


~view 클래스의 cpp 파일을 열고 본격적으로 코드를 뜯어 고치기 전에 몇 가지 메서드(함수)를 추가하자.

가장 처음은 View 클래스에 대해 WM_CREATE 메서드를 추가하는 것이다.

방법은 <그림 12> 와 같으며, 화살표를 따라가며 OnCreate 메서드(함수)를 추가하면 된다.


같은 방법을 통해 추가해야 할 메서드는 다음과 같다.


WM_CREATE   -> OnCreate ();

WM_SIZE  -> OnSize ();

WM_DESTROY  -> OnDestroy ();

WM_ERASEBKGND -> OnEraseBkgnd ();

WM_PALLETTECHANGED -> OnPalettedChanged ();

WM_LBUTTONDOWN -> OnLButtonDown ();

WM_QUERYNEWPALETTE -> OnQueryNewPalette();


이제 ~View.cpp 파일을 수정하자.

아래의 코드를 따라가며 수정하기 바란다.


01. 기존에 있는 코드들을 수정한다. (PreCreateWindow 및 OnDraw 메서드)

012AA.jpg EXIF Viewer사진 크기382x287


02. 마법사를 이용한 메서드들을 수정한다.

#1 WM_CREATE

012AB.png

  #2 WM_SIZE

  012AC.png

#3 WM_DESTROY

012AD.png

#4 WM_ERASEBKGND : 아무 수정 코드도 없지만 순서가 뻘쭘 할 것 같아서 넣는다.

  012AE.png

  #5 WM_PALLETTECHANGED

  012AF.png

#6 WM_LBUTTONDOWN : 특별히 ~Doc 클래스가 추가되었다.

012AG.png

 

#07 WM_QUERYNEWPALETTE

012AH.jpg EXIF Viewer사진 크기521x361

 03. 사용자가 추가한 메서드를 수정한다. (GLResize, GLRenderScene, GLSetupRC, InitializePalette)

# GLResize

012BA.png

# GLSetupRC

012BB.png

# GLRenderScene : 내부의 Docu 클래스는 일반적으로 ~Doc 이란 변수명을 갖느다.

  012CA.png

# InitalizePalette

012DA.png

 

013.png<그림 13 :: 결과>


위의 모든 사항을 만족시키고 Ctrl+F5를 통해 디버그를 하였다면, <그림 13>과 같은 결과를 볼 수 있다. 

아무것도 안보이고 까맣게 보이는 것이 정상이다.

참고로 OpenGL코드를 적용하기 전의 MFC 기본 배경색은 WHITE였으므로, 이 정도의 결과만 보여줘도 대략 OpenGL이 실행 되었음을 체감할 것이다.


014.png

<그림 14 :: 배경색 수정>



그래도 이게 무슨 개소리인가 하는 분들이 있을 것 같아서 코드를 <그림 14>와 같이 수정했다.

glClearColor에서 0.0f, 0.0f, 0.0f, 1.0f 의 코드를 1.0f, 1.0f, 0.0f, 1.0f 로 바꿔주었다.

glClearColor 함수의 각 인자값은 RED(빨강색) GREEN(녹색) BLUE(파랑색) ALPHA (투명값)이다.


015.png

 <그림 15 :: 결과>


이 정도까지만 해도 아, OpenGL 코딩을 성공 했구나. 

란 생각을 하게 될 것이다.


번호 제목 글쓴이 날짜 조회 수
공지 본 게시글의 첨부파일 권한 심플디 2014.08.22 3957
47 [MFC :: OpenGL] Zoom in / Zoom out (+ Wheel 버튼 활용) (옮김) [2] file 심플디 2014.04.25 4670
46 [MFC :: OpenGL] 컴공 수업 발표 자료 (옮김) [2] 심플디 2014.04.25 4029
45 [MFC :: OpenGL] 회전과 이동 (마우스) [2] file 심플디 2014.04.15 3200
44 [MFC :: OpenGL] OpenGL 시작하기 -> 설명 file simpled 2013.09.22 2659
43 [MFC :: OpenGL] 회전과 이동 (키보드) file 심플디 2014.04.15 2579
» [MFC :: OpenGL] OpenGL 시작하기 [2] file simpled 2013.09.22 2571
41 [MFC :: OpenGL] IGES 파일 포맷 분석 [2] file simpled 2013.09.22 2561
40 [MFC :: OpenGL] DXF 파일 포맷 분석 file 심플디 2013.09.22 2340
39 [MFC :: OpenGL] MFC CODE (작도 및 컨트롤) file simpled 2013.09.22 2327
38 [MFC :: OpenGL] DXF 파일 포맷의 기본 지식 simpled 2013.09.22 2282
37 [MFC :: OpenGL] 리소스 추가2 & 점, 선, 면 file 심플디 2013.10.28 2281
36 [MFC :: OpenGL] 움직이는 사각형 (옮김) file 심플디 2014.04.25 2246
35 [MFC :: OpenGL] 조명 설정 (옮김) 심플디 2014.04.25 2203
34 [MFC :: OpenGL] 리소스 추가 1 file simpled 2013.09.22 2189
33 [MFC :: OpenGL] Tool bar(툴바) 편집방법 (옮김) 심플디 2014.04.25 2121
32 [MFC :: OpenGL] 바닥과 좌표 축 설정 (옮김) file 심플디 2014.04.25 2111
31 [MFC :: OpenGL] Data Dialog 와꾸짜기 (옮김) 심플디 2014.04.25 2016
30 [MFC :: OpenGL] 비트맵(이미징), 텍스쳐 (옮김) 심플디 2014.04.25 2010
29 MFC :: OpenGL] ProjectMFCReport 와꾸짜기 (옮김) 심플디 2014.04.25 1987