C++ GLUT 를 사용해서 기본 OpenGL 그래픽 프로젝트 만들기 - Whitmem
C++ GLUT 를 사용해서 기본 OpenGL 그래픽 프로젝트 만들기
그래픽 개발
2025-06-29 13:13 게시 cda3a9e4792d16fdc6bf

0
0
4
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
C++ 에서 GL 프로젝트를 만들어 화면 출력을 하기 위해서는 GLUT 관련 도구가 필수이다. GL 자체는 사실상 그래픽스 렌더링을 위해 제공되는 것이고, 화면을 생성하여 띄우고 각종 UI 작업을 하기 위해서는 UT가 별도로 필요하다. 즉 GLUT 는 이러한 화면 띄우는 작업 Win32 작업을 포함해 기본적인 파이프라인을 지정해주는 셈이다.
그러나 glut 스타일을 보면 ... 객체 지향적이지는 않은 것 같다. 따라서 요즘은 GLFW 를 애용하는 것으로 보인다...
아무튼 이 게시글에서는 GLUT를 사용해서 기본 화면을 띄우고 프로젝트를 구현하는 방법에 대해서 알아본다.
우선 기본적으로 FreeGLUT를 사용하기 위해서는 아래 위치에서 코드를 내려받아 빌드해야한다.
https://freeglut.sourceforge.net/index.php#download
그러나 필자는 귀찮은 관계로 누군가 MSVC 로 빌드해둔 FreeGLUT 프로젝트를 사용하기로 하였다.
구글에... freeglut msvc package 이런식으로 검색하면 누군가 빌드해둔 파일이 존재한다.
https://www.transmissionzero.co.uk/software/freeglut-devel/
필자는 위 파일이 C: 내 GLUT 디렉터리에 존재하게끔 위치시켰다.
그리고 포함 디렉터리는 C:/GLUT/include 를 포함하고, 라이브러리 디렉터리는 C:/GLUT/lib/x64 또는 C:/GLUT/lib 를 등록한다. 현재 프로젝트가 32비트 프로젝트인 경우 C:/GLUT/lib 경로만 등록하면 되고, 64비트 프로젝트인 경우 C:/GLUT/lib/x64 를 등록한다. 대부분 일반 PC의 기본 프로젝트는 x64 프로젝트이므로 필자는 x64 를 등록하였다.
그리고 GLUT의 bin 디렉터리 안에도 보면 freeGLUT.dll 와 x64 또는 freeGLUT.dll가 존재하는데, 이것도 현재 프로젝트의 비트수에 맞는 파일을 복사하여 프로젝트의 디버깅 폴더에 붙여넣는다.
아직 프로젝트를 컴파일하지 않았으면 디버깅 폴더가 존재하지 않을 수 있다. 이는 한 번 컴파일 및 실행하여 Debug/x64 등 내에 존재하는 exe 프로그램에 존재하는 공간에 같이 위치하도록 복사해주면 된다.
그리고 기본 클래스를 생성한다. 필자는 Start.cpp 와 Start.h 를 생성하였다. 메인 코드 영역에 진입점을 만들어준다.
#include "Start.h" #include <iostream> #include <GL/glut.h> #include <GL/GL.h> using namespace std; int main(int argc, char ** argv) { std::cout << "OK" << endl; }
이 때 GL 관련 헤더를 인클루드하는데, GL/GL.h는 단순 GL 화면 렌더링에 관련된 함수가 집합되어 있는 헤더이고, GL/glut.h 는 비로소 화면을 띄우고 기본적인 UI 파이프라인을 처리하는 함수들이 모여있는 헤더이다. 둘 다 인클루드하고 실행하여 디버깅이 되는지 확인한다. 참고로 glut.h 를 먼저 include 하고 GL.h 를 include해야 내부 컴파일 오류가 발생하지 않는다. 아무래도 순서에 영향을 끼치는 부분이 존재하는 듯 싶다.
이렇게 해서 Debug 디렉터리가 생기고 안에 exe 응용 프로그램이 생기면 해당 위치에 freeglut.dll 을 복사해 붙여넣어준다.
이제 진입점에 기본적인 GLUT 초기화 함수들을 넣어주면 되는데,
glutInit(&argc, argv); glutInitWindowSize(500, 500); glutInitWindowPosition(500, 500); glutCreateWindow("Window Name"); glutMainLoop();
glutInit 은 단순히 main 진입점에서 넘어온 파라메터 개수 정보와 파라메터 char ** 정보를 넘겨주면된다. 그리고 윈도우 사이즈를 초기화하는 부분, 포지션을 초기화하는 부분 함수를 사용하고, 윈도우를 생성해주면 된다.
마지막으로 glutMainLoop(); 를 통해 어플리케이션 메시지의 반복 처리 부분에서 파이프를 수행하도록 한다.
OK freeglut (C:\Users\WhitmemHome\source\repos\GLTest\x64\Debug\GLTest.exe): ERROR: No display callback registered for window 1
그리고 디버깅해보면 위와 같이 오류가 발생하는 것을 볼 수 있는데, 현재 기본적인 화면 설정만하고 실제 출력되는 렌더링 코드를 작성하지 않았기 때문이다. 디스플레이 되는 콜백 함수를 생성하고 해당 콜백 함수 안에서 GL 의 기본적인 화면 초기화 코드들을 작성해주면 된다.
void display() { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); }
이제 GLUT 가 아닌 GL 코드들을 사용해서 기본적인 화면 초기화 함수를 호출한다. glClearColor 그리고 glClear를 통해 화면을 빈 화면으로 초기화하고, glFlush();를 통해 화면 버퍼를 반영한다. 그리고 glutMainLoop()를 호출하기 전에 glutDisplayFunc(&display); 를 호출한다.
glutDisplayFunc(&display);
GLUT 시스템에 display() 함수를 매 렌더링 시점마다 호출하도록 콜백 함수를 등록하는 과정이다. 최종 코드는 아래와 같다.
#include "Start.h" #include <iostream> #include <GL/glut.h> #include <GL/GL.h> using namespace std; void display(); int main(int argc, char ** argv) { std::cout << "OK" << endl; glutInit(&argc, argv); glutInitWindowSize(500, 500); glutInitWindowPosition(500, 500); glutCreateWindow("Window Name"); glutDisplayFunc(&display); glutMainLoop(); } void display() { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); }
흰색 빈 화면이 제대로 출력되는 것을 확인할 수 있다. glClearColor의 인자 값 (1.0, 1.0, 1.0, 1.0)은 각각 RGBA 값으로 색상을 의미한다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.