소개
안녕하세요. 세번째 튜토리얼 입니다. 여기서는 2강의 내용을 확장하여 OpenGL에 놀라운 색상을 추가하는 법을 알아볼 것입니다. 물론 매우 약간의 노력만 들여서 말입니다. 여러분들은 단색으로 한 표면을 칠하는 방법뿐만 아니라 부드럽게 그라데이션을 입히는 방법도 배울 것입니다. 왼쪽에 있는 삼각형이 부드러운 방법을 사용할 것이고, 오른쪽에 있는 사각형이 단색을 사용할 것입니다. 삼각형에 있는 색상들이 어떻게 혼합되는지 잘 살펴봐 주세요.
색상은 OpenGL 프로젝트에 생명을 불어넣어줍니다. 단색 및 부드러운 색칠법을 이해하시면 OpenGL 데모를 정말 그럴듯하게 만들 수 있을 것입니다.
본문지난 튜토리얼에서 저희가 다뤄봤던 내용은 삼각형과 사각형을 화면에 출력시키는 방법이었습니다. 이 튜토리얼에서는 그 삼각형과 사각형에 상이한 두종류의 색칠법을 더하는 법을 알아볼 것입니다. 단색 색칠법은 그 사각형을 속이 꽉찬 단색으로 만드는 것입니다. 부드러운 색칠법은 삼각형의 각 점(정점)에서 정의된 세가지 색상을 혼합하여 그럴듯해 보이는 색상을 만드는 것입니다.
지난 튜토리얼의 코드를 다시 사용하면서 DrawGLScene 함수에 몇가지 내용을 추가할 것입니다. 아래에 이 함수의 전체코드가 있으니 지난 강좌에서 사용하셨던 DrawGLScene 함수 전체를 아래의 코드로 교체하시거나 변경된 사항만을 찾아서 추가해주시면 됩니다.
<pre> int DrawGLScene(GLvoid) // 모든 드로잉을 처리하는 곳 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 화면과 깊이 버퍼를 지움 glLoadIdentity(); // 현재 모델뷰 행렬을 리셋
glTranslatef(-1.5f,0.0f,-6.0f); // 왼쪽으로 1.5단위, 화면안쪽으로 6단위 이동
glBegin(GL_TRIANGLES); // 삼각형 그리기를 시작 </pre> 2강에서 배웠던 내용을 기억하신다면 다음의 코드가 화면 좌측에 삼각형을 그린 다는 것을 아실 것입니다. 다음 줄은 처음으로 glColor3f(r,g,b)를 사용합니다. 괄호안에 있는 3개의 인자는 빨강, 녹색, 파랑의 명암(intensity)값입니다. 이 값의 범위는 0.0f부터 1.0f입니다. 이는 화면의 배경을 지우기 위해 사용했던 색상 값과 동일한 방법으로 작동됩니다.
여기서 사용할 색상은 빨강색 입니다(최대 빨강 명도값, 녹색 및 파랑색 값은 0.0f). 그 아래에 오는 코드는 삼각형의 첫번째 정점(삼각형의 윗부분)을 지정하고 현재 색상인 빨강색으로 이 정점을 그려라 하는 부분입니다. 다른 색상으로 바꾸기 전까지는 현재 색상으로 지정된 빨강색이 앞으로 그려지는 모든 것에 적용될것입니다. <pre> glColor3f(1.0f,0.0f,0.0f); // 빨강색으로 설정 glVertex3f( 0.0f, 1.0f, 0.0f); // 중앙에서 1단위 위로 이동(꼭지점) </pre>
이제 화면에 첫번째 빨강 정점을 위치시켰으니 두번째 정점을 찍기전에 색을 녹색으로 바꿉니다. 왼쪽 코너 부분의 두번째 정점이 녹색이 될 것입니다.
<pre> glColor3f(0.0f,1.0f,0.0f); // 녹색으로 설정 glVertex3f(-1.0f,-1.0f, 0.0f); // 왼쪽 아래로 1단위씩 이동(왼쪽 ㅁ코너 점) </pre>
이제 마지막으로 세번째 정점입니다. 이번에는 파랑색으로 사용할 것입니다. 이 정점은 삼각형은 오른쪽 코너부분입니다. glEnd() 명령어가 실행되자마자 이 폴리곤의 속이 채워질 것입니다. 그러나 각 정점의 색상이 다르기 때문에 단색으로 전체면이 칠해지지 않고, 각 코너로부터 다른 색상들이 퍼져나갈 것입니다. 이 색은 결과적으로 중앙에서 만나면 모든 색이 혼합되어 집니다. 이것을 부드러운 색칠법(smooth coloring)이라고 합니다.
<pre> glColor3f(0.0f,0.0f,1.0f); // 파랑색 으로 설정 glVertex3f( 1.0f,-1.0f, 0.0f); // 오른쪽 아래로 1단위씩 이동(오른쪽 코너점) glEnd(); // 삼각형 그리기가 끝났음
glTranslatef(3.0f,0.0f,0.0f); // 오른쪽 점에서 오른쪽으로 3단위 이동 </pre>
이제 파랑색 하나로 사각형을 칠할 차례입니다. 한 색상을 설정한 후에 그려지는 모든 것들은 바로 설정한 그 색상을 가진다는 점을 반드시 기억합시다. 앞으로 진행되는 모든 강좌들은 단색 또는 부드러운 색칠법을 사용할 것입니다. 장면에 모든것들이 텍스쳐 매핑이 된 상태라도 여전히 텍스처의 색상을 미세조정하기 위해 glColor3f를 사용합니다. 이에 대한 자세한 내용은 나중에 다루겠습니다. 따라서 사각형을 모두 한 색상으로 그리려면 색상을 한번만 선택한 뒤(여기서는 파랑색으로 선택합니다) 사각형을 그리면 됩니다. 각 정점마다 색상을 바꿔주지 않으므로 사각형의 각 정점은 파랑색만을 사용하게 될 것입니다. 마지막 결과는... 당연히... 파랑색으로 가득 채워진 사각형입니다. 다시 한번 말씀드리는데 이 사각형은 시계방향 순으로 그려지기 때문에 당연히 바라보는 곳은 이 사각형의 뒷면이 됩니다. <pre> glColor3f(0.5f,0.5f,1.0f); // 파랑색으로 설정. 한번만 설정함 glBegin(GL_QUADS); // 사각형 그리기를 시작 glVertex3f(-1.0f, 1.0f, 0.0f); // 왼쪽 위로 1단위씩(좌상점) glVertex3f( 1.0f, 1.0f, 0.0f); // 오른쪽 위로 1단위씩(우상점) glVertex3f( 1.0f,-1.0f, 0.0f); // 오른쪽 아래로 1단위씩(우하점) glVertex3f(-1.0f,-1.0f, 0.0f); // 왼쪽 아래로 한단위씩(좌하점) glEnd(); // 사각형 그리기를 마침 return TRUE; // 계속 진행할 것 } </pre>
마지막으로 윈도우의 윗부분에 등장하는 타이틀이 제대로 나오도록 창모드 / 전체화면 모드를 토글하는 코드를 변경합니다.
<pre> if (keys[VK_F1]) // F1키가 눌리고 있는지 확인 { keys[VK_F1]=FALSE; // 그렇다면 그 키를 FALSE로 변경 KillGLWindow(); // 현재 윈도우를 죽임 fullscreen=!fullscreen; // 전체화면 / 창모드 토글 // OpenGL 윈도우를 다시만듬( 수정된 코드 ) if (!CreateGLWindow("NeHe의 색상 튜토리얼",640,480,16,fullscreen)) { return 0; // 창을 만드는데 실패했다면 빠져나감 } } </pre>
저는 본 강좌에서 OpenGL 폴리곤에 단색 색칠법 및 부드러운 색칠법을 추가하는 방법을 가능한 자세히 설명드리려고 노력했습니다. 여러분은 코드를 이리저리 변경하면서 결과물을 살펴보시길 바랍니다. 빨강, 녹색, 파랑색의 값들을 다른 숫자들로 바꿔본 뒤, 어떤 색상이 나오는지를 살펴보는 것도 좋을듯 싶습니다. 이 강좌에 대한 의견이나 질문이 있으신 분들은 제게 이메일을 보내주십시요. 만약 제가 잘못 설명을 한 부분이 있거나 코드 일부분을 더 좋게 개선할 여지가 있다고 생각하시는 분들도 역시 제게 알려주십시요. 저는 힘닿는한 최고의 OpenGL 튜토리얼을 만들고 싶습니다. 따라서 여러분의 피드백은 저에게 매우 소중하답니다.
소스코드 다운로드이 강좌의 소스코드를 다운받으실 수 있습니다. 자신의 환경에 맞는 파일을 받아 사용하세요. * [http://nehe.gamedev.net/data/lessons/vc/lesson03.zip Visual C++]
* [http://nehe.gamedev.net/data/lessons/asm/lesson03.zip ASM] (제공: Foolman ) * [http://nehe.gamedev.net/data/lessons/bcb6/lesson03_bcb6.zip Borland C++ Builder 6] (제공: Christian Kindahl ) * [http://nehe.gamedev.net/data/lessons/beos/lesson03.zip BeOS] (제공: Rene Manqueros ) * [http://nehe.gamedev.net/data/lessons/c_sharp/lesson03.zip C#] (제공: Joachim Rohde ) * [http://nehe.gamedev.net/data/lessons/csgl/lesson03.zip VB.Net CsGL] (제공: X ) * [http://nehe.gamedev.net/data/lessons/cwarrior/lesson03.zip Code Warrior 5.3] (제공: Scott Lupton ) * [http://nehe.gamedev.net/data/lessons/cygwin/lesson03.tar.gz Cygwin] (제공: Stephan Ferraro ) * [http://nehe.gamedev.net/data/lessons/d/lesson03.zip D Language] (제공: Familia Pineda Garcia ) * [http://nehe.gamedev.net/data/lessons/delphi/lesson03.zip Delphi] (제공: Michal Tucek ) * [http://nehe.gamedev.net/data/lessons/devc/lesson03.zip Dev C++] (제공: Dan ) * [http://nehe.gamedev.net/data/lessons/euphoria/lesson03.zip Euphoria] (제공: Evan Marshall ) * [http://nehe.gamedev.net/data/lessons/gameglut/lesson03.zip Game GLUT] (제공: Milikas Anastasios ) * [http://nehe.gamedev.net/data/lessons/glut/lesson03.zip GLUT] (제공: Andy Restad ) * [http://nehe.gamedev.net/data/lessons/irix/lesson03.zip Irix] (제공: Lakmal Gunasekara ) * [http://nehe.gamedev.net/data/lessons/java/lesson03.zip Java] (제공: Jeff Kirby ) * [http://nehe.gamedev.net/data/lessons/java_swt/lesson03.zip Java/SWT] (제공: Victor Gonzalez ) * [http://nehe.gamedev.net/data/lessons/jedisdl/lesson03.zip Jedi-SDL] (제공 : Dominique Louis ) * [http://nehe.gamedev.net/data/lessons/jogl/lesson03.jar JoGL] (제공: Kevin J. Duling ) * [http://nehe.gamedev.net/data/lessons/lccwin32/lccwin32_lesson03.zip LCC Win32] (제공: Robert Wishlaw ) * [http://nehe.gamedev.net/data/lessons/linux/lesson03.tar.gz Linux] (제공: Richard Campbell ) * [http://nehe.gamedev.net/data/lessons/linuxglx/lesson03.tar.gz Linux/GLX] (제공: Mihael Vrbanec ) * [http://nehe.gamedev.net/data/lessons/linuxsdl/lesson03.tar.gz Linux/SDL] (제공: Ti Leggett ) * [http://nehe.gamedev.net/data/lessons/lwjgl/lesson03.jar LWJGL] (제공: Mark Bernard ) * [http://nehe.gamedev.net/data/lessons/mac/lesson03.sit Mac OS] (제공: Anthony Parker ) * [http://nehe.gamedev.net/data/lessons/macosxcocoa/lesson03.zip Mac OS X/Cocoa] (제공: Bryan Blackburn ) * [http://nehe.gamedev.net/data/lessons/masm/lesson03.zip MASM] (제공: Nico (Scalp) ) * [http://nehe.gamedev.net/data/lessons/pbasic/lesson03.zip Power Basic] (제공: Angus Law ) * [http://nehe.gamedev.net/data/lessons/pelles_c/lesson03.zip Pelles C] (제공: Pelle Orinius ) * [http://nehe.gamedev.net/data/lessons/perl/lesson03.zip Perl] (제공: Cora Hussey ) * [http://nehe.gamedev.net/data/lessons/python/lesson03.tar.gz Python] (제공: John Ferguson ) * [http://nehe.gamedev.net/data/lessons/realbasic/lesson03.rb.hqx REALbasic] (제공: Thomas J. Cunningham ) * [http://nehe.gamedev.net/data/lessons/scheme/lesson03.zip Scheme] (제공: Jon DuBois ) * [http://nehe.gamedev.net/data/lessons/solaris/lesson03.zip Solaris] (제공: Lakmal Gunasekara ) * [http://nehe.gamedev.net/data/lessons/vb/lesson03.zip Visual Basic] (제공: Ross Dawson ) * [http://nehe.gamedev.net/data/lessons/vfortran/lesson03.zip Visual Fortran] (제공: Jean-Philippe Perois ) * [http://nehe.gamedev.net/data/lessons/vs_net/lesson03.zip Visual Studio .NET] (제공: Grant James )
원문 정보* 저자: Jeff Molofee (NeHe) * 원문보기: [http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=03 Lesson 03]
번역문 정보* 초벌번역: [[사용자:Pope|포프]] * 재벌번역: [[사용자:Es | 이스]] * 감수: [[사용자:Es | 이스]]
현재 상태
- 초벌번역시작 (2005년 7월 28일)
- 초벌번역완료 (2005년 7월 28일)
- 재벌번역및감수완료 (2005년 7월 29일)
|