Я пытался понять, почему я не могу использовать ручку окна GLFW, пересекающую границы динамической библиотеки. Скорее всего, это связано с отсутствием понимания того, как GLFW работает под капотом, но я был бы очень признателен, если бы кто-то смог пролить свет на то, что может быть проблемой здесь.
У меня есть проект рендеринга в реальном времени, который в настоящее время состоит из следующих частей:
- core.dll
- shader-editor.exe
Основная часть содержит всю инициализацию GLEW и GLFW, код создания контекста и окна (например, glewInit
, glfwMakeContextCurrent
и т. Д.). Затем он компилируется как динамическая библиотека.
Редактор шейдеров динамически связывается с core.dll и использует core.dll для выполнения всей инициализации, необходимой для GLFW и GLEW.
При наличии этогоsetup Я столкнулся с каким-то странным поведением, которого я не ожидал:
- Чтобы использовать любые указатели функций OpenGL вне динамической библиотеки (например, в shader-editor.exe), мне все еще нужно явно вызывать
glewInit
для установки этих указателей (в противном случае я получаю различные ошибки сегмента). Я могу это купить, так как в этом случае инициализация выполняется в исходном файле, поэтому здесь можно либо снова вызвать glewInit
(из shader-editor.exe
), либо сделать glewInit
вызов в заголовочном файле. Однако, делая это, файл заголовка заставляет потребителя этой динамической библиотеки также зависеть от glew, чего я, скорее всего, хочу избежать. - Я открываю окно, созданное из
core.dll
, с помощью простого метода getфункция, которую shader-editor.exe
использует для получения дескриптора окна. Однако, когда я пытаюсь использовать этот дескриптор окна, создается впечатление, что его нельзя использовать извне core.dll
, поскольку я не могу запросить основную информацию о окне. Например, где-то в shader-editor.exe
я бы сделал
GLFWwindow* window = this->window_manager_->GetWindow(); // window_manager is instantiated in `core.dll` and has prior to this line created a window and initialized a working GLFW context.
int w, h;
int display_w, display_w;
glfwGetWindowSize(window, &w, &h);
glfwGetFramebufferSize(window, &display_w, &display_h);
В приведенном выше коде display_w
, display_w
, w
и h
все возвращаются как 0. Однако если я запустлюодин и тот же код в функции this->window_manager_->GetWindow()
возвращает правильную ширину и высоту.
Также стоит отметить, что GLFW и GLEW правильно инициализированы, поскольку я могу рендерить свои сетки и так далее без каких-либо проблем. .
Ценю любой вклад, спасибо!