Scientia Conditorium

[OpenGL 005] Keyboard Callback 배경 색상 바꾸기 본문

프로그래밍/컴퓨터 그래픽스

[OpenGL 005] Keyboard Callback 배경 색상 바꾸기

크썸 2024. 12. 22. 17:02

이전글 : https://molonlabe.tistory.com/122

 

[OpenGL 004] Keyboard Callback 등록

이전글 : [OpenGL003] Refresh Callback 함수 등록 [OpenGL003] Refresh Callback 함수 등록이전글 : [OpenGL002] glew 설치 및 에러 수정 [OpenGL002] glew 설치 및 에러 수정이전 글 : [OpenGL001] Visual Studio 2022 with OpenGL,GLFW (

molonlabe.tistory.com


Keyboard Callback 으로 배경 색상 바꾸기

이전 포스팅에 이어 키보드 입력을 받아 화면 색상을 바꾸는 법을 알아보겠습니다. 각 객체들의 색상을 바꿀수도 있지만 가장 간단하게 배경 화면의 색상을 바꿔보겠습니다. OpenGL에서 색상 변화는 0.0에서 1.0까지 입니다. 따라서 색상값을 입력할 때에는 0.0 이상 1.0 이하의 값을 입력해야 합니다. 물론 범위 밖의 값을 입력하더라도 내부적으로 알아서 걸러주긴 합니다. OpenGL 문서의 glClearColor 함수를 살펴보면 전달된 값은 내부적으로 0.0 ~ 1.0 범위로 클램핑 처리한다고 되어있습니다. 즉, 1.0 초과된 값을 입력하면 내부에서 1.0으로 처리한다는 의미입니다.

 

키보드 콜백 함수 등록은 이전 포스팅에서 했기 때문에 이번에는 키보드 콜백 함수 내부만 수정하도록 하겠습니다.

 

GLFW keyboard callback 배경 색상 바꾸기 예시 코드

void Renderer::keyFunc(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	switch (key)
	{
	case GLFW_KEY_ESCAPE:
	{
		if (action == GLFW_PRESS)
		{
			glfwSetWindowShouldClose(window, GL_TRUE);
		}
		break;
	}
	case GLFW_KEY_1: 
	{
		mColor[0] += 0.01f;
		if (mColor[0] > 1.0f)
		{
			mColor[0] = 0.0f;
		}
		glClearColor(mColor[0], mColor[1], mColor[2], mColor[3]);
		break;
	}
	case GLFW_KEY_2:
	{
		mColor[1] += 0.01f;
		if (mColor[1] > 1.0f)
		{
			mColor[1] = 0.0f;
		}
		glClearColor(mColor[0], mColor[1], mColor[2], mColor[3]);
		break;
	}
	case GLFW_KEY_3:
	{
		mColor[2] += 0.01f;
		if (mColor[2] > 1.0f)
		{
			mColor[2] = 0.0f;
		}
		glClearColor(mColor[0], mColor[1], mColor[2], mColor[3]);
		break;
	}
	default:
	{
		break;
	}
	}
}

 

먼저 mColor 이라는 float 배열 4개짜리 멤버 변수를 추가하였습니다. 각각의 순서대로 RGBA를 값을 가지도록 하였습니다. 다시말해 mColor[0] 값이 증가할수록 배경 색상의 Red 색상이 증가하게 될 것입니다. switch 문에서 GLFW_KEY_1,2,3 을 추가하여 각각 mColor 배열 0,1,2 인덱스 값들을 0.01씩 증가하는 코드를 작성하였습니다. 이제 프로그램이 시작되고 키보드에서 1,2,3을 누를때마다 배경색의 RGB 값 증가하게 됩니다. 다만 앞서 말했듯이 RGB 값들은 각각 0.0 ~ 1.0 사이의 값을 가지므로 1.0이 넘어가는 순간 계속 증가시켜도 의미가 없습니다. 따라서 이럴 경우 다시 0.0으로 되돌려 처음부터 증가하도록 작성하였습니다.

 

이처럼 키보드 입력을 받아 프로그램에서 어떠한 동작을 행하도록 할 수 있습니다. 

 

 

키보드 콜백 함수를 static으로 했을 때의 C++ 컴파일 오류

단순하게 멤버 변수를 float mColor[4] 로 했다면 컴파일 에러가 발생합니다. 키보드 콜백 함수를 static으로 설정했는데, 그 안에서 클래스 멤버 변수 값을 조정하려고 했기 때문입니다. C++에서 static 키워드의 의미는 '범위(scope)의 제한을 받는 전역 변수' 라고 생각해주시면 됩니다. 이 범위라는 건 파일, 네임스페이스, 클래스, 함수 등을 의미합니다. 위 키보드 배경 색상 수정하는 코드 일부를 보여드리자면 아래와 같습니다.

 

1. Renderer.h

#pragma once
#include <iostream>
#include "GL/glew.h"
#include "GLFW/glfw3.h"

class Renderer
{
public:
	Renderer();
	~Renderer();

	bool initialize();
	void run();

private:
	static void refreshFunc(GLFWwindow* window);
	static void keyFunc(GLFWwindow* window, int key, int scancode, int action, int mods);

	GLFWwindow* mWindow = nullptr;

	static float mColor[4];
};

 

2. Renderer.cpp

#include "Renderer.h"

float Renderer::mColor[4] = { 0.0f, 0.0f,0.0f, 1.0f }; // static 멤버 변수 초기화

... // 중간 함수들 생략

 

즉, 정적(static) 멤버 변수는 클래스당 하나의 copy만 존재합니다. 개체의 메모리 레이아웃의 일부가 아니라 클래스 메모리 레이아웃에 포함됩니다. 더 자세한 내용은 C++ 공식 문서나 다른 포스팅을 참조해주시길 바랍니다.