2014-05-26 32 views
5

W QOpenGLFunctions brakuje ważnych funkcji, takich jak glInvalidateFramebuffer i glMapBuffer. Z tego co rozumiem QOpenGLFunctions ładuje przecięcie zarówno funkcji OpenGL na pulpicie, jak i funkcji ES. Jeśli tak, to dlaczego te dwie funkcje nie są obecne? Z tego co mogę powiedzieć, że glMapBuffer jest w obu.QOpenGLFunctions brakuje ważnych funkcji OpenGL

Czy nie rozumiem funkcji QOpenGL, czy też rzeczywiście brakuje funkcji (mało prawdopodobne)?

+0

Brakuje funkcji, nie ma 'glDrawArray's ani –

+0

@ratchetfreak Czy wiesz, dlaczego? – Ben

+0

@Ben Ponieważ 'glDrawArrays (...)' jest funkcją OpenGL 1.1, a wszystkie platformy Qt są zaimplementowane na jej obsłudze po wyjęciu z pudełka. Brak MapBuffera wynika prawdopodobnie z tego, że jest opcjonalnym rozszerzeniem w OpenGL ES. –

Odpowiedz

3

Istnieje wiele powodów, dla tych dwóch przypadków i jeden w komentarzu:

1) O ile mi wiadomo, the addition process was selective. Only those functions got added that you would need to resolve manually.

W wymienionym wcześniej przypadku glDrawArrays funkcja ta była dostępna przez pewien czas, zarówno w środowisku OpenGL, jak i ES, gdzie obsługiwana jest obsługa Qt, więc nie ma potrzeby ręcznego rozwiązywania problemów.

Możesz po prostu użyć ich od razu w zwykły sposób opengl, w tym gl.h i tym podobne.

2) Na razie Qt does not support OpenGL ES 3 za pośrednictwem tego interfejsu. Twoje wyżej wymienione funkcje, glMapBuffer i glInvalidateFramebuffer prawdopodobnie należą do tej kategorii. Domyślnie nie są one dostępne w OpenGL ES 2 ".

Jeśli jakaś funkcja nie jest narażona i nie jest objęta wymienionymi wyżej przyczynami, prawdopodobnie jest to przeoczeniem.

+0

Masz na myśli, włączając gl.h? Te funkcje nie są jednak dostępne w oknach. – Ben

+0

Nadal jestem zdezorientowany. Nagłówki opengl dostępne w niektórych systemach nie zawierają funkcji wymienionych w moim pytaniu. Jak je zdobyć? – Ben

+0

Ah, nie zdawałem sobie sprawy, że nie są one dostępne w ES 2. Dzięki. – Ben

6

QOpenGLFunctions tylko eksponuje wspólny podzbiór OpenGL 2 (+ FBO) i OpenGL ES 2. Dlatego nie ma tam twoich funkcji. glMapBuffer jest w OpenGL 2, ale nie w ES 2 (ale istnieje rozszerzenie OES); glInvalidateFramebuffer jest w OpenGL 4.3.


Jeśli potrzebujesz żadnych innych funkcji oprócz tych wspólnego podzbioru można:

  • Wychodząc z Qt 5.6, użyj QOpenGLExtraFunctions, która ma na OpenGL ES 3.0/3.1 API (i przybliżoną równoważną funkcjonalność na pulpicie OpenGL). Jako taki ma zarówno glMapBuffer, jak i .

  • go rozwiązać samemu poprzez QOpenGLContext::getProcAddress

  • użycie QOpenGLContext::versionFunctions<T>() aby uzyskać obiekt funkcyjny zawierający wszystkie funkcje dla danej wersji OpenGL, na przykład

    auto functions = context->versionFunctions<QOpenGLFunctions_4_3_Core>(); 
    if (!functions) error(); 
    functions->initializeOpenGLFunctions(); 
    functions->glInvalidateFramebuffer(...); 
    
  • #include <QOpenGLExtensions> i użyj klas (-ów) zawijających potrzebne rozszerzenia, na przykład

    auto functions = new QOpenGLExtension_ARB_invalidate_subdata; 
    if (!functions->initializeOpenGLFunctions()) error(); 
    functions->glInvalidateFramebuffer(...) 
    
  • owinąć kombinacji wyżej w klasie, która będzie korzystać z połączenia rozdzielonych podane odpowiednią wersję GL lub cofać się do rozszerzenia, lub fail (np .: QOpenGLTexture).

Dla glMapBuffer, to jest rzeczywiście narażone jakoś owinięte QOpenGLBuffer.

+0

Genialny! Uważam, że OpenGL w Qt5 jest w najlepszym razie mylący, to na pewno mi pomogło. Pozostaje jednak jedna duża Q, w mojej istniejącej bazie kodu mam dużo kodu opengl, który próbuję teraz wprowadzić do mojej aplikacji Qt5. Czy istnieje sposób użycia metody QOpenGLContext :: versionFunctions () do uzyskania właściwego obiektu funkcji bez konieczności poprzedzania każdego wywołania opengl funkcjami->? –

+0

Kiedy mówisz "prawidłowe funkcje", czy odnosisz się do konkretnej wersji GL? – peppe