https://freeglut.sourceforge.net/index.php#download
그러나 필자는 귀찮은 관계로 누군가 MSVC 로 빌드해둔 FreeGLUT 프로젝트를 사용하기로 하였다.
구글에... freeglut msvc package 이런식으로 검색하면 누군가 빌드해둔 파일이 존재한다.
https://www.transmissionzero.co.uk/software/freeglut-devel/
#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();
}