Я пытаюсь запустить приложение opengl на удаленном вычислительном кластере. Я использую osmesa, так как намереваюсь выполнять программный рендеринг вне экрана (без пересылки x11 и т. Д.). Я хочу использовать glew (чтобы упростить жизнь с шейдерами и другими вызовами, связанными с расширением), и мне кажется, что я хорошо скомпоновал и связал mesa и glew.
Когда я вызываю mesa-create-context, glewinit выдает версию OPENGL, недоступную, что, вероятно, означает, что контекст не был создан. Когда я вызываю glGetString (GL_EXTENSIONS), я не получаю никакого вывода, что подтверждает это. Это также показывает, что глю работает самостоятельно. (Другие команды glew, такие как glew и т. Д., Также работают).
Теперь, когда я (как показано ниже), добавляю функцию mesa-make-context-current, glewinit вылетает с segfault. Запуск glGetString (GL_EXTENSIONS) теперь дает мне список расширений (что означает, что создание контекста успешно!)
Я часами пытался в этом разобраться, пытался повозиться, но ничего не получается. Буду очень признателен за любую помощь в этом. Может быть, некоторые из вас испытывали нечто подобное раньше? Еще раз спасибо!
int Height = 1; int Width = 1;
OSMesaContext ctx; void *buffer;
ctx = OSMesaCreateContext( OSMESA_RGBA, NULL );
buffer = malloc( Width * Height * 4 * sizeof(GLfloat) );
if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) {
printf("OSMesaMakeCurrent failed!\n");
return 0;
}
-- glewinit() crashes after this.
Просто добавлю, что osmesa и glew изначально не компилировались. Поскольку glew не определяет GLAPI в последней строке и поскольку osmesa не будет снова включать gl.h, GLAPI остается неопределенным и вызывает ошибку в osmesa.h (119). Я справился с этим, добавив extern в GLAPI, хотя и не уверен, что это актуально.
Просматривая исходный код glewInit в glew.c, если glewContextInit завершается успешно, он возвращает GLEW_OK, GLEW_OK имеет значение 0, и поэтому в системах Linux он всегда будет вызывать glxewContextInit, который вызывает функции glX, которые в случае OSMesa, скорее всего, не будут готовы к использованию. , Это вызовет segfault (как я вижу), и кажется, что функция glewInit, к сожалению, не способна обработать этот случай без исправления исходного кода C и перекомпиляции библиотеки.
Если другие уже решили эту проблему, мне было бы интересно, я видел некоторые исправленные версии источников glew.c, которые обходят эту проблему. Не ясно, есть ли какая-либо энергия в сообществе GLEW, чтобы объединить изменения в этом адресе в этом случае использования.