Мультитекстурирование OpenGL - glActiveTexture имеет значение NULL

Я запустил новый проект, в котором хочу использовать мультитекстурирование. Я уже делал мультитекстурирование и поддерживается моей версией OpenGL

В шапке у меня есть:

GLuint  m_TerrainTexture[3];//heightmap, texture map and detail map
GLuint  m_SkyboxTexture[5]; //left, front, right, back and top textures

PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
PFNGLACTIVETEXTUREARBPROC   glActiveTexture;

В конструкторе у меня есть:

glActiveTexture = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress((LPCSTR)"glActiveTextureARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress((LPCSTR)"glMultiTexCoord2fARB");

if(!glActiveTexture || !glMultiTexCoord2fARB)
{
    MessageBox(NULL, "multitexturing failed", "OGL_D3D Error", MB_OK);
}

glActiveTexture( GL_TEXTURE0_ARB );
...

Это показывает окно сообщения "мультитекстурирование не удалось", и содержимое glActiveTexture 0x00000000

когда он попадает в glActiveTexture( GL_TEXTURE0_ARB); Я получаю ошибку нарушения доступа

Я реализую диаграмму MVC, так что это все в моем классе просмотра местности

4 ответа

Решение

Вы процитировали свой код для загрузки расширений следующим образом:

PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
PFNGLACTIVETEXTUREARBPROC   glActiveTexture;

glActiveTexture = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress((LPCSTR)"glActiveTextureARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress((LPCSTR)"glMultiTexCoord2fARB");

Это очень проблематично, поскольку возможно переопределяет уже существующие символы. (Динамический) компоновщик в конечном итоге отключится. Например, может случиться так, что присваивание переменной-указателю glActiveTexture идет в какое-то место, но всякий раз, когда вызывается функция с тем же именем, она вызывает что-то связанное откуда-то еще.

В C вы обычно используете комбинацию макросов препроцессора и пользовательского префикса, чтобы избежать этой проблемы, без необходимости настраивать большие части кода.

PFNGLMULTITEXCOORD2FARBPROC myglMultiTexCoord2fARB;
#define glMultiTexCoord2fARB myglMultiTexCoord2fARB

PFNGLACTIVETEXTUREARBPROC   myglActiveTexture;
#define glActiveTexture myglActiveTexture

glActiveTexture = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress((LPCSTR)"glActiveTextureARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress((LPCSTR)"glMultiTexCoord2fARB");

Я действительно не знаю ни одной другой причины, по которой вещи могут потерпеть неудачу, если у вас активен допустимый контекст рендеринга и поддерживаются расширения.

GLEE - мертвая библиотека; это не было обновлено в течение долгого времени.

GLEW - прекрасная библиотека загрузки расширений, но у нее есть некоторые проблемы с ядром 3.2 и выше.

Я бы предложил GL3W. Прелесть этого в том, что он самообновляется; он загружает и анализирует заголовки самостоятельно. Недостатком является необходимость установки Python 2.6 для создания загрузчика. Но в противном случае это дает достаточно хорошие результаты.

Я рекомендую GLEW/ GLEE для управления расширениями.

Учебник Rastertek имеет полную настройку, необходимую для работы wglGetProcAddress. GLEW тоже не работает для меня, я перепробовал все, что мог придумать, и спросил многих об этом, но он просто не работает в VS 2012, не говоря уже об огромном разочаровании, которое я испытал, когда хотел скомпилировать шейдер.

Другие вопросы по тегам