Мультитекстурирование 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 для создания загрузчика. Но в противном случае это дает достаточно хорошие результаты.
Учебник Rastertek имеет полную настройку, необходимую для работы wglGetProcAddress. GLEW тоже не работает для меня, я перепробовал все, что мог придумать, и спросил многих об этом, но он просто не работает в VS 2012, не говоря уже об огромном разочаровании, которое я испытал, когда хотел скомпилировать шейдер.