Добавление кратеров XNA (через GPU) с эффектом «Burn»

11

Сейчас я работаю на «Worms» клон 2D в XNA, и одна из особенностей является «деформируемый» местности (например, когда ракета попадает в местности, происходит взрыв, и кусок из местности исчезает).

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

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

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

Эффект ожога

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

Benixo
источник
Это может помочь: gamedev.stackexchange.com/q/6721/1163
Адам Харт

Ответы:

7

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

Когда взрыв сделан, нарисуйте круг на текстуре Повреждения, который имеет слегка прозрачный край. Это будет область "ожога".

Всякий раз, когда вы рисуете ландшафт, задайте для GPU обе текстуры, и ваш шейдер умножит цвет (.rgb) фоновых пикселей на 1 - альфа-значение текстуры повреждения. Избавьтесь от полностью черных пикселей (альфа их до 0, или вы можете умножить это также на альфа (.rgba вместо .rgb) в зависимости от того, хотите ли вы полупрозрачные выжженные области) и вуаля!

Я сомневаюсь, что это лучшее решение, но оно довольно похоже на то, что вы делали раньше, что может облегчить перенос. Вы могли бы также избежать передачи массива Vector3 (x, y, radius) и выполнить некоторые математические операции в шейдере, основываясь на этих точках взрыва, но я не уверен в их эффективности.

Надеюсь это поможет!

Лунин
источник
Спасибо! Это хороший способ сделать это тоже, и похоже на то , что я делаю сейчас, как вы сказали. Я ничего не знаю о HLSL , но я буду обязательно смотреть в него. Еще один способ, который мне сказали, что я могу сделать, - это затемнить его, когда я подойду к краю кратера, но я тоже попробую.
Benixo