XNA Додавання кратерів (через GPU) з ефектом "Burn"


11

Зараз я працюю над 2D клоном "Черв'яки" в XNA, і однією з особливостей є "деформується" місцевість (наприклад, коли ракета потрапляє на місцевість, відбувається вибух і шматок місцевості зникає).

Я зараз це роблю, використовуючи текстуру, яка має прогресивно вище значення червоного кольору, коли вона наближається до центру. Я перебираю кожен піксель тієї текстури "Деформування", і якщо поточний піксель перекриває піксель місцевості та має досить високе червоне значення, я змінюю кольоровий масив, що представляє місцевість, на прозорий. Якщо поточний піксель НЕ має достатньо високого значення Червоного кольору, я чорніє кольором місцевості (він стає чорнішим, чим ближче значення Червоного до порога). В кінці цієї операції я використовую SetData для оновлення текстури рельєфу.

Я усвідомлюю, що це не гарний спосіб зробити це не лише тому, що я читав про стояки трубопроводів і подібні, але й тому, що він може стати досить млявим, якщо одночасно додавати багато кратерів. Я хочу переробити своє Crater Generation на GPU, замість цього використовувати цілі Render "ping-ponging" між ціллю та текстурою для зміни. Це не проблема, я знаю, як це зробити. проблема полягає в тому, що я не знаю, як зберегти ефект опіку за допомогою цього методу.

Ось як виглядає ефект опіку прямо зараз:

Ефект опіку

Хтось має уявлення, як я створив би подібний ефект опіку (затемнення країв навколо утвореного кратера)? Я абсолютно не знайомий із Шейдерами, але якщо цього вимагає, я був би дуже вдячний, якби хтось провів мене, як це зробити. Якщо є якісь інші способи, це теж було б чудово.


Це може допомогти: gamedev.stackexchange.com/q/6721/1163
Адам Харте

Відповіді:


7

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

Коли буде зроблено вибух, намалюйте коло на текстурі «Пошкодження», яка має трохи прозорий край. Це буде область «опіку».

Щоразу, коли ви малюєте місцевість, надайте GPU обидві текстури, і ваш шейдер помножить колір (.rgb) фонових пікселів на 1 - альфа-значення текстури пошкодження. Позбавтеся від повністю чорних пікселів (альфа їх до 0, або ви можете помножити це на альфа (.

Я сумніваюся, що це найкраще рішення, але воно досить схоже на те, що ви робили раніше, і це може полегшити передачу. Можливо, ви могли б також уникнути проходження масиву Vector3 (x, y, радіус) та проведення деякої математики в шейдері на основі цих точок вибуху, але я не впевнений у ефективності таких.

Сподіваюся, це допомагає!


Дякую! Це теж класний спосіб зробити це, і схожий на те, що я зараз роблю, як ви сказали. Я нічого не знаю про HLSL, але я обов'язково вивчу це. Ще один спосіб мені сказали, що я можу зробити, це потемніти його, коли я наближаюся до краю кратера, але я спробую і так.
Беніксо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.