XNA Добавление кратеров (через GPU) с эффектом «Burn» - PullRequest
5 голосов
/ 07 апреля 2011

В настоящее время я работаю над 2D-клоном "Worms" в XNA, и одной из функций является "деформируемая" местность (например, когда ракета попадает в местность, происходит взрыв, и часть местности исчезает).

Как я в настоящее время делаю это, используя текстуру, у которой постепенно увеличивается значение красного при приближении к центру.Я перебираю каждый пиксель этой текстуры «Деформировать», и если текущий пиксель перекрывает пиксель ландшафта и имеет достаточно высокое значение красного, я изменяю массив цветов, представляющий рельеф, на прозрачный.Если текущий пиксель НЕ имеет достаточно высокого значения красного, я делаю цвет рельефа черным (он тем темнее, чем ближе значение красного к порогу).В конце этой операции я использую SetData для обновления текстуры местности.

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

Вот как выглядит эффект прожига прямо сейчас:

Эффект прожига http://i52.tinypic.com/2h6f2nt.png

У кого-нибудь есть идея, как создать подобный эффект ожога (затемнение краев вокруг образовавшегося кратера)?Я совершенно незнаком с шейдерами, но если это потребуется, я был бы очень благодарен, если бы кто-то рассказал мне, как это сделать.Если есть и другие способы, это тоже было бы здорово.

1 Ответ

8 голосов
/ 07 апреля 2011

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

Например:
Предположим, ваш ландшафт сохраненв гигантскую текстуру в альфа-канале текстуры.1 - местность, 0 - ничто.

Взрыв происходит, и местность должна быть деформирована.Обновите свою текстуру легко, просто нарисовав черную прозрачную сферу (или область взрыва) на вашей текстуре.Местность исчезла, потому что значение альфа равно 0 черной сферы.Ваша текстура сейчас обновлена, все было сделано spriteBatch.И ничего не нужно было проверять.

Не знаю, хотели ли вы тоже решение для этого, но теперь у вас есть одно.

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

  1. Первый вариант - это обнаружение края.Проверьте несколько пикселей во всех 4 направлениях и посмотрите, находится ли пиксель по краю.Если это так, он должен выполнить прожиг, например, умножив его на расстояние до края (или любую другую понравившуюся вам функцию)
  2. Другой способ очень похож на первый, но делает это вдва шага.Сначала вы делаете то же самое определение края, но сохраняете края в отдельной текстуре.Теперь, когда вы рисуете свою текстуру, вы можете наложить свои края.Так что это почти то же самое, что просто рисовать землю сразу.

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

Я знаю, что это длинная история, но это хорошая техника.Посмотрите на шейдеры Toon, они также распознают края, даже если это 3D.

Ключевые слова: шейдинг Toon, HLSL, пост-эффекты, обнаружение краев, обработка изображений.
Рекомендуемое чтение: http://rbwhitaker.wikidot.com/xna-tutorials

...