wglMakeCurrent текстуры исчезают - PullRequest
0 голосов
/ 04 февраля 2019

Привет! Я пытаюсь отобразить 3 полноэкранных окна на разных мониторах, до сих пор я успешно запрашивал существующие мониторы EnumDisplayMonitors, чтобы получить 4 параметра, необходимые для создания 3 окон с применением стиля WS_POPUP.

В одном кадре я делаю следующее:

for(int i=0; i<monitorsNum; i++)
{
    wglMakeCurrent(hdcs[i], sharedHrc);
    doRendering();
    SwapBuffers(hdcs[i]);
}

Многие веб-сайты предлагают то же самое, однако, когда я перехожу с 1 монитора на 2 или более мониторов, текстуры исчезают:

enter image description here

То, что вы видите, представляет собой одну и ту же сцену, визуализированную 3 раза, немного различный фоновый чистый цвет показывает, что, по крайней мере, я делаю вещи частично корректно (прозрачный прозрачный цвет показывает правильно, он даже работает с 3 мониторами 3 разных размеров).Я попытался перехватить все вызовы gl с помощью glGetError () без каких-либо ошибок.Есть ли какой-то конкретный шаг, который я пропустил, или, возможно, это проблема моего ноутбука?

Если это помогает, 3 окна создаются с существующей структурой, поэтому при создании каждому окну был присвоен свой hrc,но тогда я просто использую один HRC для других 2 окон.(таким образом, 3 hrc созданы, и 1 используется, если это имеет значение)

1 Ответ

0 голосов
/ 05 февраля 2019

Существует много причин, по которым текстура может отображаться некорректно при рендеринге некоторой геометрии.

Но если предположить, что ваша проблема не связана ни с одной из этих вещей, таких как некорректный UVS, проблемы с шейдером, создание текстуры и т. Д.Эта проблема может быть связана с тем, что вы сейчас управляете несколькими контекстами.

Чтобы настроить несколько окон, вам необходимо создать контекст для каждого окна.Функция wglMakeCurrent позволяет вам переключать контекст для каждого окна, рендеринг на ходу.

https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-wglmakecurrent

Функция wglMakeCurrent создает указанный контекст визуализации OpenGL в текущем контексте визуализации вызывающего потока.Все последующие вызовы OpenGL, сделанные потоком, отрисовываются на устройстве, идентифицированном hdc.Вы также можете использовать wglMakeCurrent, чтобы изменить текущий контекст рендеринга вызывающего потока, чтобы он больше не был текущим.

Контекст OpenGL представляет буфер кадра по умолчанию (место по умолчанию, в которое ваш шейдер будет выводить при рендеринге), но этотакже хранит все состояния, связанные с этим экземпляром OpenGL.

Более того:

Каждый контекст имеет свой собственный набор объектов OpenGL, которые не зависят от других контекстов.

Таким образом, это означает, что каждый контекст не имеет доступа к одним и тем же ресурсам, если не указано явно.

Любое совместное использование объекта должно выполняться явно, либо при создании контекста.или до того, как вновь созданный контекст создает какие-либо объекты.Однако контексты не должны совместно использовать объекты;они могут оставаться полностью отделенными друг от друга.

Поэтому одна из причин, по которой вы можете отображать одну и ту же текстуру (ы) в каждом окне, заключается в том, что эта текстура не является общим ресурсом.glClearColor отлично работает, поскольку он не зависит от каких-либо ресурсов, связанных с каким-либо конкретным контекстом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...