glGenFramebuffers или glGenFramebuffersEXT?

Я запутался. Чтобы использовать расширение объекта Framebuffer (FBO) в OpenGL 1.x в Windows, что из этого я использую?:

wglGetProcAddress("glGenFramebuffers");
// or
wglGetProcAddress("glGenFramebuffersEXT");

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

Какой из них лучше использовать? Некоторые драйверы действительно поддерживают одно, а другое нет? Правильно ли пытаться откатиться от одного к другому, если он не найден?


Редактировать: У меня все еще есть серьезные проблемы с картами ATI Radeon и кодом вокруг этого. Мы только что запустили коммерческий редактор, использующий этот код (www.scirra.com). Кажется, что независимо от того, какую комбинацию кода я использую для использования FBO, некоторые разные комбинации пользователей сообщают, что они вообще ничего не видят (т. Е. Ничего не отображается).

Вот код, в котором я определяю, использовать ли функции ARB (без суффикса ) или функции с суффиксом EXT. Это запускается при запуске:

gl_extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
gl_shading_language = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));

// If OpenGL version >= 3, framebuffer objects are core - enable regardless of extension
// (the flags are initialised to false)
if (atof(gl_version) >= 3.0)
{
    support_framebuffer_object = true;
    support_framebuffer_via_ext = false;
}
else
{
    // Detect framebuffer object support via ARB (for OpenGL version < 3) - also uses non-EXT names
    if (strstr(gl_extensions, "ARB_framebuffer_object") != 0)
    {
        support_framebuffer_object = true;
        support_framebuffer_via_ext = false;
    }
    // Detect framebuffer object support via EXT (for OpenGL version < 3) - uses the EXT names
    else if (strstr(gl_extensions, "EXT_framebuffer_object") != 0)
    {
        support_framebuffer_object = true;
        support_framebuffer_via_ext = true;
    }
}

Затем позже во время запуска он создает FBO в ожидании рендеринга в текстуру:

// Render-to-texture support: create a frame buffer object (FBO)
if (support_framebuffer_object)
{
    // If support is via EXT (OpenGL version < 3), add the EXT suffix; otherwise functions are core (OpenGL version >= 3)
    // or ARB without the EXT suffix, so just get the functions on their own.
    std::string suffix = (support_framebuffer_via_ext ? "EXT" : "");

    glGenFramebuffers = (glGenFramebuffers_t)wglGetProcAddress((std::string("glGenFramebuffers") + suffix).c_str());
    glDeleteFramebuffers = (glDeleteFramebuffers_t)wglGetProcAddress((std::string("glDeleteFramebuffers") + suffix).c_str());
    glBindFramebuffer = (glBindFramebuffer_t)wglGetProcAddress((std::string("glBindFramebuffer") + suffix).c_str());
    glFramebufferTexture2D = (glFramebufferTexture2D_t)wglGetProcAddress((std::string("glFramebufferTexture2D") + suffix).c_str());
    glCheckFramebufferStatus = (glCheckFramebufferStatus_t)wglGetProcAddress((std::string("glCheckFramebufferStatus") + suffix).c_str());
    glGenerateMipmap = (glGenerateMipmap_t)wglGetProcAddress((std::string("glGenerateMipmap") + suffix).c_str());

    // Create a FBO in anticipation of render-to-texture
    glGenFramebuffers(1, &fbo);
}

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

Награда в 500 репутации, и я отправлю бесплатную бизнес-лицензию всем, кто знает, что не так! (Стоит 99 фунтов стерлингов)


Редактировать 2: некоторые подробности. Вот список карт, на которых это известно:

ATI Mobility Radeon HD 5650

ATI Radeon X1600 Pro

ATI Mobility Radeon HD 4200

На самом деле рендеринг текстуры не выполняется. Похоже, что только вызов glGenFramebuffers полностью останавливает рендеринг на этих картах. Я мог бы отложить создание FBO до первого фактического выполнения рендеринга в текстуру, но тогда, по-видимому, он просто перестанет снова рендерить.

Я мог бы использовать GLEW, но что он делает, чего не делает мой код? Я просмотрел источник и, похоже, использовал аналогичный список wglGetProcAddress . В моем случае методы возвращаются, иначе glGenFramebuffers будет NULL и выйдет из строя. Есть идеи ...?

8
задан AshleysBrain 24 August 2011 в 13:09
поделиться