2015-05-04 3 views
3

У меня возникла следующая проблема с приложением OpenGL «A» (написано на C++): После переключения в другое окно «B» (либо дочернее окно того же приложения, либо совершенно другое приложение), а затем переключение на «A», все рендеринг OpenGL ограничивается областью «A», которая была покрыта «B».Недопустимый контекст контекста OpenGL после переключения между окнами

  • проблема уходит после минимизации и повторного максимизации окна «A»
  • проблема возникает только на одном компьютере Windows 7. При тестировании на многих других машинах (как в Windows, так и в Linux) все работает нормально. Обновление драйвера графики до последней версии также не помогло.

Есть ли очевидная ошибка кодирования, которая может вызвать такое поведение?

Что такое хороший способ отладки этого типа ошибки?

+1

В большинстве случаев это не должно быть причиной ошибки по записи. Согласно вашему тестированию, эта проблема возникает только в одной машине. Какова конфигурация машины? – ANjaNA

+0

возможно сброс 'glViewport', когда будет активировано приложение A. – tmlen

+1

. Моя ставка - багги/ошибки/неправильные драйверы ... Является ли это Intel или ATI? У Intel большие проблемы с несколькими Opengl Contexts на одно приложение и драйверы карт ATI (AMD) чрезвычайно чувствительны к утечкам памяти в вашем приложении. Для Intel вам не повезло (переключитесь на GDI, где вы можете) и для отладки ATI или измените порядок некоторых вызовов gl, которые иногда помогают и, прежде всего, обновляют драйверы ** Добавьте больше информации о том, что ваши приложения делают/используют какую ОС это GL/GLSL, какая версия, совместимость/основной профиль и многое другое ** похоже на http://stackoverflow.com/q/19099162/2521214, но у меня нет ответов и комментариев :( – Spektre

ответ

3

Существует ряд аспектов, которые могут повлиять на повторное поведение в Windows. Учитывая некоторые детали в этом вопросе, я предлагаю первую проверку основы:

  • Прежде всего, на Windows, вам нужно создать окно контекста OpenGL с этими флагами: WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN

  • В ответ на WM_ACTIVATE, вы должны позвонить wglMakeCurrent().

  • В ответ на WM_SIZE вы должны позвонить по номеру glViewport().

Поведение, безусловно, будет зависеть от оборудования, версии Windows и версии драйвера. Все комбинации будут иметь свои собственные причуды.

проблема уходит после минимизации и повторного максимизации окна «A»

Это вынуждает перерисовку и изменения размера, поэтому не сужает проблему очень много. Для отладки вы можете использовать WM_CHAR для получения событий на клавиатуре и использовать горячую клавишу для принудительной перерисовки (без использования всего потока сообщений). Это скажет вам, является ли это проблемой активации.

... все рендеринг OpenGL ограничен областью «A», которая была покрыта «B».

Если рендеринг уменьшен до перекрываемой области, то видимость, вероятно, перепуталась, например, установив окно просмотра на грязный прямоугольник во время перерисовки.

Если масштабирование верное, но вы видите только угол перерисовываемого окна, поведение, которое вы видите, является окклюзирующим окном, которое сохраняет буфер резервной копии окна позади, который копирует только сохраненные биты, когда он восстанавливается , Это, очевидно, недостаточно для вашей перекрашивающей логики, и флаги клипов влияют на это поведение.

Другая возможность заключается в том, что активный контекст GL (из которого существует только один поток) не переключается на вновь активированное окно до того, как событие перерисовки будет обработано. Эта обработка активирует обработку выше.

Что касается стратегий отладки, я бы поместил некоторые printf s в обработчики событий (или использовал MessageSpy), чтобы вы могли видеть порядок событий. Тот факт, что это только конкретная комбинация аппаратного и программного обеспечения, означает, что вы можете полагаться на поведение по умолчанию, которое немного отличается между версиями. Более подробная информация, которую вы можете предоставить, поможет сузить ее дальше.

Смежные вопросы