2014-09-13 10 views
7

Voglio assicurarmi che la mia applicazione sia conforme a OpenGL 2.1. Come posso verificare questo?Come verificare la conformità della versione OpenGL?

Poiché il mio computer supporta GL4.4, anche se utilizzo, ad esempio, glGenVertexArrays(), funzionerà correttamente. Ma glGenVertexArrays() è disponibile solo con GL3 +.

Quindi, voglio verificare che la mia app utilizzi solo la funzionalità GL2.1. Un modo è quello di eseguirlo sul mio vecchio PC che supporta solo GL2.1, ma sto cercando un modo più semplice.

risposta

1

È possibile compilarlo in un ambiente in cui sono disponibili solo i simboli OpenGL-2.1. A seconda di quale wrapper/caricatore di estensione si utilizza questo può essere facile o difficile.

Per esempio, se si utilizza il glloadgen OpenGL loader generator è possibile generare un'unità di file di intestazione e la compilazione che coprirà solo esattamente le OpenGL 2.1-simboli e gettoni. Se poi si compila il progetto usando questo, il compilatore eseguirà un errore su tutto ciò che non è coperto.

0

Se si trova un caricatore di estensione che supporta la generazione di intestazioni specifiche della versione, come descritto da @datenwolf, questa è probabilmente la soluzione più semplice. Ci sono altre opzioni che puoi provare se necessario.

Le intestazioni ufficiali OpenGL che è possibile trovare su https://www.opengl.org/registry contengono le definizioni raggruppate per versione e racchiuse nelle condizioni del preprocessore. Il layout è simile al seguente:

... 
#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 
... 

Dovresti essere in grado di includere l'intestazione ufficiale almeno per un test di versione. Se si disabilitano le versioni che non si desidera utilizzare definendo il corrispondente simbolo del pre-processore, si otterranno errori di compilazione se si sta tentando di utilizzare le funzionalità di tali versioni. Ad esempio per 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

Prova https://github.com/cginternals/glbinding. Si tratta di una libreria OpenGL involucro che supporta esattamente quello che chiedi:

Feature-Centered Header design

L'API OpenGL è iterativo sviluppato e rilasciato nelle versioni, internamente (per la specifica API) che si chiama caratteristiche. L'ultima versione di OpenGL è 4.5. La versione precedente sono 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 e 4.4. OpenGL utilizza un modello di deprecazione per rimuovere le parti obsolete della sua API che risulta in compatibilità (con API deprecato) e core (senza API deprecata) che si manifesta nel contesto OpenGL di destinazione . Inoltre, i nuovi concetti di API sono suggeriti come estensioni (spesso specifiche del fornitore) che potrebbero essere integrate nelle versioni future di . Tutto ciò si traduce in molte possibili specifiche manifestazioni dell'API OpenGL che è possibile utilizzare nel programma.

Un duro compito è quello di aderire a quella concordata insieme di funzioni nel proprio programma di OpenGL (ad esempio, OpenGL 3.2 Nucleo se si desidera sviluppare per ogni Windows, MacOS e Linux rilasciato negli ultimi 4 anni).accollatura facilita questo fornendo intestazioni per funzionalità tramite sottoinsiemi ben definiti/generati dell'API OpenGL.

All-funzioni OpenGL intestazioni

Se non si utilizzano le intestazioni per-funzione il programma OpenGL può assomigliare questo:

#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); 

Single-Feature OpenGL intestazioni

Quando si sviluppa il codice su Windows con gli ultimi driver installati, è probabile che il codice sopra compili e corri. Ma se vuoi portare la porta a sistemi con supporto driver meno maturo (ad es. MacOS o Linux usando driver open source), potresti chiederti se è disponibile glDrawElementsInstanced . In questo caso, basta passare per le intestazioni per-funzione di glbinding e scegliere le intestazioni Nucleo OpenGL 3.2 (come si sa che a almeno questa versione è disponibile su tutte le piattaforme di destinazione):

#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); 

Se il compila il codice di quanto tu possa essere sicuro che sia compatibile con OpenGL 3.2 Core . L'uso di funzioni che non sono ancora disponibili o che si basano sulla funzionalità deprecata di sono state eliminate.