Нарушение доступа glGenFramebuffers() при использовании GLFW + GLEW

Я получаю эту ошибку:

«Нарушение прав доступа к месту выполнения 0x00000000».

когда я использую GLFW + GLEW в Windows.

Я использую Windows 7. У меня также есть собственная реализация (с нуля), которая создает окно, инициализирует контекст OpenGL, инициализирует GLEW и т. д., и все работает нормально. Так что, конечно, моя видеокарта имеет функцию буфера кадров, и с драйверами все в порядке... проблема возникает только тогда, когда я пытаюсь использовать GLFW.

Любое предложение?

Код:

void start()
{
    if( !glfwInit() )
    {
        glfwTerminate();
        throw exception( "Failed to initialize GLFW" );
    }

    glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 4 );
    glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
    glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 3 );
    glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );

    if( !glfwOpenWindow( m_width, m_height, 0, 0, 0, 0, 32, 0, GLFW_WINDOW ) )
    {
        throw exception( "Failed to open GLFW window." );
        glfwTerminate();
    }

    if ( glewInit() != GLEW_OK )
    {
        throw exception( "Failed to initialize GLEW" );
    }

    // texture
    glGenTextures( 1, &m_texture );
    glBindTexture( GL_TEXTURE_2D, m_texture );

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

    // frame buffer
    glGenFramebuffers( 1, &m_frameBuffer ); // IT CRASHES HERE! :-(
    glBindFramebuffer( GL_FRAMEBUFFER, m_frameBuffer );

    glBindTexture( GL_TEXTURE_2D, m_texture );

    ...
}

person Wagner Patriota    schedule 01.03.2013    source источник
comment
Итак, вы пытаетесь сказать мне, что реализовали OpenGL самостоятельно, учитывая, что вы сказали, что у вас есть собственная реализация с нуля?   -  person Jesus Ramos    schedule 02.03.2013
comment
Также можете ли вы показать нам какой-нибудь код в том или ином месте, где это происходит, вместе с вашим кодом инициализации?   -  person Jesus Ramos    schedule 02.03.2013
comment
лол.... извините... я забыл какое-то слово... я исправлю...   -  person Wagner Patriota    schedule 02.03.2013
comment
Я так и предполагал. Можете ли вы показать свои вызовы GLFW во время инициализации?   -  person Jesus Ramos    schedule 02.03.2013


Ответы (2)


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

person Nicol Bolas    schedule 01.03.2013
comment
хорошо! Я мог бы обойти это, воспользовавшись вашим советом ... он больше не падает, но мой рендер становится черным. может быть, это другая проблема... Я проверю немного глубже! Благодарность - person Wagner Patriota; 02.03.2013
comment
К вашему сведению, ошибка в glew все еще существует. - person squid; 07.06.2016

Я просто наткнулся на ту же проблему. Решение: вместо использования glGenFramebuffers используйте "glGenFramebuffersEXT" и в любой другой функции, которая имеет какое-то отношение к фреймбуферу, всегда добавляйте "EXT" в конце, и это должно работать. Проблема здесь в том, что существует две версии расширения: версия ARB и версия EXT, и если вы не пишете «EXT», вы используете версию «ARB», которая в основном делает то же самое, но является частью основного профиля расширения. более новые версии gl. Поэтому для совместимости всегда используйте версии функций «EXT» :-)

person J-MAN    schedule 02.03.2015
comment
Я бы вообще не рекомендовал использовать EXT вариант этой функциональности в настоящее время. ARB API намного чище, а также широко доступен в реализациях с поддержкой GL 2.x. - person derhass; 02.03.2015
comment
@J-MAN glew.h также определяет glGenFrameBuffersEXT как макрос, поэтому у меня все равно происходит сбой. - person SparkyNZ; 08.06.2017
comment
@J-MAN Моя проблема заключалась в том, что я не вызывал glewInit(). - person SparkyNZ; 08.06.2017