Вырезать отверстия в Texture2D - PullRequest
       15

Вырезать отверстия в Texture2D

1 голос
/ 13 февраля 2012

Я хочу знать, как удалить часть текстуры из Texture2D.У меня есть простая игра, в которой я хочу взорвать планету по частям, когда пуля попадает в нее и «вонзается» в планету.

Физика уже работает, но я застрял на том, как правильно вырезать текстуру.

Мне нужно создать функцию, которая принимает Texture2D позицию и радиус в качестве входных данных и возвращает новый Texture2D.

Вот пример Texture2D до и после того, что я хочу выполнить,http://img513.imageshack.us/img513/6749/redplanet512examplesmal.png

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

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

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

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

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

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

Я нашел примеры MSDN с рабочим исходным кодом для XNA 4, который делает это (пример кошки):

http://create.msdn.com/en-US/education/catalog/sample/sprite_effects

РЕДАКТИРОВАТЬ: Я получил это работать довольно хорошо.Здесь создан небольшой учебник с исходным кодом: http://syntaxwarriors.com/2012/xna-alpha-mapping-with-pixel-shaders/

0 голосов
/ 14 февраля 2012

посмотрите на мой класс здесь: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

1. Просто создайте объект класса Sprite для вашей планетыSprite PlanetSprite = новый Sprite (PlanetTexture2D, новый Vector2 (// yourPlanet.X, //yourPlanet.Y));

2. когда пуля попадает в планету, сделайте круг texure2d в центре точки столкновенияиспользуя метод "GetCollisionPoint (Sprite b)"

- вы можете получить Circle.png с прозрачными углами-или вы можете создать круг с помощью математики (что лучше, если вы хотите иметь пули)

3. затем создайте объект Sprite вашего круга

4. теперь используйте «GetCollisionArea (Sprite b)», чтобы получить перекрывающуюся область

5. теперь используйте«ChangeBatchPixelColor (список пикселей, цвет цвета)», где пиксели - это перекрывающаяся область, а цвет - Color.FromNonPremultiplied (0, 0, 0, 0)

- отметьте, что вам вообще не нужно рисовать свой кругпосле использования вы можете уничтожить его или оставить для дальнейшего использования

0 голосов
/ 13 февраля 2012

Хороший способ сделать это - визуализировать «текстуру дыры», используя alphablend поверх текстуры вашей планеты.Думайте об этом как о рисовании круга невидимости поверх вашей исходной текстуры.Взгляните на эту ветку, чтобы найти несколько хороших ссылок worms-style-destructible-terrain .

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

...