Loạt OpenGL tutorials này mình viết ra cho những ai có hứng thú tìm hiểu, và sử dụng nó, chỉ đơn giản có vậy. Nếu bạn đã có một khái niệm nhất định về OpenGL sẵn, bạn nên bỏ qua chương này. Nếu không, hãy tìm tới trang này và đọc.
SOMA - một game kinh dị pha khoa học viễn tưởng, phát triển bởi Frictional Games, sử dụng OpenGL.
Đầu tiên mình sẽ giải thích ý nghĩa của “specification/standard”. Trong phạm vi công nghệ thông tin (và cả hiểu biết của mình), đây là một văn bản chỉ rõ các thành phần, cấu trúc và tổ chức của một công nghệ nhất định, nhằm tạo ra sự nhất quán trong việc phát triển và sử dụng công nghệ đó. Một ví dụ điển hình là C++. Sau khi Bjarne cho ra cuốn “The C++ Programming Language” lần thứ hai vào năm 1991, mọi thứ bắt đầu trở nên lộn xộn. Chương trình viết và biên dịch được trên compiler này không thể dịch được bằng compiler khác, đơn giản chỉ là vì compiler đó thiếu một số thư viện/chức năng sử dụng trong chương trình (vốn có sẵn trong compiler kia). Năm 1998, JTC1/SC22/WG21 phát hành bản C++ standard đầu tiên với tên C++ 98. Thực chất nó là một văn bản định nghĩa lõi, cấu trúc và các thành phần cơ bản nhất của C++, và compiler writers sẽ viết compiler theo chuẩn (standard) này, tạo ra sự nhất quán và linh động trong việc viết phần mềm. Sau đó, nhóm này đã lần lượt phát hành các standards cho C++, lần lượt: C++ 03, C++ TR1, C++ 11 (C++ 0x) và sắp tới là C++ 14.
OpenGL cũng không phải là ngoại lệ. Mình sẽ không đi sâu vào chi tiết: bản thân OpenGL không phải là một phần mềm, nó chỉ là một specification, và các nhà sản xuất card đồ họa (NVIDIA/AMD/Intel/..) sẽ phát triển API dựa trên specification này. OpenGL hiện được quản lý bởi Khronos Group (đồng tác giả OpenCL/OpenGL ES/WebGL/COLLADA và sắp tới là Vulkan, một revision lớn của OpenGL với nhiều thay đổi).
Tại sao là OpenGL mà không phải là Direct3D?
- OpenGL không bị giới hạn chỉ trong Windows và các sản phẩm tương tự của Microsoft (Xbox 360/One, Windows Phone).
- Tốc độ xử lý (có thể) ngang bằng Windows trên chính nền tảng của nó với drivers tốt. Làm mình nhớ tới bài viết 3 năm trước đây của Valve.
- Cross-platform. Linux, Mac. Một điều ngớ ngẩn mà hầu như ai cũng mắc phải đó là PS3/PS4 dùng OpenGL. Không. PSGL và GNM/GNMX không sử dụng OpenGL. Nói cách khác, OpenGL sẽ chạy trên bất cứ thứ gì đã được viết driver để hỗ trợ nó.
Những thứ còn lại đều do mỗi cá nhân. OpenGL không được sử dụng phổ biến trong games (Windows rất phổ biến với Direct3D). Có, nhưng không nhiều. Gần đây có dịp thử Grand Theft Auto V, mới biết game engine của họ không hỗ trợ OpenGL (DirectX 10/10.1/11). Tương tự với những series games lớn (hầu hết, trừ Valve, id Software, Frictional Games và một vài nhà phát triển nữa, xem ở đây), nhưng có chỗ đứng rất chắc trong các nhóm phần mềm về mô phỏng (simulation), dựng/xử lý hình ảnh (rendering/image processing/modelers) - Blender, Adobe After Effects, Photoshop, 3DS Max, Maya, AutoCAD; kiến trúc (architecture/visualisation) - Google Earth, Google Sketchup. Và đừng quên những bộ phim của Pixar đều được dựng trên OpenGL.
Ngoài ra, OpenGL có thể được gắn thêm các “plugins” (gọi là extensions). Các extensions này, nếu đủ phổ biến, sẽ được thêm vào specification của phiên bản OpenGL tiếp theo, còn không, người sử dụng vẫn có thể tiếp tục dùng chúng (tuy chỉ dưới dạng extensions và không chính thức). Ngược lại, với Direct3D, bạn chỉ có thể chờ đợi Microsoft thêm một (vài) năm cho một bản DirectX mới.
Một vài điểm phụ:
- Direct3D dễ sử dụng. Với bộ DirectX, bạn có trong tay renderer API (Direct3D), DirectInput, DirectCompute, DirectSound3D. Trong khi đó, OpenGL chỉ là một renderer API thuần. Các thứ như input, sound, network, physics, bạn có thể sử dụng các thư viện ngoài.
- Intel thường hỗ trợ OpenGL kém. NVIDIA và AMD hỗ trợ OpenGL trong drivers của họ bằng những cách khác nhau, nên sẽ có trường hợp một phần mềm viết bằng OpenGL chạy ổn định trên card NVIDIA nhưng lỗi và/hoặc chạy rất kém trên AMD. Đó là do sự không nhất quán trong việc viết API của họ, không phải vì OpenGL là một API tồi.
- Vấn đề không nằm ở chỗ bạn chọn API nào. Tất nhiên, hiện nay thì điều này đã trở nên đúng đắn hơn. Cách viết drivers để utilize API đó là một phần, cách viết phần mềm của programmers một phần, và tốc độ/hỗ trợ của card màn hình là một phần.
- OpenGL có một phân nhánh cho mobile, gọi là OpenGL ES (Embedded systems) - Android, iOS, BlackBerry, Symbian đều sử dụng OpenGL ES làm thư viện đồ họa chính, Direct3D có các phiên bản dành riêng cho Windows Embedded, Xbox, Windows CE.
Legacy OpenGL và Modern OpenGL
Hầu hết các tutorials trên mạng sẽ hướng dẫn bạn sử dụng legacy OpenGL, nghĩa là các phiên bản OpenGL 2.1 trở về trước. Đây là những bản OpenGL rất cũ và không còn được sử dụng nữa, lý do chúng rất chậm và khó viết, sử dụng extensions với mật độ dày đặc, cú pháp không nhất quán và chỉ sử dụng fixed function pipeline (OpenGL 1.5 trở xuống chỉ dùng fixed function) (sẽ nói về vấn đề này ở những chương sau).
Trong loạt tutorials này mình sẽ nhắm tới OpenGL 4.3, core profile, tương đương DirectX 11. Profiles trong OpenGL có hai loại: core và compatibility. Sử dụng compatibility profile nếu bạn muốn sử dụng (lại) các chức năng cũ, sử dụng fixed function pipeline, ngược lại, hãy dùng core profile.