Graphics/OpenGL

OpenGL 기초 - 색상변경

MOLOKINI 2014. 5. 16. 16:39
색상변경
 
void glClearColor (GLClampf red, GLClampf green, GLClampf blue, GLClampf alpha);
이것이 무엇인지 감이 오십니까?
배경색 정의 함수입니다
  - 타입명이 clamp가 들어가면 0~1사이의 값만이 들어갈 수 있음
  - 알파값은 투명도
  - 기본은 아무것도 지정하지 않기 때문에 까만색
 
각 인자의 강도는 0~1사이의 실수값, 0이면 하나도 없고, 1이면 최대밝기입니다.
그래서 (1,1,1,1)은 하얀색, (0,0,0,0)은 까만색 입니다.
 
그런데 요 함수는 배경으로 사용할 색상을 지정하기만 할 뿐, 실제 배경을 지우진 않습니다.
그래서 실제 배경을 쓸때는

 
void glColor(GLbitfield mask);
요고를 사용합니다.
인수로 어떤 버퍼를 지울것인지 결정합니다.
or 연산자를 이용해서 여러개의 버퍼를 동시에 지울수도 있습니다.
 
버퍼                                        설명
GL_COLOR_BUFFER_BIT           색상버퍼를 지운다.
GL_DEPTH_BUFFER_BIT            깊이버퍼를 지운다.
GL_STENCIL_BUFFER_BIT         스텐실버퍼를 지운다.
GL_ACCUM_BUFFER_BIT           누적 버퍼를 지운다.
 
그래픽 정보들은 여러 버퍼에 나누어서 저장됩니다.
색상버퍼는 이미지의 색상값이 저장되는 버퍼이며, 여기에 있는 정보들이 모니터에 출력됩니다.
그럼 한번 만지작거려 볼까요?
 
#include <gl/glut.h>
 
void DoDisplay()
{
glClearColor(1, 0, 0, 0);                      // 추가된부분 r이 1이라서 빨간색
glClear(GL_COLOR_BUFFER_BIT);      // 색상버퍼 지워주긔^^
 
glBegin(GL_TRIANGLES);
glVertex2f(0.0, 0.5);
glVertex2f(-0.5, -0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
 
void main()
{
glutCreateWindow("OpenGL");
glutDisplayFunc(DoDisplay);
glutMainLoop();
}

 

 


 

배경색상은 한번 지정해두면 다른 값으로 바꾸지 않는 이상 계속 지속됩니다.

그래서 효율적인 코딩을 하기 위해서는 

 

 

 

#include <gl/glut.h>

 

void DoDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

 

glBegin(GL_TRIANGLES);

glVertex2f(0.0, 0.5);

glVertex2f(-0.5, -0.5);

glVertex2f(0.5, -0.5);

glEnd();

glFlush();

}

 

void initBackColor()                     // 메서드형태로 변신!{glClearColor(1, 0, 0, 0);}

 

void main()

{

glutCreateWindow("OpenGL");

glutDisplayFunc(DoDisplay);

initBackColor();

glutMainLoop();

}

 

이러한 형태가 바람직합니다.

메인루프는 프로그램이 종료될때까지 돌기 때문에, 한번만 지정해줘도 되는 배경색을 루프돌면서 계속 지정해 줄 필요가 없기 때문입니다.

 

 

이번에는 삼각형의 색을 바꿔보는 마술을 보여드리겠습니다.

 

 

#include <gl/glut.h>

 

void DoDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

 

glColor3f(1,0,0);      

           

// 삼각형을 그리기 전에 색상을 빨간색으로!

glBegin(GL_TRIANGLES);

glVertex2f(0.0, 0.5);

glVertex2f(-0.5, -0.5);

glVertex2f(0.5, -0.5);

glEnd();

glFlush();

}

 

void initBackColor()

{

glClearColor(0, 0, 0, 0);      

 // 배경 검정색으로 변경

}

 

void main()

{

glutCreateWindow("OpenGL");

glutDisplayFunc(DoDisplay);

initBackColor();

glutMainLoop();

}

 

요렇게!