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.

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:
- 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
- Copy các file thư viện liên kết động (*.dll) vào thư mục chứa file thực thi
- 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

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.

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

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.dll và glfw3.dll vào cùng với nơi mà file thực thi được biên dịch.

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)