Почему мы должны очищать буфер глубины в OpenGL во время рендеринга?

Я пытался запустить код OpenGL, в glClear() не был очищен GL_DEPTH_BUFFER_BIT, из-за чего я не мог отобразить свою сцену. Я добавил этот бит, и сцена была визуализирована. Почему необходимо использовать этот чистый бит?

Я могу знать причину этого, чтобы очистить значения буферов глубины, которые ранее использовались графическим процессором, но я просто хочу подтвердить.


person 2am    schedule 19.10.2013    source источник


Ответы (1)


Буфер глубины содержит «глубину» пикселя в сцене. Когда OpenGL визуализирует вашу геометрию, каждый фрагмент (пиксель) сравнивается со значением буфера глубины в этой точке. Если этот фрагмент имеет значение z ниже, чем значение в буфере, оно становится новым самым низким значением и, следовательно, пикселем для визуализации. Если нет, не визуализируйте его — есть что-то близкое, что его блокирует. В этом суть — вы можете сами прочитать подробности.

Теперь, что происходит, когда сцена меняется? Вы хотите очистить экран, чтобы перерисовать все, но вы также хотите очистить буфер глубины. Почему? Потому что иначе все новые пиксели будут сравниваться со значениями глубины из предыдущего кадра. Это не имеет смысла — их нужно сравнивать с теми, в кадре, в котором они находятся! Вы правы в своих рассуждениях.

person GraphicsMuncher    schedule 19.10.2013
comment
Вы также можете чередовать диапазон глубины и направление проверки глубины для каждого кадра. Но оказывается, что очистка буфера глубины также является оптимизацией производительности на современном оборудовании — они реализуют сжатие без потерь Z-буфера (и цветового буфера) путем разбиения фреймбуфера на плитки, при очистке графическому процессору требуется только чтение/запись нескольких бит в секунду. -tile при выборке значений для областей экрана, в которых ничего нет. Таким образом, старый хак, который люди использовали, чтобы избежать очистки буфера цвета и буфера глубины, на самом деле снижает производительность на современных графических процессорах;) - person Andon M. Coleman; 20.10.2013
comment
Именно в этом я и думал причина :) Идеальный ответ. - person 2am; 20.10.2013