2014-09-13 21 views
7

Tôi muốn đảm bảo rằng ứng dụng của tôi tuân thủ OpenGL 2.1. Tôi làm cách nào để kiểm tra điều này?Cách kiểm tra phiên bản OpenGL phù hợp?

Vì máy tính của tôi hỗ trợ GL4.4, ngay cả khi tôi sử dụng, ví dụ: glGenVertexArrays(), nó sẽ hoạt động thành công. Nhưng glGenVertexArrays() chỉ khả dụng với GL3 +.

Vì vậy, tôi muốn xác minh rằng ứng dụng của tôi chỉ sử dụng chức năng GL2.1. Một cách là chạy trên máy tính cũ của tôi chỉ hỗ trợ GL2.1, nhưng tôi đang tìm cách dễ dàng hơn.

Trả lời

1

Bạn có thể biên dịch trong môi trường chỉ có các biểu tượng OpenGL-2.1. Tùy thuộc vào trình bao bọc/trình mở rộng bạn sử dụng, điều này có thể dễ dàng hoặc khó khăn.

Ví dụ: nếu bạn sử dụng glloadgen OpenGL loader generator, bạn có thể tạo tệp tiêu đề và đơn vị biên dịch chỉ bao gồm chính xác các ký hiệu và mã thông báo OpenGL-2.1. Nếu bạn sau đó biên dịch dự án của bạn bằng cách sử dụng này, trình biên dịch sẽ lỗi ra trên bất cứ điều gì mà không được bảo hiểm.

0

Nếu bạn tìm thấy trình tải mở rộng hỗ trợ tạo tiêu đề phiên bản cụ thể, như được mô tả bởi @datenwolf, đó có thể là giải pháp dễ nhất của bạn. Có một tùy chọn khác mà bạn có thể thử nếu cần.

Các tiêu đề OpenGL chính thức mà bạn có thể tìm thấy tại https://www.opengl.org/registry chứa các định nghĩa được nhóm theo phiên bản và được đặt trong điều kiện tiền xử lý. Bố cục trông giống như sau:

... 
#ifndef GL_VERSION_2_1 
#define GL_VERSION_2_1 1 
// GL 2.1 definitions 
#endif 
#ifndef GL_VERSION_3_0 
#define GL_VERSION_3_0 1 
// GL 3.0 definitions 
#endif 
#ifndef GL_VERSION_3_1 
#define GL_VERSION_3_1 1 
// GL 3.1 definitions 
#endif 
... 

Bạn sẽ có thể bao gồm tiêu đề chính thức ít nhất là để kiểm tra phiên bản. Nếu bạn vô hiệu hóa các phiên bản bạn không muốn sử dụng bằng cách xác định biểu tượng tiền xử lý tương ứng, bạn sẽ nhận được các lỗi biên dịch nếu bạn đang cố gắng sử dụng các tính năng từ các phiên bản đó. Ví dụ: GL 2.1:

#define GL_VERSION_3_0 1 
#define GL_VERSION_3_1 1 
#define GL_VERSION_3_2 1 
#define GL_VERSION_3_3 1 
#define GL_VERSION_4_0 1 
#define GL_VERSION_4_1 1 
#define GL_VERSION_4_2 1 
#define GL_VERSION_4_3 1 
#define GL_VERSION_4_4 1 
#define GL_VERSION_4_5 1 
#include <GL/glext.h> 

// your code 
0

Hãy thử https://github.com/cginternals/glbinding. Đây là một thư viện OpenGL wrapper mà hỗ trợ chính xác những gì bạn yêu cầu:

Tính năng làm trung tâm Tiêu đề Thiết kế

API OpenGL được lặp đi lặp lại phát triển và phát hành các phiên bản, nội bộ (đối với đặc điểm kỹ thuật API) có tên tính năng. Tính năng/phiên bản OpenGL mới nhất của là 4.5. Phiên bản trước là 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 2.1, 3.0, 3.1, 3.2, 3.3, 4.0, 4.1, 4.2, 4.3 và 4.4. OpenGL sử dụng mô hình không dùng nữa để xóa các phần lỗi thời API của nó dẫn đến khả năng tương thích (với API không được chấp nhận) và sử dụng lõi (không sử dụng API) được thể hiện trong ngữ cảnh OpenGL nhắm mục tiêu . Trên hết, các khái niệm API mới được đề xuất là các tiện ích mở rộng (thường là nhà cung cấp cụ thể) có thể được tích hợp vào các phiên bản trong tương lai. Tất cả điều này dẫn đến nhiều biểu hiện cụ thể có thể có của của API OpenGL mà bạn có thể sử dụng trong chương trình của mình.

Một nhiệm vụ khó khăn là tuân thủ một bộ chức năng được đồng ý trong chương trình OpenGL 3.OpenGL của riêng bạn (ví dụ: OpenGL 3.2 Core nếu bạn muốn phát triển cho mỗi Windows, macOS và Linux được phát hành trong 4 năm qua).glbinding tạo điều kiện cho điều này bằng cách cung cấp tiêu đề cho mỗi tính năng bằng phương tiện tập hợp con được xác định/tạo ra của API OpenGL.

All-Tính năng OpenGL Headers

Nếu bạn không sử dụng tiêu đề cho mỗi tính năng chương trình OpenGL thể trông giống như này:

#include <glbinding/gl/gl.h> 

// draw code 
gl::glClear(gl::GL_COLOR_BUFFER_BIT | gl::GL_DEPTH_BUFFER_BIT); 
gl::glUniform1i(u_numcubes, m_numcubes); 
gl::glDrawElementsInstanced(gl::GL_TRIANGLES, 18, gl::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes); 

Độc tính năng trên OpenGL Headers

Khi phát triển mã của bạn trên Windows với các trình điều khiển mới nhất được cài đặt, mã ở trên có khả năng biên dịch và chạy. Nhưng nếu bạn muốn chuyển sang hệ thống có hỗ trợ trình điều khiển ít trưởng thành hơn (ví dụ: macOS hoặc Linux sử dụng trình điều khiển nguồn mở), bạn có thể tự hỏi nếu glDrawElementsInstanced khả dụng. Trong trường hợp này, chỉ cần chuyển sang tiêu đề cho mỗi tính năng của glbinding và chọn các tiêu đề cốt lõi OpenGL 3.2 (như bạn biết rằng tại nhất phiên bản này có sẵn trên tất cả các nền tảng mục tiêu):

#include <glbinding/gl32core/gl.h> 

// draw code 
gl32core::glClear(gl32core::GL_COLOR_BUFFER_BIT | gl32core::GL_DEPTH_BUFFER_BIT); 
gl32core::glUniform1i(u_numcubes, m_numcubes); 
gl32core::glDrawElementsInstanced(gl32core::GL_TRIANGLES, 18, gl32core::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes); 

Nếu mã biên dịch hơn bạn có thể chắc chắn nó là OpenGL 3.2 Core tuân thủ. Việc sử dụng các chức năng chưa có hoặc dựa trên chức năng không được chấp nhận sẽ bị ngăn chặn.

Các vấn đề liên quan