2013-07-08 43 views
5

Tôi đang viết chương trình phụ thuộc vào OpenGL 2.0 trở lên. Nhìn vào các thông số kỹ thuật của GL 2.0 tôi thấy rằng phần mở rộng được xác định trong ARB_shader_objects đã được quảng cáo mà tôi cho rằng có nghĩa là tiền tố ARB không cần thiết cho GL phiên bản 2.0 trở lên và bất kỳ hỗ trợ thực hiện nào> GL2.0 sẽ có điều này như một phần của việc triển khai lõi.Xác định GL_GLEXT_PROTOTYPES và nhận các con trỏ hàm

Có nói rằng khi tôi biên dịch chương trình gcc của tôi trên Linux, hãy cảnh báo: khai báo ngầm định hàm. Một cách để có được các hàm này là khai báo chúng trong chính chương trình và sau đó lấy các con trỏ hàm thông qua hàm GetProcAddress.

Cách khác là xác định GL_GLEXT_PROTOTYPES trước khi bao gồm glext.h làm giảm sự cố khi nhận các con trỏ hàm cho mỗi hàm theo mặc định hiện có trong GL2.0 hoặc cao hơn. Ai đó có thể vui lòng đề nghị nếu đó là một đề nghị và đúng cách? Dòng cơ sở là chương trình của tôi yêu cầu OpenGL 2.0 hoặc cao hơn và tôi không muốn hỗ trợ bất cứ điều gì ít hơn GL2.0.

Chỉ trong trường hợp ai đó gợi ý sử dụng glee hoặc glew, tôi không muốn sử dụng/có tùy chọn sử dụng thư viện glee hoặc glew để đạt được điều tương tự.

Trả lời

8

Có hai vấn đề ở đây.

GL_ARB_shader_objects thực sự được nâng lên lõi trong GL2.0, nhưng API đã được thay đổi chút ít cho phiên bản lõi, vì vậy nó không chỉ là tên hàm giống nhau mà không có tiền tố ARB, ví dụ: có glCreateShader() thay vì glCreateShaderObjectARB()hai chức năngglGetShaderInfoLog()glGetProgramInfoLog() thay thế glGetInfoLogARB() và một số khác biệt nhỏ khác của loại này.

Vấn đề thứ hai giả định rằng thư viện GL xuất tất cả các chức năng chính. Trên Linux thường là trường hợp (không chỉ cho các chức năng cốt lõi, mà về cơ bản cho mọi thứ), nhưng không có tiêu chuẩn đảm bảo điều đó. Số điện thoại OpenGL ABI for Linux chỉ yêu cầu:

3.4. Các thư viện phải xuất tất cả các điểm nhập OpenGL 1.2, GLU 1.3, GLX 1.3 và ARB_multitexture tĩnh.

proposals for an update nhưng gần đây tôi chưa nghe thấy gì về điều đó.

Windows chỉ xuất OpenGL 1.1 lõi, vì opengl32.dll là một phần của hệ điều hành và ICD nằm trong một dll riêng biệt. Bạn phải truy vấn các con trỏ hàm cho hầu như mọi thứ ở đó.

Vì vậy, cách di động chắc chắn nhất là truy vấn công cụ, bất kể bạn làm điều đó theo cách thủ công hay sử dụng một số thư viện như glew.

+0

IIRC Vista trở lên cải thiện tình hình * một chút * bằng cách xuất 1.4. – genpfault

+1

@genpfault: không, họ không có. Vista chỉ sử dụng D3D thay vì một rasterizer sw cho mặc định 1.1 renderer, nhưng nếu không, nó vẫn như cũ. GL1.1 chỉ đơn giản là một phần của API Win32 và chưa bao giờ được cập nhật. – derhass

+0

Điều gì về việc xác định GL_EXT_PROTOTYPES và sử dụng các chức năng mà không làm GetProcAddress cho tất cả chúng? Nó không được khuyến khích? Nếu không thì tại sao tất cả nó là một phần của tiêu đề glext? Hơn nữa đối với chức năng cốt lõi nếu người ta phải làm GetProcAddress mọi lúc, thì mục đích của việc họ được quảng cáo là chức năng cốt lõi là gì? – Divick

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