Как вы уже обнаружили, вы должны рисовать прозрачные объекты сзади вперед.
При рисовании прозрачного объекта объект рисуется и смешивается с пикселями, которые находятся за ним.
Так происходит, когда вы рисуете сзади-вперед:
Вы рисуете красное изображение, оно смешивается с белым фоном.Вы можете сказать по «розовому» вместо чистого красного цвета, что он смешивается с белым фоном.Затем вы рисуете зеленое изображение, оно смешивается с уже нарисованным белым фоном и красным изображением.Наконец, вы рисуете синее изображение, которое смешивается с уже нарисованными объектами.
Но теперь мы рисуем спереди назад:
Сначала мы рисуем красную плоскость.Он смешивается с белым фоном, который вы видите, потому что он розовый, а не красный.Теперь мы рисуем зеленую плоскость.Он смешан с белым фоном, можно судить по цвету, он не чистый, глубокий, зеленый.Но средство визуализации видит, что часть отстает от красной плоскости, поэтому она не рисует эту часть.Но вы думаете: красная плоскость прозрачна, рендер должен рисовать за этой красной плоскостью!Нет, рендерер отслеживает только глубину / z-порядок пикселей в z-буфере / глубине-буфере, он не знает, прозрачен ли этот пиксель или нет.То же самое относится и к синей плоскости, рисуется только та часть, которая не закрыта другими объектами.
О каком буфере глубины вы говорите?
В буфере глубины глубина каждого пикселяхранится.Когда вы рисуете пиксель в 2,2 с азимутом 1, буфер глубины в 2,2 обновляется значением 1. Теперь, когда вы рисуете линию от 1,2 до 3,2 с азимутом 3, рендерербудет рисовать только те пиксели, где буфер глубины имеет значение> = 3. Таким образом, пиксель 1,2 рисуется (а буфер глубины в 1,2 устанавливается на 3).Пиксель 2,2 не прорисован, поскольку буфер глубины указывает, что этот пиксель уже прорисован с меньшей глубиной (1 против 3).Пиксель 3,2 рисуется, а буфер глубины на 3,2 устанавливается на 3.
Таким образом, буфер глубины используется для отслеживания z-порядка каждого пикселя, чтобы предотвратить перезапись этого пикселя пикселем, которыйнаходится дальше.
Если вы хотите правильно нарисовать прозрачные объекты, см. этот ответ .
Выдержка из этого ответа:
- Первое рисование непрозрачных объектов.
- Отключение записи в буфер глубины (поэтому буфер глубины не обновляется), но сохранение глубиныпроверка буфера включена.
- Рисование прозрачных объектов.Поскольку буфер глубины не обновляется, у вас нет проблемы с прозрачными объектами, скрывающими друг друга.Поскольку проверка буфера глубины включена, вы не рисуете за непрозрачными объектами.
Я не знаю, поддерживает ли FireMonkey отключение записи в буфер глубины, вы должны выяснить сами.