Мультитекстурирование OpenGL - glActiveTexture имеет значение NULL - PullRequest
4 голосов
/ 28 апреля 2011

Я запустил новый проект, в котором хочу использовать мультитекстурирование. Я уже делал мультитекстурирование и поддерживается моей версией 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 ]

1 голос
/ 29 апреля 2011

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

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");

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

1 голос
/ 12 июня 2011

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

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

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

0 голосов
/ 06 февраля 2014

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

0 голосов
/ 28 апреля 2011

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

...