이번 장에서는 색에 대해서 알아보도록하자. 색을 지정하는 윈도우즈 API로 RGB함수가 있다. 인자를 3개 받는데 각각 빨간색, 녹색, 파란색을 갖으며 0~255사이의 값을 갖는다. OpenGL도 마찬가지인데 조금 다른 것은 이 3개의 인자로 실수형, 정수형, 배열형 등 다양하게 취한다는 것이다. 이때 주목해야 할것은 실수형일때와 정수형일때 각 값이 갖을수있는 범위이다. 실수형에 있어서는 0~1.0사이의 값을 갖으며 정수형은 우리가 알고 있는 0~255 사이의 값을 갖는다. 또한 배열을 인자로 받는 경우 그 배열의 각 셀은 빨간색, 녹색, 파란색의 값을 갖는다. OpenGL은 이 3개의 색상값 말고도 하나의 값을 더 갖는 경우가 있는데 이것은 바로 알파(Alpha) 값이다. Alpha값은 투명도라는 특성값이다. 이장에서 Alpha에 대한 설명은 하지 않겠다. 지금까지의 설명이 색에 대한 것들의 대부분이다. 이제 실제 코딩을 통해 익혀보자. 우리는 정육면체를 생성하고 각면에 서로 다른 색을 지정해 보는 것으로 이장을 마칠까한다.
우리가 사용할 코드는 1장의 소스코드에서 시작한다.
먼저 전역 변수를 하나 선언해야 한다. 물체를 지속적으로 회전시키는데 사용하는 변수이다. 소스 코드의 전역변수를 선언하는 곳에 아래의 코드를 추가하자.
GLfloat rot = 0.0f;
이제 물체를 그리고 각면에 서로 다른 색을 입히는 코드를 만들어보자. 물체를 그려주는 코드이므로 DrawGLScene 함수서 코딩을 해주면 된다. 다음은 그 내용이다.
int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(rot, 1.0f, 1.0f, 0.0f); glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 0.0f); // 1면을 Red으로 칠한다. glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 0.5f); // 2면을 밝은 노란색으로 칠한다. glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glColor3f(0.0f, 0.0f, 1.0f); // 3면을 Blue로 칠한다. glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glColor3f(1.0f, 1.0f, 0.0f); // 4면을 노란색으로 칠한다. glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glColor3f(0.0f, 1.0f, 1.0f); // 5면을 Cyan으로 칠한다. glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glColor3f(1.0f, 1.0f, 1.0f); // 6면의 한쪽 꼭지점의 색 지정 glVertex3f(-1.0f, 1.0f, -1.0f); glColor3f(1.0f, 0.0f, 1.0f); // 6면의 두번째 꼭지점의 색지정 glVertex3f(-1.0f, 1.0f, 1.0f); glColor3f(0.0f, 1.0f, 0.0f); // 6면의 세번째 꼭지점의 색지정 glVertex3f(1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 0.0f); // 6면의 네번째 꼭지점의 색지정 glVertex3f(1.0f, 1.0f, -1.0f); glEnd(); rot+=1.0f; if(rot>359) rot=1.0f; return TRUE; }
위 코드에서 중요한 것은 색을 지정하는 방법이다. 일단 색이 한번 지정되면 그 이후로 만들어지는 모든 물체에 대해서 그 색이 반영이 된다. GL_QUADS으로써 면을 생성하는데 면의 생성에 앞서 색을 지정해주면 그 면에 지정된 색이 칠해지게 된다. 그런데 약간 다른 것이 하나 있는데 그것은 6번째 면에 대한 색의 지정이다. 색의 지정을 각 점을 지정할때 마다 해주었는데 이것의 효과는 한 점에서 지정된 색과 다른 한점에서 지정된 색으로 두 점 사이로 부드러운 색변화로써 색을 지정하는 것이다. 즉 우리가 많이 보는 그라이디언트로 색이 지정되는 것이다.
이제 실행해보자. 아래는 그 실행 결과이다.
실제로 6면에 대해서 다른 면과는 다른 모습으로 색이 칠해졌음을 알수있다.
이로써 색에 대한 것들을 마친다.
고마운 강의 감사히 잘 들었습니다 ^^*
네, 저도 감사합니다~ ^^*
잘 읽었습니다.
Kwon님, 매번 댓글 감사드립니다~ ^^
감사합니다. 너무 많은 도움이 됩니다.
댓글이 감사합니다~ ^^
매일 하나씩 공부하고 있습니다. 벌써 Color까지 왔네요. 앞으로도 잘 부탁드립니다.
감사합니다. ^^
넵~ ^^ 댓글 감사합니다~ 화이팅입니다~
너무너무 도움이 되요!!! 친절한 설명 정말 감사드립니다~~
우주인님, 댓글 감사드립니다~ ^^
감사합니다 ^^
안녕하세요^^
이 사이트덕분에 opengl을 조금이나마 알게되서 행복한 학생입니다!
지금 처음강의부터 차례차례 왔는데요!
혹시 color를 입힐때 윤곽선에도 색을 줄 수 있는 방법이 있나요?ㅜㅜ
너무 초보적인 질문이지만 답변부탁드립니다!ㅜㅜ
할수록 재미있네요…^^ 응용하기도 쉽게 해주시고..