반응형

Visual Studio Community 2019에서 GLFW 라이브러리를 사용하여 OpenGL 개발을 시작하기 위해 필요한 설정 방법을 다룹니다. 

다른 Visual Studio 버전에서도 거의 동일하게 설정 가능합니다.




1. 프로젝트 생성

2. GLFW

3. GLEW

4. 프로젝트 설정

5. 테스트

6. OpenGL 버전 확인




본 포스팅을 따라 개발환경을 만든 후.. 다음 포스팅들도 검토해보세요.

 


Modern OpenGL 강좌 - GLFW와 GLEW 라이브러리 기본 사용방법
https://webnautes.tistory.com/1103 

Modern OpenGL 강좌 - 삼각형 그리기( 렌더링, Vertex Array Object, Vertex Buffer Object)
https://webnautes.tistory.com/1153 

Modern OpenGL 강좌 - 사각형 그리기(렌더링, Element Buffer Object)
https://webnautes.tistory.com/1106

Modern OpenGL 강좌 - 텍스처( texture ) 매핑하는 방법 ½
https://webnautes.tistory.com/1160 




2017. 1. 7   - 최초작성

2021. 9. 26 - Visual Studio 2019로 변경.  



1.  프로젝트 생성

1. 새 프로젝트 만들기를 클릭합니다. 

 

2. Windows 데스크톱 마법사를 선택하고 다음을 클릭합니다. 

 

 

프로젝트 이름을 적어주고 만들기를 클릭합니다. 

 

 

3. 애플리케이션 종류콘솔 애플리케이션이 선택된 상태에서 빈 프로젝트를 체크하고 확인을 클릭합니다.

 

 

4. 솔루션 탐색기소스 파일 항목에서  마우스 우클릭하면 보이는 메뉴에서 추가 > 새 항목을 선택합니다. 

 

 

5. C++ 파일(cpp)를 선택하고 이름 항목에 소스 코드 파일이름을 적어준후  추가 버튼을 클릭합니다.

 

 

소스 파일 항목에 cpp 파일이 추가되면서 해당 파일이 열립니다. 

 

 

6. 툴바의 솔루션 플랫폼을  x64로 변경합니다. 

 





이제부터 Visual Studio 2019에서 OpenGL 개발을 하기위해 필요한 라이브러리를 프로젝트에 추가하는 방법을 설명합니다. 

 

프로젝트 이름 OpenGL Project이고 프로젝트 위치  C:\Users\사용자이름\source\repos\OpenGL Project인 경우로 가정하고 설명합니다. 

 

사용하시는 환경에 맞추어 적절히 변경하시면 됩니다. 




2. GLFW

OpenGL은 실제 구현된 라이브러리가 아니라 API 스펙입니다. 

라이브러리 구현시 플랫폼 종속성을 배제하기 위해서 UI 및 OpenGL 컨텍스트(context) 등을 위한 API는 빠져있습니다.

그래서 보통 플랫폼별로 지원되는 방식을 사용하여 UI를 만들어 사용합니다.

 

본 포스팅에서는 플랫폼에 독립적인 코드를 작성하기 위해서 GLFW 라이브러리를 사용했습니다.

OpenGL 렌더링 결과를 보여주기 위해 필요한 윈도우(UI)와 OpenGL 컨텍스트 생성 그리고 사용자와 상호 작용을 위해 필요한 키보드/마우스 입력, 이벤트 다루기 등을 위해 사용됩니다.

대부분의 플랫폼에서 똑같은 코드로 동작시키기 위해서 사용하지만  실제로는 일부 수정이 필요하기도 합니다. 

 

GLFW 외에도 선택가능한 플랫폼 독립적인 라이브러리로는 SFML, SDL,  freeglut 등이 있습니다.

장단점이 각각 있기 때문에 어느것이 가장 좋다고는 말하기 힘듭니다. 



GLFW는 아래 링크에서 다운로드 가능합니다. 

http://www.glfw.org/download.html




64비트 윈도우에서 Visual Studio를 사용할 경우를 위해 미리 컴파일된 64-bit Windows binaries를 다운로드 받습니다.

Visual Studio 2010 ~ 2019를 지원하고 있지만 보통 Visual Studio 상위 버전을 사용하더라도 문제 없이 동작하더군요.  

 




압축을 풀은 후, include 폴더를 복사(Ctrl+C)하여 

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 붙여넣기(Ctrl+V)해줍니다.

 




압축을 풀은 폴더에서 lib-vc2019 폴더를 복사하여

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project붙여넣기해주고 폴더 이름 lib로 수정합니다. 

 




lib 폴더안에 glfw3.dll 파일이 포함되어 있습니다. 

GLFW 라이브러리를 사용하여 컴파일한 실행 파일과 같이 배포해야 하는 파일입니다. 

컴파일 중에는 프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 두어도 됩니다. 

 




3. GLEW(OpenGL Extension Wrangler)

OpenGL 3.x 이상에서는 호출 가능한 OpenGL API 함수들이 런타임에 결정됩니다. 

GLEW를 사용하여 런타임에 OpenGL API 함수를 호출합니다.  

 

아래 링크에서 GLEW를 다운로드 받을 수  있습니다.

http://glew.sourceforge.net/ 




Windows 32-bit and 64-bit를 클릭하여 미리 라이브러리를  컴파일해둔 바이너리를 다운로드 받습니다.

 




압축을 풀은 후, include 폴더를 복사하여 

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project붙여넣기해줍니다. 

기존에 생성된 include 폴더에 추가로 복사되어 집니다. 

 





압축을 풀은 폴더의 경로 glew-2.1.0\lib\Release\x64에 있는  glew32.lib, glew32s.lib를 복사하여

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




프로젝트 폴더의 경로 OpenGL Project\OpenGL Project\lib에 붙여넣기 해줍니다. 

 




압축을 풀은 폴더의 경로 glew-2.1.0\bin\Release\x64에 있는  glew32.dll 파일을  복사합니다.

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




GLEW 라이브러리를 사용하여 컴파일한 실행 파일과 같이 배포해야 하는 파일입니다. 

컴파일 중에는 프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 두어도 됩니다.

 



4. 테스트

 

아래 코드를 프로젝트의 cpp 파일에 복사해서 테스트를 진행했습니다.

 

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

#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "lib/glew32.lib")
#pragma comment(lib, "lib/glfw3.lib")



void window_resized(GLFWwindow* window, int width, int height);

void key_pressed(GLFWwindow* window, int key, int scancode, int action, int mods);
void show_glfw_error(int error, const char* description);


int main()
{
	glfwSetErrorCallback(show_glfw_error);


	if (!glfwInit()) {
		std::cerr << "GLFW 초기화 실패" << '\n';
		exit(-1);
	}


	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);


	GLFWwindow* window = glfwCreateWindow(
		800, // width
		600, // height
		"OpenGL Example",

		NULL, NULL);
	if (!window)
	{
		std::cerr << "윈도우 생성 실패" << '\n';
		glfwTerminate();
		exit(-1);
	}


	glfwMakeContextCurrent(window);


	glfwSetWindowSizeCallback(window, window_resized);
	glfwSetKeyCallback(window, key_pressed);


	glfwSwapInterval(1);


	glewExperimental = GL_TRUE;
	GLenum err = glewInit();
	if (err != GLEW_OK) {
		std::cerr << "GLEW 초기화 실패 " << glewGetErrorString(err) << '\n';
		glfwTerminate();
		exit(-1);
	}


	std::cout << glGetString(GL_VERSION) << '\n';


	int nr_extensions = 0;
	glGetIntegerv(GL_NUM_EXTENSIONS, &nr_extensions);

	for (int i = 0; i < nr_extensions; ++i) {
		std::cout << glGetStringi(GL_EXTENSIONS, i) << '\n';
	}


	glClearColor(0, 0, 1, 1);


	while (!glfwWindowShouldClose(window)) {

		glClear(GL_COLOR_BUFFER_BIT);

		glfwSwapBuffers(window);

		glfwPollEvents();
	}


	glfwDestroyWindow(window);


	glfwTerminate();
	return 0;
}

void show_glfw_error(int error, const char* description) {
	std::cerr << "Error: " << description << '\n';
}

void window_resized(GLFWwindow* window, int width, int height) {
	std::cout << "Window resized, new window size: " << width << " x " << height << '\n';

	glClearColor(0, 0, 1, 1);
	glClear(GL_COLOR_BUFFER_BIT);
	glfwSwapBuffers(window);
}

void key_pressed(GLFWwindow* window, int key, int scancode, int action, int mods) {
	if (key == 'Q' && action == GLFW_PRESS) {
		glfwTerminate();
		exit(0);
	}
}

 

Ctrl + F5를 눌러서 컴파일 및 실행을 합니다. 문제 없으면 아래처럼 두 개의 창이 보여집니다.

명령 프롬프트 창에 사용중인 OpenGL 버전과 사용 가능한 OpenGL extension을 보여줍니다.

OpenGL를 위해 GLFW를 사용하여 생성한  창을 파란색으로 채워서 보여줍니다.

 




5. OpenGL 버전 확인

현재 윈도우에 설치된 그래픽 드라이버에서 지원하는 OpenGL 버전 확인을 위해 다음 링크를 읽어보세요.

 

Windows 환경에서 그래픽 드라이버가 지원하는 OpenGL 버전 확인하기

http://webnautes.tistory.com/1114



그래픽 드라이버에서 지원하는 OpenGL 버전이 중요한 이유는 최근에 나온 버전인 윈도우 10에도 OpenGL 1.1을 구현해놓은 라이브러리만 포함되어 있기 때문에 상위 OpenGL 버전에 대한 구현은 그래픽 드라이버에 포함되어 나오기 때문입니다. 

 

그래픽 드라이버를 만드는 CPU 또는 그래픽카드 제조사에서 상위 OpenGL 버전의 스펙을 구현하기 위해 opengl32.dll을 수정할 수 없는 상황이라서 extension 메커니즘을 사용하여 해결합니다.




제가 사용하는 노트북에서는 OpenGL 3.0 ~ 4.4 까지만 100 %지원합니다.

100% 라고 하는 의미는 해당 버전 OpenGL 스펙에 기술된 API를 그래픽 드라이버에서 모두 구현했다는 겁니다.  

 




반응형

진행해본 결과물을 기록 및 공유하는 공간입니다.
잘못된 부분이나 개선점을 알려주시면 반영하겠습니다.


소스코드 복사시 하단에 있는 앵커 광고의 왼쪽 위를 클릭하여 닫은 후 해야 합니다.


문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

TistoryWhaleSkin3.4">