2010-11-30 13 views
2

J'ai vérifié docs, et il dit que la version OpenGL doit être au moins 1.5 pour faire glGenBuffers() travail. L'utilisateur a la version 1.5 mais l'appel de fonction provoquera un plantage. Est-ce une erreur dans les docs, ou un problème de pilote sur l'utilisateur?OpenGL: Comment vérifier si l'utilisateur supporte glGenBuffers()?

J'utilise ce glGenBuffers() pour VBO, comment puis-je vérifier si l'utilisateur a un support pour cela?

Edit: im en utilisant glew avec glewInit() pour initialiser VBO

Edit2: Je l'ai travailler sur l'utilisateur avec glGenBuffersARB() appels de fonction. Mais je cherche toujours un moyen de savoir quand devrais-je utiliser glGenBuffers() et quand devrais-je utiliser glGenBuffersARB() ET quand devrais-je utiliser VertexArrays si aucun des appels de fonction VBO n'est pris en charge.

J'ai également découvert que if(GLEW_VERSION_1_5) renvoie faux sur l'utilisateur, mais GL_VERSION donne 1.5.0, ce qui n'a tout simplement aucun sens!

+0

Avez-vous vérifié que vous disposez d'un contexte OpenGL valide avant l'appel? – Bart

+0

Je n'ai aucune idée de ce que c'est et où est-il vérifié. – Newbie

+0

Si vous n'utilisez pas de VBO, le rendu en OpenGL fonctionne correctement? – Bart

Répondre

0

Cochez cette case link. Peut-être que cela vous aidera;)

if (GLEW_VERSION_1_5) 
{ 
    /* You have OpenGL 1.5 */ 
} 

Essayez glGenBuffersARB insted glGenBuffers; Je pense que vous avez seulement besoin de vérifier le support 1.5;

+0

Pouvez-vous indiquer le bon nom d'extension pour l'utilisation de VBO? OU donner une liste où je peux trouver ces choses – Newbie

+0

@Newbie essayer glGenBuffersARB – Edward83

+0

Dois-je aussi convertir tous les autres appels de fonction à * ARB? Comme glBindBuffer() et glBufferData() etc – Newbie

2

Je vais vous dire maintenant de rester loin de GLEW ou de l'une de ces bibliothèques principalement parce qu'elles sont inutiles, c'est comme ça que je l'ai toujours fait.

#ifndef STRINGIFY 
    #define STRINGIFY(x) #x 
#endif 
#ifdef WIN32 
    #include <windows.h> 
    #define glGetProcAddress(a) wglGetProcAddress(a) 
#endif 
#ifdef X11 
    #define glGetProcAddress(a) glXGetProcAddress (\ 
    reinterpret_cast<const unsigned char*>(a)  \ 
) 
#endif 

#ifndef GetExtension 
    #define GetExtension(Type, ExtenName)  \ 
    ExtenName = (Type)      \ 
    glGetProcAddress(STRINGIFY(ExtenName)); \ 
    if(!ExtenName)       \ 
    {          \ 
     std:cout << "Your Computer Does Not " \ 
       << "Support GL Extension: " \ 
       << STRINGIFY(ExtenName)  \ 
       << std::endl;    \ 
     exit(1);        \   
    }          \ 
    else         \ 
    {          \ 
     std::cout << "Loadded Extension: " \ 
       << STRINGIFY(ExtenName)  \ 
       << std::endl;    \ 
    } 
#endif 

// then just use this :D 
GetExtension(PFNGLGENBUFFERSARBPROC, glGenBuffersARB) 
// after your done you can do this 
#undef GetExtension 
#undef glGetProcAddress 
// you can then also undef the STRINGIFY macro 
// though it does come in handy. 
+0

notez que X11 est où X.ORG est utilisé, comme sur linux, et unix comme OS, il y a aussi un moyen MacOSX de faire le GetExtension aussi, je ne m'en souviens tout simplement pas. – graphitemaster

+0

est-il possible de le faire sans utiliser de macro? – Newbie