Проблема мерцания OpenGL - PullRequest
4 голосов
/ 21 июля 2010

Я пытаюсь сделать движок с несколькими экземплярами в C ++ с оболочкой для C #.
В сделал движок таким образом, что есть функция типа CreateEngine, которая принимает в качестве параметра дескриптор окна или элемента управленияна котором я хочу инициализировать движок.
В C # я создал пользовательский элемент управления, который инициализирует opengl для рисования и имеет событие рендеринга.
Если я создаю только один экземпляр элемента управления, все работает нормально, но потом, когда ясоздайте другое, помещенное в другое окно, второе мигает черным (чередует чистый цвет экрана с черным, хотя в моем коде нет ссылки на черный).Никто из них ничего не рисует.Вместо этого они просто очищают цвет экрана.Первый элемент управления очищает пространство до синего, а второй - до красного (теоретически).Поскольку рисовать нечего, я не думаю, что мне нужно делиться списками wgl или чем-то другим (я все равно сделал это, но комментирование этой части кода ничего не решит).

Некоторые думают, что заметили: я не совсем OpenGL n00b, но это меня действительно озадачивает.Я также проверил все, что я знаю в этой области.Проблема появляется только тогда, когда больше экземпляров элемента управления.В C # я переписал событие OnPaint, очистив область просмотра, и аннулировал его каждые 33 миллисекунды.Я также переписал OnPaintBackground, так как это, кажется, вызывает проблемы с мерцанием.

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Возможно, вы захотите изучить двойную буферизацию - если у вашей машины много избыточной мощности, вы можете не заметить, что экран очищается и перерисовывается с помощью одного элемента управления, но как только появятся два элемента управления и все накладные расходы на настройку / демонтажтруба рендеринга

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

вот учебник(найдите в Google двойную буферизацию OpenGL, и вы найдете гораздо больше) http://www.swiftless.com/tutorials/opengl/smooth_rotation.html

1 голос
/ 01 августа 2010

Взаимодействие между моделями состояний и событий Winforms и OpenGL может быть очень сложным.Мой совет - следовать структуре некоторого другого кода, который делает это успешно.Хорошим выбором будет реализация SimpleOpenGLControl в Tao Framework.

http://taoframework.svn.sourceforge.net/viewvc/taoframework/trunk/src/Tao.Platform.Windows/SimpleOpenGlControl.cs?revision=158&view=markup

Другой вариант - просто использовать этот класс, а не реализовывать свой собственный элемент управления OpenGL.В любом случае, может быть полезно следующее - оно освещает некоторые проблемы при наличии нескольких элементов управления:

http://slizerboy.wordpress.com/2010/04/14/multiopenglcontrol/

0 голосов
/ 03 августа 2010

OpenTK также имеет хорошие примеры использования c # и OpenGL.

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