[OpenGL] 1. 키보드 명령으로 배경색 변경하기

WIGWAG·2023년 3월 14일
0

OpenGL

목록 보기
2/10
post-custom-banner
  • 화면에 800 x 600 크기의 윈도우를 (0, 0) 위치에 띄운다.
    • 초기 배경색은 흰색

  • 윈도우를 띄우고 배경색을 키보드 입력에 따라 다양하게 적용 해 보기
    • 키보드 입력 값:
      • R: 빨간색
      • G: 초록색
      • B: 파란색
      • A: 렌덤색
      • W: 백색
      • K: 검정색
      • T: 타이머를 설정하여 특정 시간마다 렌덤색으로 계속 바뀌게 한다.
      • S: 타이머 종료
      • Q: 프로그램 종료

화면에 800 x 600 크기의 윈도우를 (0, 0) 위치에 띄운다.

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();																			// 이벤트 처리 시작
}
profile
윅왁의 프로그래밍 개발노트
post-custom-banner

0개의 댓글