Вчера вечером, я и мои товарищи по работе столкнулись с проблемой:
Используя Visual Studio 2015 — делаем юнит-тест, как описано здесь https://msdn.microsoft.com/en-us/library/hh598953.aspx
Наш проект, использующий OpenGL (freeglut, etc.), не работает нормально.
Но процедура , которая должна запускать отрисовку в окне не запускается, почему — неизвестно.
glutSetWindow(m_hWindow);
glutPostRedisplay(); // команда на отрисовку
glutMainLoopEvent(); // пройти один цикл обработки glut сообщений
Сам OpenGL не вызывает зарегистрированной call-back функции:
glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!
Всё работает в одном thread-е (многопточность блокирована).
OS Windows-7 / 64 (+SP1).
В обычном консольном проекте, также как и в MFC/Qt приложении всё работает нормально.
Проект опробован — на MFC приложении: там всё работает, как швейцарские часы
Заранее благодарны за любые мысли!
Возможно, есть какие-либо настройки и опции для Visual Studio 2015 юнит-тест подсистемы?
Здравствуйте, AlexGin, Вы писали:
AG>Сам OpenGL не вызывает зарегистрированной call-back функции: AG>
AG> glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!
AG>
предположу, что что-то не проинициализировали в коде теста
можете дать минимальный код теста, чтобы погонять у себя? пусть рисуется что угодно, хоть черный квадрат
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, AlexGin, Вы писали:
AG>>Сам OpenGL не вызывает зарегистрированной call-back функции: AG>>
AG>> glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!
AG>>
U>предположу, что что-то не проинициализировали в коде теста
Предположение — ошибочно, так как точно такой же код, только в виде command-line Win32 application — нормально работает.
U>можете дать минимальный код теста, чтобы погонять у себя? пусть рисуется что угодно, хоть черный квадрат
Это довольно большие и закрученные куски кода. Вытаскивать что-то минимальное непросто
Тем не менее, спасибо, уважаемый uzhas, за желание помочь!
Нет, делать весь glut "вручную" — ИМХО не самое правильное решение
P.S. Удалось пофиксить данную проблему
Ларчик просто открывался:
Раскоментировали вызов функции glutShowWindow() — показать окно,
в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.
Здравствуйте, AlexGin, Вы писали: AG>в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.
Логично, потому что тесты почти всегда не визуальны.
Здравствуйте, AlexGin, Вы писали:
AG>Ларчик просто открывался: AG>Раскоментировали вызов функции glutShowWindow() — показать окно, AG>в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.
Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется.
Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
VTT>Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется. VTT>Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.
Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат.
Здравствуйте, turbocode, Вы писали:
VTT>>Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется. VTT>>Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.
T>Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат.
А насколько это возможно для OpenGL?
T>>Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат. AG>А насколько это возможно для OpenGL?
glReadPixels (еще лучше Pixel Buffer Objects[PBO], если версия OpenGL позволяет) на бэкбуффер, как то так.