DirectX Прозрачные текстуры — чтобы растения выглядели хорошо

Недавно я начал изучать программирование DirectX на C ++, у меня есть некоторый опыт графического программирования на других языках, но я новичок в сцене DirectX.

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

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

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

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

Итак, вкратце, какие методы используют «правильные» игры для правильного рисования гладких альфа-текстур (которые имеют диапазон альфа-значений) в трехмерной сцене для таких вещей, как листва.

Спасибо,
Майкл.

2

Решение

Упорядоченная прозрачность достигается в основном с использованием алгоритм художников.

Алгоритм рисования разваливается, когда объект должен быть нарисован как перед, так и позади другого объекта, или когда один объект имеет несколько подкомпонентов, которые являются прозрачными. Мы не можем легко отсортировать подкомпоненты меша относительно друг друга.

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

  1. Визуализация всех непрозрачных объектов, отсортированных по состоянию материала или от начала к концу
    чтобы избежать оверлея.
  2. Визуализируйте все прозрачные объекты, отсортированные спереди назад.

Игры используют различные техники в сочетании, чтобы избежать этой проблемы.

Разбейте модели на неперекрывающиеся прозрачные участки. Часто это делается неявно, потому что прозрачные объекты игры будут часто использовать материалы, отличные от остальной части модели. Вы также можете разделить модели с несколькими слоями прозрачности таким образом, чтобы слои каждой новой модели не перекрывались. Например, вы можете разделить модель сосны радиально на 5 секций.

Это чаще встречалось в конвейерах с фиксированной функцией. Современные игры просто пытаются избежать проблемы.

Избегайте полупрозрачных деталей в моделях. Используйте прозрачность только для краев сглаживания, где прозрачный объект может четко разделить мир на две отдельные группы объектов. (Окна или водные самолеты например). Разделение мира таким образом и рендеринг этих кусков спереди назад позволяют нашим сглаженным краям рисоваться, не вызывая очевидных вырезов на других прозрачных объектах. Сами края выглядят хорошо, даже если они перекрываются, если ваш альфа-тест установлен выше, чем ~ 30%.

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

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

Есть пара простых вариантов, если ваши гладкие края все еще неприемлемы. Вы можете смазывать любые части модели ниже 75% прозрачности. Или вы можете сделать так, чтобы аппаратное обеспечение сделало это за вас без видимых артефактов, используя альфа-покрытие. Это заставляет оборудование мультисэмплинга сглаживать края в перерисованных выборках. Это не даст вам плавного градиента, но 4-16 уровней альфа-канала совершенно приемлемы для краев сглаживания и бесплатны, если вы уже собираетесь использовать MSAA.

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

Перемещение камеры внутрь и из прозрачных объектов всегда проблематично.

Почти невозможно сделать сложный полупрозрачный объект. Как рентгеновское изображение здания или призрака. Многие игры просто отображают этот тип объекта как добавку. Но с современным оборудованием возможно множество более сложных схем.

Более сложные схемы

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

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

OIT до сих пор в основном используется только в особых случаях, таких как игры 2.5D (например, маленькая Большая Планета). Но я считаю, что в конечном итоге он может стать основным инструментом в программировании игр.

0

Другие решения

Других решений пока нет …