본문 바로가기

프로그래밍/OpenGL

[OpenGL] 오픈지엘 윈도우 창 띄우기

이번 시간에는 오픈지엘 라이브러리를 이용하여 간단하게 윈도우 창을 띄어보겠다.

 

 

01. 윈도우 창 만들기

 

윈도우 창을 띄우기 위해서는 윈도우 창을 생성해야 한다.

OpenGL에서는 The OpenGL Utility Toolkit (GLUT)을 사용하여 윈도우 창을 만든다.

 

#define WIDTH 800
#define HEIGHT 600

void main(int argc, char** argv)
{
	// 윈도우 생성
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutCreateWindow("Make Window");

	....
  
}

 

오픈지엘에서 윈도우를 생성하는 과정은 다음과 같다.

 

glut 윈도우 창 생성 과정

 

디스플레이 모드 종류는 다음과 같다.

 

GLUT_RGBA RGBA 모드 창
GLUT_RGB GLUT_RGBA 의 별칭
GLUT_INDEX 컬러 인덱스 모드 창
GLUT_SINGLE 단일 버퍼 창
GLUT_DOUBLE 이중 버퍼 창
GLUT_ACCUM 누적 버퍼가 있는 창
GLUT_ALPHA 색상 버퍼에 대한 알파 구성 요소가 있는 창
GLUT_DEPTH 깊이 버퍼가 있는 창
GLUT_STENCIL 스텐실 버퍼가 있는 창
GLUT_MULTISAMPLE 멀티샘플링을 지원하는 창
GLUT_STEREO 스테레오 창
GLUT_LUMINANCE '휘도' 색상 모델을 사용하여 창

 

glutInitDisplayMode()로 사용하는 대표적인 모드는 GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH가 있다.

 

 

 

02. 화면 렌더링 콜벡 함수 등록

 

윈도우 창을 생성했으니 윈도우 창의 띄어지는 동안 화면을 렌더링  해야한다.

 

GLvoid Render(GLvoid);

void main(int argc, char** argv)
{
	...

	glutDisplayFunc(Render);
	glutMainLoop();
}

 

화면을 렌더링하는 과정은 다음과 같다.

 

화면 렌더링 과정

 

 

glutDisplayFunc 함수는 콜벡 함수 중 디스플레이 콜벡 호출 함수로 디스플레이 상 변경이 있을 시 함수가 호출된다.

 

 

콜벡 함수가 호출되는 과정은 다음과 같다.

 

 

콜벡 함수 호출 과정

 

콜벡 함수는 glutDisplayFunc 함수 이외에 키보드 입력 콜벡 함수, 마우스 입력 콜벡 함수 등등 다양하다. 물론 게임을 만들기 위해서 입력 콜벡 함수를 필요하니 다음 시간에 콜벡 함수를 소개하는 시간을 가지겠다.

 

 

 

03. 화면 렌더링 콜벡 함수 정의

 

콜벡 함수를 등록 했으니 Render 함수를 정의 해야 한다.

 

GLvoid Render()
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glutSwapBuffers();
}

 

Render() 함수에서 동작하는 일은 다음과 같다.

 

Render 함수 정의

 

 

그래픽 파이프라인에 관해 공부하지 않으면 전면 버퍼와 후면 버퍼를 교체하는 것이 무슨 의미인지 모를 수 있을 것이다.

 

이중 버퍼링을 사용하는 이유

 

하나의 프레임 버퍼를 사용할 경우 화면 깜빡임 현상이 발생할 수 있어 그래픽 어댑터는 전면 버퍼와 후면 버퍼를 사용하여 2개의 버퍼의 Swap을 통해 이 문제를 해결한다.

 

 

 

04. 화면 렌더링

 

이제 오픈지엘을 이용하여 윈도우 창을 띄울 수 있다.

 

전체 코드는 다음과 같다.

 

#include <iostream>
#include <gl/glew.h> 
#include <gl/freeglut.h>
#include <gl/freeglut_ext.h>

#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "freeglut.lib")

#define _CRT_SECURE_NO_WARNINGS

#define WIDTH 800
#define HEIGHT 600

using namespace std;

GLvoid Render(GLvoid);

void main(int argc, char** argv)
{
	// 윈도우 생성
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutCreateWindow("Make Window");
    
	// 화면 렌더링
	glutDisplayFunc(Render);
	glutMainLoop();
}

GLvoid Render()
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glutSwapBuffers();
}

 

 

하얀 배경색과 Make Window 제목의 윈도우 창 생성!