Я в замешательстве. Чтобы использовать расширение объекта 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
будет НЕДЕЙСТВИТЕЛЕН и сбой. Есть идеи ...?