Как мне отрендерить мою 3D игру в искусстве ASCII?


19

Я пытаюсь создать пасхальное яйцо для 3D-игры в Unity3D. Я хочу сделать свою игру на мгновение в искусстве ASCII.

Моя первая идея - создать для этого шейдер, но я не уверен, что это правильный путь.


с libAA или libCACA ( ссылка 1 - ссылка 2 соотв.)
v.oddou

Ответы:


20

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

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

Что происходит тогда (за кадр):

  • Возьмите буфер, для которого вы хотите сделать ASCII-версию, и уменьшите его до размера плитки (поэтому, если у вас есть плитки 8x8, изображение будет уменьшено до 8 в обоих измерениях).
  • Создайте новую цель рендеринга исходного полноразмерного буфера.
  • Используйте пиксельный шейдер со следующим:
    • Вход сэмплера для буфера (с выборкой, установленной на ближайший сосед), и вход сэмплера для тайлов.
    • Униформа для размера плитки, количества плиток и конечного разрешения на выходе
  • Затем пиксельный шейдер должен:
    • Получить значение серой шкалы из буфера уменьшенного масштаба ( (col.r+col.g+col.b) / 3.0вероятно, достаточно, хотя это не совсем так, как работают глаза)
    • Используйте эту информацию, чтобы узнать, с какой плитки вы хотите рендерить ( floor(grayscale * TILE_COUNT))
    • Вычислите пиксельные координаты X / Y выходных данных и возьмите с этих модулей размер плитки (tileX / tileY).
    • Возвратите в качестве цвета значение, сэмплированное из буфера тайлов в vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

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

Обновлено: @Lokkij в чате для разработчиков игр опубликовал более полное руководство для Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/


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

2
@Sata В отношении комментария Кевина, что «[это] не совсем так, как работают глаза», вот описание нескольких способов конвертировать цветное изображение в оттенки серого: johndcook.com/blog/2009/08/24/…
Пол Манта

1
Вы можете расширить это, чтобы включить дополнительные параметры, такие как определение края, чтобы выбрать символы на основе их формы в дополнение к плотности / яркости.
DMGregory

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.