OpenGL

**OpenGL** (**Open Graphics Library**) là một API đa nền tảng, đa ngôn ngữ cho kết xuất đồ họa vector 2D và 3D. API thường được sử dụng để tương tác với bộ xử lý đồ họa (GPU), nhằm đạt được tốc độ kết xuất phần cứng.

Silicon Graphics, Inc. (SGI) Bắt đầu phát triển OpenGL năm 1991 và phát hành nó vào 30 tháng 6 năm 1992; Nó dùng trong các ứng dụng CAD, thực tế ảo, mô phỏng khoa học, mô phỏng thông tin, video game. Từ năm 2006, OpenGL được quản lý bởi consortium công nghệ phi lợi nhuận Khronos Group. Đối thủ chính của OpenGL là DirectX của Microsoft.

## Thiết kế

Đặc tả OpenGL mô tả một API trừu tượng để vẽ đồ họa 2D và 3D. Mặc dù API có thể được triển khai hoàn toàn trong phần mềm, nhưng nó được thiết kế để triển khai hầu hết hoặc hoàn toàn trong phần cứng.

API được định nghĩa là một tập hợp các hàm có thể được gọi bởi chương trình khách, cùng với một tập hợp các hằng số nguyên được đặt tên (ví dụ, hằng số GL_TEXTURE_2D, tương ứng với số thập phân 3553). Mặc dù các định nghĩa hàm bề ngoài tương tự như các định nghĩa của ngôn ngữ lập trình C, chúng không phụ thuộc vào ngôn ngữ. Vì vậy, OpenGL có nhiều language bindings, một số liên kết đáng chú ý nhất là WebGL ràng buộc JavaScript (API, dựa trên OpenGL ES 2.0, cho kết xuất 3D từ trong trình duyệt web); C binding WGL, GLX và CGL;  C binding cung cấp bởi iOS; và Java, C bindings cung cấp bởi Android.

Ngoài việc không phụ thuộc vào ngôn ngữ, OpenGL cũng đa nền tảng. Đặc tả kỹ thuật không nói gì về chủ đề lấy và quản lý ngữ cảnh OpenGL, để lại điều này như một chi tiết của windowing system. Vì lý do tương tự, OpenGL hoàn toàn quan tâm đến việc hiển thị, không cung cấp API nào liên quan đến đầu vào, âm thanh hoặc windowing.

### Phát triển
OpenGL là một API hiện đang được phát triển. Các phiên bản mới của thông số kỹ thuật OpenGL được Khronos Group phát hành thường xuyên, mỗi phiên bản đều mở rộng API để hỗ trợ nhiều tính năng mới khác nhau. Chi tiết của mỗi phiên bản được quyết định bởi sự đồng thuận giữa các thành viên của Nhóm, bao gồm các nhà sản xuất card đồ họa, nhà thiết kế hệ điều hành và các công ty công nghệ nói chung như Mozilla và Google.

Ngoài các tính năng được yêu cầu bởi API lõi, các nhà cung cấp bộ xử lý đồ họa (GPU) có thể cung cấp thêm chức năng ở dạng tiện ích mở rộng. Các tiện ích mở rộng có thể giới thiệu các chức năng mới và hằng số mới, đồng thời có thể nới lỏng hoặc loại bỏ các hạn chế đối với các chức năng OpenGL hiện có. Các nhà cung cấp có thể sử dụng tiện ích mở rộng để hiển thị các API tùy chỉnh mà không cần sự hỗ trợ từ các nhà cung cấp khác hoặc toàn bộ Nhóm Khronos, điều này làm tăng đáng kể tính linh hoạt của OpenGL. Tất cả các tiện ích mở rộng được thu thập và được xác định bởi OpenGL Registry.

Mỗi tiện ích mở rộng được liên kết với một số nhận dạng ngắn, dựa trên tên của công ty đã phát triển nó. Ví dụ: định danh của Nvidia là NV, là một phần của tên mở rộng GL_NV_half_float, hằng số GL_HALF_FLOAT_NV và hàm glVertex2hNV. Nếu nhiều nhà cung cấp đồng ý triển khai cùng một chức năng bằng cách sử dụng cùng một API, thì một tiện ích mở rộng dùng chung có thể được phát hành, sử dụng số nhận dạng EXT. Trong những trường hợp như vậy, cũng có thể xảy ra trường hợp Ban Đánh giá Kiến trúc của Khronos Group chấp thuận rõ ràng cho phần mở rộng, trong trường hợp đó ARB định danh được sử dụng.

Các tính năng được giới thiệu bởi mỗi phiên bản OpenGL mới thường được hình thành từ các tính năng kết hợp của một số tiện ích mở rộng được triển khai rộng rãi, đặc biệt là các tiện ích mở rộng thuộc loại ARB hoặc EXT.

OpenGL được thiết kế nhằm thỏa mãn mục đích chính sau:
* Che giấu sự tương tác phức tạp với các bộ máy xúc tiến 3 chiều bằng cách đưa ra một giao diện lập trình thống nhất.
* Che giấu các sự khác biệt giữa các phần cứng 3 chiều bằng cách bắt buộc các phần cứng tương thích OpenGL phải hỗ trợ tất cả các chức năng của giao diện OpenGL. Nếu cần, các chức năng chưa được hỗ trợ đầy đủ bởi phần cứng có thể được hỗ trợ bằng phần mềm.

Các thao tác OpenGL cơ bản là nhận các nguyên hàm hình học như điểm, đường thẳng và đa giác rồi chuyển thành các điểm đồ họa (*pixel*) trên màn hình. Điều này được thực hiện bởi luồng ống dẫn đồ họa (*graphics pipeline*). Nó còn được gọi là bộ máy trạng thái OpenGL. Đa số các lệnh OpenGL được dùng để tạo ra các hình học cơ bản đã gặp ở trên hoặc là quy định cách chuyển đổi hình học trong bộ máy trạng thái OpenGL.

Trước khi OpenGL 2.0 ra đời, mỗi giai đoạn trong luồng ống dẫn đồ họa thi hành một nhiệm vụ nhất định, khó có thể thay đổi được. Từ phiên bản OpenGL 2.0, một số giai đoạn đó có thể sửa đổi bằng cách dùng ngôn ngữ chuyển màu GLSL.
## Hình ảnh


Image:JOGL Refrection Demo Screenshot.png|Khúc xạ dùng OpenGL
Image:Perl OpenGL fob2.jpg|Kết cấu di động dùng OpenGL
Image:Synth_video_game_screenshot_C.png|Trò chơi dùng OpenGL



## Xem thêm
* GLSL - Ngôn ngữ chuyển màu OpenGL
* Cg - Ngôn ngữ chuyển màu của hãng nVidia dùng cho OpenGL
* Java OpenGL - OpenGL cho Java
* OpenGL ES - OpenGL for embedded systems
* OpenAL - Thư viện âm thanh tự do thiết kế với mục địch dùng chung với OpenGL.
* OpenSL ES - Một thư viện âm thanh khác
* Graphics pipeline
* GLUT - Thư viện công cụ cho OpenGL
* GLU - Thư viện hàm cho các ứng dụng OpenGL
* Assimp - Thư viện nhập dữ liệu từ các tập tin đồ họa 3D
* Mesa 3D - Một thư viện thực thi OpenGL mã nguồn mở
* Direct3D - Thư viện đồ họa của Microsoft
* Light Weight Java Game Library
* VirtualGL
* Vulkan - API đồ hoạ đa nền tảng

## Tham khảo

## Liên kết ngoài

* Trang chính OpenGL