2010-11-06 5 views
5

Я пишу программу OpenGL, которая втягивается в вспомогательный буфер, тогда содержимое вспомогательного буфера накапливается в буфере накапливания до того, как GL_RETURN-ed в буфер Back (по существу, для компоновки на экране). Короче говоря, я делаю вид размытия движения. Как ни странно, когда я перекомпилирую и перезагружаю свою программу, я видел содержимое буфера вспомогательной/накопительной памяти из предыдущих программ. Это не имеет смысла. Я что-то не понимаю, не должно ли состояние OpenGL полностью перезагружаться при перезагрузке программы?Как можно сохранить состояние буферов OpenGL между прогонами программы?

Я пишу программу SDL/OpenGL в Gentoo Linux драйверов NVIDIA 195.36.31 на GeForce Go 6150.

ответ

10

Нет - нет никаких оснований для вашего GPU, чтобы когда-либо ясной памяти. Вы должны очистить (или инициализировать) свои текстуры перед их использованием.

+0

Спасибо, по крайней мере теперь я знаю, что это не неожиданное поведение, хотя это просто жутко ... –

+1

Согласен. Хотите добавить: при некоторых условиях видеодрайверы запрашивают нулевую инициализацию выделенной памяти из-за соображений «безопасности» (злая программа может захотеть узнать, что рисуют другие). Это смешно (я бы сказал, что это должна быть ответственность за ту программу, которая хочет скрыть свой промежуточный результат), но так обстоит дело. – valdo

+1

Я сделал много Direct3D через эпоху DirectX9. Когда я начну, фреймбуферы, поверхности и т. Д. Неизменно будут неинициализированы, а код может легко отобразить содержимое предыдущего прогона. В какой-то момент Microsoft или поставщики драйверов должны были решить «исправить» это, и вместо этого вы получите пустые буферы. Я считаю, что это было сделано во имя безопасности. Я бы сказал, что проблемы безопасности действительны; мы не потерпим систему, которая передавала пользовательские процессы. ОЗУ, содержащую нерасчищенные обломки других пользователей, и ОЗУ фреймбуфера не следует рассматривать по-разному. – timday

5

На самом деле, Состояние OpenGL инициализировано на определенные значения.

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

Дело в том, что фреймбуфер (или данные текстуры или буферы вершин или что-то еще) НЕ является частью того, что называется «состоянием GL». Состояние GL существует в вашем драйвере. То, что хранится в памяти GPU, совершенно другое, и оно не инициализируется, пока вы не попросите водителя (через вызовы GL) инициализировать его. Таким образом, вполне возможно иметь остатки предыдущего запуска в текстурной памяти или даже в самом буфере кадров, если вы не очистите или не инициализируете его при запуске.

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