- 화면에 800 x 600 크기의 윈도우를 (0, 0) 위치에 띄운다.
- 초기 배경색은 흰색
- 윈도우를 띄우고 배경색을 키보드 입력에 따라 다양하게 적용 해 보기
- 키보드 입력 값:
- R: 빨간색
- G: 초록색
- B: 파란색
- A: 렌덤색
- W: 백색
- K: 검정색
- T: 타이머를 설정하여 특정 시간마다 렌덤색으로 계속 바뀌게 한다.
- S: 타이머 종료
- Q: 프로그램 종료
glutInitWindowPosition(0, 0); // 윈도우의 위치 지정
glutInitWindowSize(800, 600); // 윈도우의 크기 지정
glClearColor(r, g, b, 1.0f); // 바탕색을 설정
glClear(GL_COLOR_BUFFER_BIT); // 설정된 색으로 전체를 칠하기
빨간색은 (r,g,b) = {1,0,0}
초록색은 (r,g,b) = {0,1,0}
파란색은 (r,g,b) = {0,0,1}
흰색은 (r,g,b) = {1,1,1}
검정색은 (r,g,b) = {0,0,0}
glutTimerFunc() 함수로 타이머 설정
🎉완성코드
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <GL/freeglut_ext.h>
#include <glm/glm.hpp>
#include <glm/ext.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <iostream>
#include <random>
using namespace std;
random_device seeder;
const auto seed = seeder.entropy() ? seeder() : time(nullptr);
mt19937 eng(static_cast<mt19937::result_type>(seed));
uniform_real_distribution<double> dist(0.0f, 1.0f);
GLclampf r = 1.0f;
GLclampf g = 1.0f;
GLclampf b = 1.0f;
bool IsTimerAlive = true;
//--- 콜백 함수: 그리기 콜백 함수
GLvoid drawScene()
{
glClearColor(r, g, b, 1.0f); // 바탕색을 설정
glClear(GL_COLOR_BUFFER_BIT); // 설정된 색으로 전체를 칠하기
// 그리기 부분 구현
//--- 그리기 관련 부분이 여기에 포함된다.
glutSwapBuffers(); // 화면에 출력하기
}
//--- 콜백 함수: 다시 그리기 콜백 함수
GLvoid Reshape(int w, int h)
{
glViewport(0, 0, w, h);
}
void RandomRGB()
{
r = (GLclampf)dist(eng);
g = (GLclampf)dist(eng);
b = (GLclampf)dist(eng);
}
void TimerFunction(int value)
{
RandomRGB();
glutPostRedisplay(); // 화면 재 출력
if (IsTimerAlive)
glutTimerFunc(100, TimerFunction, 1); // 타이머함수 재 설정
}
GLvoid Keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'R': // 빨간색
r = 1.0f;
g = 0.0f;
b = 0.0f;
break;
case 'G': // 초록색
r = 0.0f;
g = 1.0f;
b = 0.0f;
break;
case 'B': // 파란색
r = 0.0f;
g = 0.0f;
b = 1.0f;
break;
case 'A': // 랜덤색
RandomRGB();
break;
case 'W': // 백색
r = 1.0f;
g = 1.0f;
b = 1.0f;
break;
case 'K': // 검정색
r = 0.0f;
g = 0.0f;
b = 0.0f;
break;
case 'T': // 타이머를 설정하여 특정 시간마다 렌덤색으로 계속 바뀌게 한다.
glutTimerFunc(100, TimerFunction, 1);
IsTimerAlive = true;
break;
case 'S': // 타이머 종료
IsTimerAlive = false;
break;
case 'Q': // 프로그램 종료
glutLeaveMainLoop();
break;
}
glutPostRedisplay(); //--- 배경색이 바뀔때마다 출력 콜백함수를 호출하여 화면을 refresh 한다
}
int main(int argc, char** argv)
{
//윈도우 생성
glutInit(&argc, argv); // glut 초기화
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // 디스플레이 모드 설정
glutInitWindowPosition(0, 0); // 윈도우의 위치 지정
glutInitWindowSize(800, 600); // 윈도우의 크기 지정
glutCreateWindow("Example1"); // 윈도우 생성(윈도우 이름)
//GLEW 초기화하기
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cerr << "Unable to initialize GLEW" << std::endl;
exit(EXIT_FAILURE);
}
else
std::cout << "GLEW Initialized\n";
glutDisplayFunc(drawScene); // 출력 함수의 지정
glutReshapeFunc(Reshape); // 다시 그리기 함수 지정
glutKeyboardFunc(Keyboard);
glutMainLoop(); // 이벤트 처리 시작
}