Требуемым активом является небольшая текстура с одним рядом из некоторого количества плиток, где самый левый самый темный, а самый правый самый светлый.
Что происходит тогда (за кадр):
Возьмите буфер, для которого вы хотите сделать 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с
Простое решение, которое может работать довольно хорошо (+1). Сейчас я думаю о реализации этого эффекта самостоятельно.
Пол Манта
2
@Sata В отношении комментария Кевина, что «[это] не совсем так, как работают глаза», вот описание нескольких способов конвертировать цветное изображение в оттенки серого: johndcook.com/blog/2009/08/24/…
Пол Манта
1
Вы можете расширить это, чтобы включить дополнительные параметры, такие как определение края, чтобы выбрать символы на основе их формы в дополнение к плотности / яркости.
Ответы:
Я не знаю ни одного решения «подключи и работай» для него, но вот алгоритм, который работает в пиксельном шейдере с использованием только текстуры в качестве дополнительных ресурсов .
Требуемым активом является небольшая текстура с одним рядом из некоторого количества плиток, где самый левый самый темный, а самый правый самый светлый.
Что происходит тогда (за кадр):
(col.r+col.g+col.b) / 3.0
вероятно, достаточно, хотя это не совсем так, как работают глаза)floor(grayscale * TILE_COUNT)
)vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )
Связанная страница содержит несколько изображений примеров, одна вещь , которую я бы рассмотреть вопрос о добавлении будет небольшим немного шума к вычисленному значению градации серого , так что это не один большой блок
MMMMMMMMMMMMMMMM
сОбновлено: @Lokkij в чате для разработчиков игр опубликовал более полное руководство для Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/
источник