В настоящее время я разрабатываю графический движок OpenGL, уделяя особое внимание универсальности. Я стремлюсь к тому, чтобы кадры отображались в окне, а также позволял сохранять изображения на диск без отображения окна. Чтобы добиться этого, я решил инициализировать OpenGL перед GLFW (OpenGL Framework). Раньше я инициализировал OpenGL после создания окна с помощью функции gladLoadGLLoader()
. Однако из-за необходимости использовать функцию gladLoadGL()
сейчас я столкнулся с ошибкой SIGSEV при ее реализации в C.
ASSERT(!gladLoadGL(), "Failed to load OpenGL!\n");
glViewport(0, 0, 256, 256);
struct window wd;
/*
* this is the struct:
*
* struct window {
* int width, height;
* const char *title;
* GLFWwindow *id;
* };
* */
ASSERT(!glfwInit(), "Failed to initialize GLFW!\n");
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
#endif
wd.id = glfwCreateWindow(256, 256, title, NULL, NULL);
ASSERT(wd.id == NULL, "Failed to create window!\n");
glfwMakeContextCurrent(wd.id);
Следующий код генерирует SIGSEV. Но когда я инициализирую GLAD после GLFW с помощью gladLoadGLLoader()
, все работает нормально.
GLFW не поддерживает создание безгласных контекстов, поэтому самый простой обходной путь — просто создать скрытое окно. Короче говоря, включите следующую подсказку окна:
glfwWindowHint(GLFW_WINDOW_VISIBLE, GLFW_FALSE);
Затем, когда/если вы действительно хотите показать окно, вызовите glfwShowWindow():
glfwShowWindow(window);
Это, конечно, не настоящий безголовый контекст, но, опять же, GLFW его не поддерживает, так что вы можете использовать этот обходной путь. В противном случае вам нужно использовать другую библиотеку, которая поддерживает правильный рендеринг за кадром.
Я не думаю, что это возможно. Вы можете создать невидимое окно и использовать его для рендеринга. Существуют также программные реализации GL, не требующие окна (что-то было у Mesa).