2014-05-26 16 views
5

Các chức năng QOpenGL có vẻ thiếu các chức năng quan trọng như glInvalidateFramebuffer và glMapBuffer. Từ những gì tôi hiểu QOpenGLFunctions tải giao điểm của cả hai chức năng OpenGL máy tính để bàn và chức năng ES. Nếu đó là trường hợp, tại sao không phải là hai chức năng này? Từ những gì tôi có thể nói glMapBuffer là ở cả hai.Các chức năng QOpenGL thiếu các chức năng OpenGL quan trọng

Tôi có hiểu lầm về các chức năng QOpenGL, hoặc chúng thực sự thiếu chức năng (không)?

+0

có chức năng bị thiếu, không có 'glDrawArray' hoặc là –

+0

@ ratchetfreak Bạn có biết tại sao không? – Ben

+0

@Ben Vì 'glDrawArrays (...)' là một hàm OpenGL 1.1 và tất cả các nền tảng Qt được triển khai dựa trên hỗ trợ nó ngoài hộp. Lý do mà MapBuffer bị thiếu có lẽ vì nó là một phần mở rộng tùy chọn trong OpenGL ES. –

Trả lời

3

Có nhiều lý do cho những hai trường hợp và một trong những nhận xét:

1) Theo như tôi biết, the addition process was selective. Only those functions got added that you would need to resolve manually.

Trong trường hợp glDrawArrays đã nói ở trên, chức năng đó đã có sẵn một lúc, cả trong OpenGL trên máy tính để bàn cũng như ES, nơi Qt được hỗ trợ, do đó không cần phải giải quyết mọi thứ theo cách thủ công.

Bạn chỉ có thể sử dụng chúng ngay lập tức theo cách thông thường, bao gồm gl.h và tất cả điều đó.

2) Hiện tại, Qt does not support OpenGL ES 3 thông qua giao diện này. Các chức năng nói trên của bạn, glMapBufferglInvalidateFramebuffer có khả năng nằm trong danh mục này. Chúng không có sẵn trong OpenGL ES 2 "theo mặc định".

Nếu có bất kỳ chức năng nào không được hiển thị và không được đề cập trong các lý do đã nêu trên, có thể đó là một sự bỏ qua.

+0

Bạn có nghĩa là bằng cách bao gồm gl.h? Tuy nhiên, những chức năng này không có sẵn trong các cửa sổ. – Ben

+0

Tôi vẫn còn bối rối. Các tiêu đề mở đầu được cung cấp trên một số hệ thống không bao gồm các chức năng tôi đã đề cập trong câu hỏi của tôi. Làm thế nào để bạn có được những? – Ben

+0

Ah, tôi không nhận ra rằng họ không có mặt ở ES 2. Cảm ơn. – Ben

6

QOpenGLFunctions chỉ hiển thị tập con chung của OpenGL 2 (+ FBO) và OpenGL ES 2. Đó là lý do tại sao chức năng của bạn không có ở đó. glMapBuffer là trong OpenGL 2 nhưng không phải trong ES 2 (nhưng có một phần mở rộng OES); glInvalidateFramebuffer nằm trong OpenGL 4.3.


Nếu bạn cần bất kỳ chức năng khác nhau từ những người của tập hợp con chung bạn có thể:

  • Bắt đầu với Qt 5.6, sử dụng QOpenGLExtraFunctions, nhằm mục đích tại OpenGL ES 3.0/3.1 API (và chức năng tương đương thô trên OpenGL trên máy tính để bàn). Như vậy, nó có cả glMapBufferglInvalidateFramebuffer.

  • quyết tâm tự mình qua QOpenGLContext::getProcAddress

  • sử dụng QOpenGLContext::versionFunctions<T>() để có được một đối tượng hàm chứa tất cả các chức năng cho một phiên bản OpenGL nhất định, ví dụ

    auto functions = context->versionFunctions<QOpenGLFunctions_4_3_Core>(); 
    if (!functions) error(); 
    functions->initializeOpenGLFunctions(); 
    functions->glInvalidateFramebuffer(...); 
    
  • #include <QOpenGLExtensions> và sử dụng lớp học bao gồm các phần mở rộng bạn cần, ví dụ:

    auto functions = new QOpenGLExtension_ARB_invalidate_subdata; 
    if (!functions->initializeOpenGLFunctions()) error(); 
    functions->glInvalidateFramebuffer(...) 
    
  • quấn một sự kết hợp của các bên trên trong một lớp học mà sẽ sử dụng các cuộc gọi giải quyết được đưa ra một phiên bản GL phù hợp, hoặc rơi trở lại để mở rộng, hoặc không (ví dụ .: QOpenGLTexture).

Đối với glMapBuffer, nó thực sự được hiển thị bằng cách nào đó được bao bọc bởi QOpenGLBuffer.

+0

Rực rỡ! Tôi thấy OpenGL trong Qt5 là khó hiểu nhất, điều này chắc chắn đã giúp tôi. Nhưng một Q lớn vẫn tồn tại, trong codebase hiện tại của tôi, tôi có rất nhiều mã opengl mà tôi đang cố gắng đưa vào ứng dụng Qt5 của mình. Có cách nào để sử dụng QOpenGLContext :: versionFunctions () phương pháp để có được các đối tượng chức năng chính xác mà không cần phải tiền tố mỗi và mọi cuộc gọi opengl với chức năng->? –

+0

Khi bạn nói "chức năng chính xác", bạn đang đề cập đến một phiên bản GL cụ thể? – peppe

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