Как избежать расстановки расстояний в крупномасштабной визуализации рекламных щитов с прозрачностью - PullRequest
2 голосов
/ 30 сентября 2019

Настройка сцены:

Я рисую карту высот (огромную непрозрачную поверхность) с большим количеством рекламных щитов (обычно травы, цветов и т. Д.).

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

Код псевдопередачи выглядит так:

map->render();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
wildGrass->render();
glDisable(GL_BLEND);

Когда инструкция рендеринга wildGrass отображает несколько рекламных щитов в разных местах за один вызов OGL.

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

Вот сбой:

  • Слева - явный фрагментный шейдер, который полностью сбрасываетсяпрозрачные пиксели
  • справа без сброса, четко показывает плоский квадрат рекламного щита

enter image description here

Основано на моем понимании OGLсмешивание и некоторое чтение, кажется, что решение состоит в том, чтобы иметь контролируемый порядок рендеринга, начиная с самых удаленных объектов до ближайшего, так что в конце цветовой буфер будет правильно заполнен.

Я отчаянно нуждаюсьнадеясь, что есть другой способ ... Порядок здесь, как правило, варьируется в зависимости от точки зрения, что означает, что он должен применяться в реальном времени для каждого кадра. Кроме того, характер этих рекламных щитов должен быть представлен в очень большом количестве ... Оповещение о производительности!

Есть предложения или мой подход к смешиванию неправильный?

1 Ответ

2 голосов
/ 02 октября 2019

У меня не сработало:

@ предложение httpdigest отключить запись в буфер глубины:

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

Решение:

@ Предложение Rabbid76 использовать непрозрачные текстуры с мультисэмплингом и сглаживанием: я считаю, что это путь к лучшемувизуальный эффект при разумно низких затратах на производительность.

Альтернативное решение:

Я нашел промежуточное решение, которое, вероятно, является самым дешевым по производительности за счет качества. Я по-прежнему использую текстуры с градиентными прозрачными краями, но вместо отбрасывания полностью прозрачных пикселей я ввел степень допуска, например, любой пиксель с альфа <0,6 отбрасывается - это значение найдено экспериментально, чтобы найти правильный баланс. </p>

При таком подходе:

  • Я по-прежнему выполняю тесты глубины, поэтому выходные данные правильные
  • Качество текстур ухудшается / выглядит менее гладким - но вполне разумно
  • глюки на полупрозрачных пикселях все еще появляются - но почти не заметны
  • См. снимок ниже

Итак, сделаем вывод:

  • Мое решение - это дешевое и простое приближение, дающее менее плавный визуальный результат
  • Наилучший результат можно получить, переведя все рекламные щиты с разрешением текстуры с несколькими выборками с помощью сглаживания и, наконец, вывести результат в полноэкранном режиме. квад. Вероятно, есть способы сделать это:
    • Либо сначала отображать карту и использовать результирующий буфер глубины при рендеринге рекламных щитов
    • Или отображать и карту, и рекламные щиты на текстуре с несколькими выборками
  • Обратите внимание, что оба вышеупомянутых подхода предназначены для того, чтобы избежать необходимости сортировки на большом расстоянии большого количества рекламных щитов - но это остается допустимым вариантом, и я читал о хранении местоположений рекламных щитов в квадратедерево для быстрого доступа.

enter image description here

...