2013-07-08 13 views
5

Sto scrivendo un programma che dipende da OpenGL 2.0 o versioni successive. Guardando le specifiche di GL 2.0 vedo che è stata promossa l'estensione definita in ARB_shader_objects che suppongo significhi che il prefisso ARB non sia più richiesto per GL versione 2.0 e successive e qualsiasi implementazione che supporta> GL2.0 avrà questo come parte di l'implementazione principale.Definizione di GL_GLEXT_PROTOTYPES rispetto all'ottenere puntatori di funzioni

Detto questo, quando compilo il mio programma gcc su Linux avverte: dichiarazione implicita di funzione. Un modo per ottenere queste funzioni è dichiararle nel programma stesso e quindi ottenere i puntatori di funzione tramite la funzione * GetProcAddress.

L'altro modo è definire GL_GLEXT_PROTOTYPES prima di includere glext.h che elude il problema di ottenere i puntatori di funzione per ciascuna delle funzioni che sono per impostazione predefinita ora presenti in GL2.0 o superiore. Qualcuno potrebbe suggerire se è consigliato e corretto? La linea di base è che il mio programma richiede OpenGL 2.0 o superiore e non voglio supportare niente di meno di GL2.0.

Nel caso qualcuno suggerisse di usare glee o glew, non voglio usare/avere l'opzione di usare le librerie glee o glew per ottenere lo stesso.

risposta

8

Ci sono due problemi qui.

GL_ARB_shader_objects è stato promosso core in GL2.0, ma l'API è stata leggermente modificata per la versione core, quindi non sono solo gli stessi nomi di funzione senza il prefisso ARB, ad es. c'è glCreateShader() anziché glCreateShaderObjectARB() e le due funzioni glGetShaderInfoLog() e glGetProgramInfoLog() in sostituzione di glGetInfoLogARB() e alcune altre piccole differenze di questo tipo.

Il secondo problema è partire dal presupposto che la libreria GL esporti tutte le funzioni principali . Su Linux di solito è il caso (non solo per le funzioni di base, ma fondamentalmente per tutto), ma non esiste uno standard che lo garantisca. Il OpenGL ABI for Linux richiede solo:

3.4. Le librerie devono esportare staticamente tutti i punti di ingresso OpenGL 1.2, GLU 1.3, GLX 1.3 e ARB_multitexture.

Ci sono proposals for an update ma di recente non ne ho più sentito parlare.

Windows esporta solo core OpenGL 1.1, poiché il file opengl32.dll fa parte del sistema operativo e l'ICD si trova in una DLL separata. Devi interrogare i puntatori di funzione praticamente per tutto lì.

Quindi il modo più portabile è quello di interrogare definitivamente il contenuto, non importa se lo si fa manualmente o si utilizza una libreria come glew.

+0

IIRC Vista e precedenti hanno migliorato * leggermente * la situazione esportando 1.4. – genpfault

+1

@genpfault: no, non l'hanno fatto. Vista usa solo D3D invece di un sw rasterizer per il renderer di default 1.1, ma per il resto è sempre lo stesso. GL1.1 è semplicemente parte dell'API Win32 e non è mai stato aggiornato. – derhass

+0

Cosa ne pensi di definire GL_EXT_PROTOTYPES e usare le funzioni senza fare GetProcAddress per tutti loro? Non è raccomandato? Se no, allora perché è parte delle intestazioni di glext? Inoltre, per le funzionalità di base, se è necessario fare sempre GetProcAddress, allora qual è lo scopo di farli promuovere come funzionalità principale? – Divick

Problemi correlati