2013-03-01 6 views
2

Я получаю эту ошибку:glGenFramebuffers() нарушение прав доступа при использовании GLFW + GLEW

"Access violation executing location 0x00000000."

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

Я использую Windows 7. У меня также есть своя реализация (с нуля), которая создает окно, инициализирует контекст OpenGL, инициализирует GLEW и т. Д. ... и все работает нормально. Так что, конечно, у моей видеокарты есть функция Frame Buffer, и все в порядке с драйверами ... проблема возникает, когда я пытаюсь использовать 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); 

    ... 
} 
+1

Итак, вы пытаетесь сказать мне, что вы внедрили OpenGL самостоятельно, считая, что у вас есть своя реализация с нуля? –

+0

Также вы можете показать нам код рядом или рядом с тем, где это происходит вместе с вашим кодом инициализации? –

+0

lol .... извините ... я забыл немного слова ... Я исправлю это ... –

ответ

7

GLEW имеет известные проблемы при работе с профилем ядра OpenGL. Вы можете использовать the GLEW workaround или отказаться от GLEW для extension loaders that actually work.

+0

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

+0

Я имею в виду: я мог бы РЕШИТЬ это, используя ваш совет ... –

+1

FYI, ошибка в glew все еще существует. – squid

1

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

+2

Я бы не рекомендовал использовать EXT-вариант этой функции на всех в настоящее время. ARB API намного чище, а также доступен по версии GL 2.x. – derhass

+0

@ J-MAN glew.h также определяет glGenFrameBuffersEXT как макрос, так что он все равно рушится для меня точно так же. – SparkyNZ

+0

@ J-MAN Моя проблема заключалась в том, что я не вызывал glewInit(). – SparkyNZ