- Включите на маску глубины
glDepthMask( GL_TRUE )
- Нарисуйте все непрозрачные объекты в любом порядке
- Отключите маску глубины
glDepthMask( GL_FALSE )
- Включите
BLEND_MODE
- Рисуйте полупрозрачные объекты, отсортированные от дальше всего до ближайших
Почему вы это делаетеthis?
Есть 2 буфера, о которых вам нужно беспокоиться: буфер глубины и буфер цвета .Эти буферы - это просто большие 2-мерные массивы, каждая из которых имеет ширину и высоту экрана.
Цветовой буфер , естественно, будет содержать окончательную окраску каждого пикселя.Существует одна запись в цветовом буфере на пиксель экрана.Буфер глубины похож на буфер цвета в том, что на пиксель экрана приходится одна запись, но он используется для чего-то другого.Записи в буфере глубины представляют собой меру того, «насколько близко» на самом деле находится каждый цветной пиксель.
Если вы визуализируете 1 треугольник, который находится далеко от камеры, он генерирует наборцвета и значения глубины для каждого пикселя, который он «хочет» покрыть на экране.Допустим, вы рендерили другой полигон, который ближе, он также сгенерирует набор значений для буферов глубины и цвета.Теперь существует своего рода «состязание» во время окрашивания пикселей, когда «более удаленные» фрагменты (значения буфера большой глубины) отбрасываются, и сохраняются только самые близкие фрагменты.Более близкие фрагменты заканчивают тем, что окрашивали пиксель, который у вас был.(Когда два многоугольника почти перекрывают друг друга, Z-бой может происходить )
Начните с рендеринга объектов в вашей сцене с маской глубины.Это означает, что для каждой фигуры, которую вы визуализируете, когда ее пиксели окрашиваются, буфер глубины обновляется вместе с «победителем» конкурса.
Затем вы 3) glDepthMask( GL_FALSE )
выключает , выключает буфер глубины для записи, 4) включить смешивание, 5) сделать полупрозрачные фигуры от самых дальних до ближайших.Кажется странным, да?
Когда вы выключаете маску глубины и визуализируете полупрозрачные фигуры, OpenGL по-прежнему читает буфер глубины, чтобы определить, какие фрагменты выбрасывать (например, если ваш полупрозрачный)форма находится за уже отрисованной сплошной формой, тогда вы отбрасываете фрагменты этой полупрозрачной формы).Но он не будет записывать в буфер глубины, поэтому, если полупрозрачная форма действительно очень близка к глазу (скажем, как полупрозрачное ветровое стекло), эти фрагменты ветрового стекла нене допускать рисования других фрагментов, которые на самом деле находятся дальше .Это важно, потому что, если ваше ветровое стекло находится прямо перед вами и вы делаете его прозрачным, и вы позволяете фрагментам ветрового стекла обновлять буфер глубины, тогда вы не увидите ничего в вашей сцене, кроме лобового стекла, дажехотя за этим есть формы, потому что OpenGL будет думать: «Эй, это лобовое стекло - единственное, что должен видеть пользователь, из-за этих показаний буфера глубины, поэтому я не буду беспокоиться о том, чтобы рендерить что-то еще дальше, чем это лобовое стекло».Отключение маски глубины - это способ «обмануть» OpenGL в «не зная», что есть очень близкие, но полупрозрачные фрагменты.