Невозможно получить доступ к окну GLFW, созданному из динамической библиотеки - PullRequest
0 голосов
/ 05 октября 2019

Я пытался понять, почему я не могу использовать ручку окна GLFW, пересекающую границы динамической библиотеки. Скорее всего, это связано с отсутствием понимания того, как GLFW работает под капотом, но я был бы очень признателен, если бы кто-то смог пролить свет на то, что может быть проблемой здесь.

У меня есть проект рендеринга в реальном времени, который в настоящее время состоит из следующих частей:

  • core.dll
  • shader-editor.exe

Основная часть содержит всю инициализацию GLEW и GLFW, код создания контекста и окна (например, glewInit, glfwMakeContextCurrent и т. Д.). Затем он компилируется как динамическая библиотека.

Редактор шейдеров динамически связывается с core.dll и использует core.dll для выполнения всей инициализации, необходимой для GLFW и GLEW.

При наличии этогоsetup Я столкнулся с каким-то странным поведением, которого я не ожидал:

  1. Чтобы использовать любые указатели функций OpenGL вне динамической библиотеки (например, в shader-editor.exe), мне все еще нужно явно вызывать glewInit для установки этих указателей (в противном случае я получаю различные ошибки сегмента). Я могу это купить, так как в этом случае инициализация выполняется в исходном файле, поэтому здесь можно либо снова вызвать glewInit (из shader-editor.exe), либо сделать glewInit вызов в заголовочном файле. Однако, делая это, файл заголовка заставляет потребителя этой динамической библиотеки также зависеть от glew, чего я, скорее всего, хочу избежать.
  2. Я открываю окно, созданное из 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 правильно инициализированы, поскольку я могу рендерить свои сетки и так далее без каких-либо проблем. .

Ценю любой вклад, спасибо!

...