Маска на основе трафарета с альфа

Я пытаюсь создать эффект тумана, например civ 5:

введите описание изображения здесь>> </p>

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

<p> <img src =

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

Любые идеи? (Я использую Unity)

3 голоса | спросил tbkn23 6 J0000006Europe/Moscow 2015, 09:29:03

2 ответа


1

Использование только трафарета не поможет вам, если вы хотите плавное выцветание облаков. Stencil (как следует из названия) используется для отклонения пикселей, которые маскируются им.

Когда вы рисуете черно-белый альфа-фрагмент, вы, вероятно, настраиваете трафаретный тест, чтобы, если alpha! = 0, то трафарет проходит, иначе - сбой. Итак, вы получаете то, о чем просили.

Когда вы позже нарисуете свои облака, они будут жестко отрезаны в соответствии с трафаретной маской.

Я не знаю всех подробностей вашего кода, но было бы проще просто рисовать альфа-прозрачные облака только по неизведанным фрагментам, но также умножать их на ваш цветной плит. Таким образом, ваши неизведанные плитки будут иметь исчезающие границы. Недостатком является то, что будут границы замирания также между любыми 2 последовательными неизведанными плитами. Чтобы этого избежать, вы можете иметь несколько типов черно-белых текстур (в зависимости от типа соседних плит), но тогда вам придется выдавать отдельный призыв на рисование для каждого фрагмента (или уникальную конфигурацию, если сортировать их по текстуке b /w ). Я не знаком с Unity, поэтому, к сожалению, не могу сказать, как именно это сделать. Но если у вас есть идея, тогда это должно быть легко.

Более правильным решением было бы создание текстуры расстояния.

ответил alariq 6 J000000Monday15 2015, 21:04:42
0

Что вы можете сделать, так это установить альфа, используя формулу, подобную этой:

If(length(color) != 0)

Alpha = 1 - length(normalize(color));

Else

Alpha = 0
ответил George Hanna 6 J0000006Europe/Moscow 2015, 17:51:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132