page

OpenGL : Extensions

Автор:

Вы вероятно уже знаете что такое расширения OpenGL.
Если это не так, то можете ознакомится с ними прочитав эту статью.

Обычно код инициализации расширения выглядит примерно так:

bool Init_GL_ARB_multitexture()
{
  // Проверяем наличие расширения
  if(!IsExtEnable("GL_ARB_multitexture"))
    return false;
  
  // Получить адрес функции и присвоить его глобальному указателю
  glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)
    wglGetProcAddress("glActiveTextureARB");
  glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)
    wglGetProcAddress("glClientActiveTextureARB");
  glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)
    wglGetProcAddress("glMultiTexCoord2fARB");
  return true;
}

Однако очень быстро надоедает прописывать 'магические комбинации букв', такие как  (PFNGLACTIVETEXTUREARBPROC).
Также не очень приятно писать дважды имя нужной функции.
Хочу рассказать вам о том как я сейчас избавляюсь от этих неудобств:

Начнем с (PFNGLWHATIWANTARBPROC):

template< class T >
bool initGlExtensionFuncPtr(T &func, const char * name){
  func = (T)getProcAddress(name); //wglGetProcAddress( name ) или glXGetProcAddress( name ) или handMadeGetProcAddress( name );
  return (func!=0);
  }

Теперь наш код будет выглядеть примерно так:

  initGlExtensionFuncPtr(glActiveTextureARB, "glActiveTextureARB");
  initGlExtensionFuncPtr(glClientActiveTextureARB, "glClientActiveTextureARB");
  initGlExtensionFuncPtr(glMultiTexCoord2fARB, "glMultiTexCoord2fARB");

С помощью макросов его можно сделать еще короче:

#define init(X) initGlExtensionFuncPtr(X, #X)
  init(glActiveTextureARB);
  init(glClientActiveTextureARB);
  init(glMultiTexCoord2fARB);
#undef init 

Также многие рекомендуют проверять все функции на ноль, 'на всякий случай'; добавим эту проверку в наш код и посмотрим что получилось:

#define init(X) initGlExtensionFuncPtr(X, #X)
bool Init_GL_ARB_multitexture()
{
  return
  // Проверяем наличие расширения
    IsExtEnable("GL_ARB_multitexture") && 
  // Получить адрес функции и присвоить его глобальному указателю
    init(glActiveTextureARB) &&
    init(glClientActiveTextureARB) &&
    init(glMultiTexCoord2fARB);
}
#undef init 

PS
  http://www.gamedev.ru/code/articles/?id=4267
  http://www.opengl.org/registry/
  http://www.opengl.org/documentation/

#C++, #графика, #OpenGL

7 января 2011

Комментарии [5]