Domanda

Voglio usare le funzioni esposte sotto le estensioni OpenGL.Io sono su Windows, come faccio a fare questo?

È stato utile?

Soluzione

Di facile soluzione:Utilizzare GLEW.Vedere come qui.

Difficile soluzione:Se si dispone di un davvero forte ragione non utilizzare GLEW, ecco come fare per ottenere lo stesso senza di essa:

Individuare l'estensione OpenGL e le Api di estensione che si desidera utilizzare.Estensioni OpenGL sono elencati nella Estensione OpenGL Registro Di Sistema.

Esempio:Vorrei utilizzare le funzionalità del EXT_framebuffer_object estensione.Le Api: "vorrei che da questa estensione sono:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Controllare se la vostra scheda grafica supporta l'estensione che si desidera utilizzare.Se lo fa, allora il vostro lavoro è quasi fatto!Scaricare e installare i driver più recenti e Sdk per la scheda grafica.

Esempio:La scheda grafica nel mio PC è un NVIDIA 6600 GT.Così, ho la visita il NVIDIA OpenGL Extension Specifiche pagina web e scoprire che il EXT_framebuffer_object l'estensione è supportato.Ho poi scaricare l'ultima NVIDIA OpenGL SDK e installarlo.

La tua scheda grafica produttore fornisce una glext.h il file di intestazione (o un nome simile, file di intestazione) con tutte le dichiarazioni necessarie per utilizzare il supporto OpenGL extensions.(Si noti che non tutte le estensioni potrebbero essere supportate). Posto questa intestazione del file da qualche parte il compilatore è in grado di raccoglierlo o includere la directory nel vostro compilatore directory elenco.

Aggiungere un #include <glext.h> linea di codice per includere il file di intestazione nel tuo codice.

Aperto glext.h, trovare le API che si desidera utilizzare e afferrare il suo corrispondente brutto aspetto dichiarazione.

Esempio:Io la ricerca sopra il framebuffer, di Api e di trovare il loro corrispondente brutto aspetto dichiarazioni:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

Tutto questo significa che il vostro file di intestazione è la dichiarazione di API in 2 moduli.Uno è un wgl-come brutto dichiarazione di un puntatore a funzione.L'altro è un sano alla ricerca di dichiarazione di funzione.

Per ogni estensione di API che si desidera utilizzare, aggiungere nel codice dichiarazioni del nome della funzione come un tipo di brutto aspetto stringa.

Esempio:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Anche se sembra brutto, tutto quello che stiamo facendo è quello di dichiarare puntatori a funzione del tipo corrispondente all'estensione API.

Inizializzare i puntatori a funzione, con le loro funzioni legittime.Queste funzioni sono esposti dalla libreria o driver.Abbiamo bisogno di utilizzare wglGetProcAddress() funzione per fare questo.

Esempio:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

Non dimenticate di controllare i puntatori a funzione per NULL.Se per caso wglGetProcAddress() non riusciva a trovare la funzione di estensione, sarebbe hai inizializzato il puntatore NULL.

Esempio:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}

Ecco, abbiamo finito!È ora possibile utilizzare questi puntatori a funzione, come se le chiamate di funzione esisteva.

Esempio:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

Riferimento: Movimento al di Là di OpenGL 1.1 per Windows da Dave Astle — L'articolo è un po ' datato, ma ha tutte le informazioni necessarie per capire il perché di questa patetica situazione esiste su Windows e su come ottenere intorno ad esso.

Altri suggerimenti

Un 'Molto forte ragione' di non utilizzare GLEW potrebbe essere che la biblioteca non è supportata dal compilatore/IDE.E. g:Borland C++ Builder.

In questo caso, potrebbe essere necessario ricostruire la libreria di origine.Se funziona, grande, in caso contrario estensione manuale di carico non è così male come si è fatto per il suono.

@Kronikarz:Dagli sguardi di esso, GLEW sembra essere la strada del futuro.NVIDIA viene già fornito con tutto il suo OpenGL SDK.E la sua ultima versione è stata nel 2007 rispetto al GLEE che è stato nel 2006.

Ma, l'utilizzo di entrambe le librerie sembra quasi lo stesso per me.(GLEW ha un init() che deve essere chiamato prima di ogni altra cosa, però.) Quindi, non c'è bisogno di passare a meno che non trovi qualche estensione, che non sono supportati in GLEE.

GL3W è di pubblico dominio script che crea una libreria che carica solo le funzionalità di base per OpenGL 3/4.Si può trovare su github a:

https://github.com/skaslev/gl3w

GL3W richiede Python 2.6 per generare le intestazioni e librerie OpenGL;non richiede Python dopo che.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top