Search…

Khởi Tạo Môi Trường Lập Trình Đồ Họa OpenGL Trên Windows với GLEW và GLFW3

23/09/20207 min read
Hướng dẫn khởi tạo môi trường đồ họa với OpenGL, GLEW và GLFW3.

OpenGL (Open Graphics Library) là một trong những thư viện đồ họa phổ biến nhất trên thế giới, được giới thiệu lần đầu tiên vào năm 1991. OpenGL bao gồm một hệ thống các hàm API tương tác trực tiếp với phần cứng máy tính – mà chủ yếu ở đây là GPU. Nhờ sự hợp tác chặt chẽ với các nhà sản xuất phần cứng đồ họa nổi tiếng như: AMD, Nvidia … cùng với phần mềm: Microsoft, Apple, Google …, hiệu suất của OpenGL ngày càng được cải tiến. Kể từ phiên bản OpenGL 4.0 trở về sau, các kĩ thuật tiên tiến như tessellation, direct state access, flush control … được hỗ trợ đầy đủ.

OpenGL không những chạy được trên PC mà còn mở rộng sang di động minh chứng bằng việc có rất nhiều ứng dụng và trò chơi đặc sắc ở cả 2D và 3D trên các hệ điều hành như Android, iOS …

Việc khởi tạo các thư viện đồ họa OpenGL luôn là một vấn đề nan giải do sự khác biệt về hệ điều hành và phần cứng hỗ trợ. Bài viết này giới thiệu một giải pháp để khởi tạo thư viện đồ họa OpenGL trên Windows.

Tất cả code trong bài viết này sử dụng Visual Studio Community.

Yêu cầu hệ thống

Khi làm việc với OpenGL, phải chắc chắn phần cứng có hỗ trợ OpenGL và các extensions của chúng. Việc này được kiểm tra với công cụ OpenGL Extension Viewer.

ss_1
OpenGL được hỗ trợ đến bản 4.4

Ngoài ra, 2 thư viện sau cũng cần được chuẩn bị:

  • GLEW - OpenGL Extension Wrangler Library - version 1.11.0: thư viện hỗ trợ load các extension cần thiết của OpenGL.
  • GLFW - OpenGL Framework - version 3.0.4: thư viện hỗ trợ khởi tạo môi trường OpenGL, xử lý các sự kiện nhập / xuất.

Cả 2 thư viện này, ngoài mã nguồn cung cấp sẵn còn bao gồm nhiều tài liệu hướng dẫn đi kèm. Với GLFW, cần phải sử dụng CMake để có thể build source code thành thư viện tương ứng.

Khởi tạo môi trường OpenGL

Bắt đầu từ một project trống – Empty Project – trong Visual Studio; để khởi tạo mội trường lập trình OpenGL, thực hiện tuần tự các bước sau:

  1. Thêm các chỉ dẫn đến các file thư viện cần thiết trong quá trình biên dịch
  2. Copy các file thư viện liên kết động (*.dll) vào thư mục chứa file thực thi
  3. Viết mã khởi tạo môi trường lập trình OpenGL

Thêm các chỉ dẫn đến các file thư viện cần thiết trong quá trình biên dịch

OpenGL là một hệ thống thư viện bao gồm rất nhiều hàm API khác nhau để tương tác với hệ thống đồ họa bên dưới. Trong phạm vi của bài viết này thư viện được cung cấp bao gồm các thành phần sau:

  • Các file header (*.h)
  • Các file thư viện liên kết tĩnh (*.lib)
  • Các file thư viện liên kết động (*.dll)

Chính vì vậy, để có thể sử dụng được các thư viện này, việc đầu tiên cần khai báo với trình biên dịch chương trình sẽ sử dụng các hàm thư viên thêm ở bên ngoài là GLEW và GLFW.

Để thêm các file header và thư viện cần thiết ở quá trình biên dịch trong VS, cấu hình chính xác đường dẫn file header và file thư viện cần dùng.

Song song đó, VS cũng hỗ trợ cho việc thêm các thư viện vào trong project thông qua giao diện đồ hoạ như sau

Tại giao diện VS, mở hộp thoại Additional Include Directories bằng cách: Project Properties > C++ > General > Additional Include Directories và thêm vào đường dẫn tới folder chứa các header của 2 thư viện GLEW và GLFW

ss_2
Cấu hình include directory

Tương tự, mở hộp thoại Additional Library Directories để thêm đường dẫn tới folder chứa các thư viện bằng cách: Project Properties > Linker > General > Additional Library Directories.

ss_3
Cấu hình đường dẫn đến thư viện

Bước tiếp theo khai báo với VS trong lúc biên dịch sẽ sử dụng các thư viện hỗ trợ việc khởi tạo môi trường OpenGL – glew32.lib / glew32s.lib / glfw3dll.lib / OpenGL32.lib – như sau: Project properties > Linker > Input > Additional Dependencies

ss_4
Khai báo các thư viện được sử dụng

Tới đây, các chỉ dẫn đến các file thư viện cần thiết trong quá trình biên dịch đã hoàn tất.

Copy các file thư viện liên kết động (*.dll) vào thư mục chứa file thực thi

Copy 2 file: glew32.dllglfw3.dll vào cùng với nơi mà file thực thi được biên dịch.

ss_6

Tiến hành viết mã

Khai báo include các file header cần dùng::

#include "GL/glew.h"
#include "GLFW/glfw3.h"

Tiếp theo, gọi hàm khởi tạo cho thư viện GLFW – thư viện hỗ trợ tương tác với cửa sổ hệ thống và kiểm tra kết quả của quá trình khởi tạo.

/* Initialize GLFW Library */
if (!glfwInit())
	return -1;

Sau khi đã khởi tạo thư viện GLFW thành công, khai báo cho hệ thống phiên bản OpenGL được sử dụng. Ví dụ để sử dụng OpenGL 3.3 khai báo như sau:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

Tạo đối tượng GLFWwindow – quản lý cửa sổ chương trình và OpenGL context thông qua hàm glfwCreateWindow:

GLFWwindow* window;
window = glfwCreateWindow(640, 480, "STDIO - Hello OpenGL", NULL, NULL);
if (!window)
{
	glfwTerminate();
	return -1;
}

Tại thời điểm này, một cửa sổ được tích hợp OpenGL đã sẵn sàng làm việc. Việc cuối cùng là đảm bảo cửa sổ này luôn tồn tại trong lúc chương trình đang chạy:

/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{	

	/* Swap front and back buffers */
	glfwSwapBuffers(window);

	/* Poll for and process events */
	glfwPollEvents();
}

Sau khi kết thúc chương trình, giải phóng tài nguyên đã được cấp phát trước đó với hàm:

glfwTerminate();

Với môi trường OpenGL được khởi tạo, các API của OpenGL như glClearColor, glClearBufferBit … đều khả dụng.

Đoạn mã tổng hợp các vấn đề đã trình bày ở trên:

#include "GL/glew.h"
#include "GLFW/glfw3.h"

int main(void)
{
	/* Initialize GLFW Library */
	if (!glfwInit())
		return -1;

	/* We'll tell the system use OpenGL 3.3 */
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

	/* Create a windowed mode window and OpenGL context */
	GLFWwindow* window;
	window = glfwCreateWindow(640, 480, "STDIO - Hello OpenGL", NULL, NULL);
	if (!window)
	{
		glfwTerminate();
		return -1;
	}

	/* Make the window's context current */
	glfwMakeContextCurrent(window);

	/* Set clear color */
	glClearColor(1.0f, 0.73f, 0.2f, 1.0f);

	/* Loop until the user closes the window */
	while (!glfwWindowShouldClose(window))
	{
		/* Because we don't have any things to render, so we just clean the whole screen */
		glClear(GL_COLOR_BUFFER_BIT);

		/* Swap front and back buffers */
		glfwSwapBuffers(window);

		/* Poll for and process events */
		glfwPollEvents();
	}

	glfwTerminate();
	return 0;
}

Kết quả khi biên dịch và thực thi:

Toàn bộ source code cũng như các thư viện cần thiết được download tại: stdio_opengl_sample.zip.

Lời kết

Với nhu cầu ngày càng khắt khe của con người về tính nghệ thuật của đồ họa trên máy tính, phần mềm (các thư viện đồ họa) cùng với phần cứng (GPU) có những bước tiến mạnh mẽ - như khoảng cuối những năm 90 việc render vài trăm polygon là một vấn đề gây khó khăn cho các nhà phát triển, nhưng với hiện nay việc render vài triệu polygon chỉ là việc đơn giản. Cả 2 thư viện OpenGL và Direct3D đã làm rất tốt vai trò của mình trong việc làm cầu nối giữa phần cứng và phần mềm máy tính để giúp hiện thực những điều vĩ đại.

Tham khảo

  • http://en.wikipedia.org/wiki/OpenGL - OpenGL - Wikipedia (27/1/2015)
  • http://www.glfw.org/ - GLFW (27/1/2015)
  • http://glew.sourceforge.net/ - The OpenGL Extension Wrangler Library (27/1/2015)
  • http://www.realtech-vr.com/glview/download.php - GL View (27/1/2015)
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024