如何用ASCII艺术效果渲染3D游戏?


19

我正在尝试为Unity3D中的3D游戏创建复活节彩蛋。我想用ASCII艺术暂时渲染我的游戏。

我的第一个想法是创建一个着色器来执行此操作,但是我不确定这是否正确。


使用libAA或libCACA(分别为link1 - link2
v.oddou

Answers:


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 )

链接的页面上有几张示例图像,我想考虑的一件事是所计算出的灰度值会有一点点噪点,因此它不是MMMMMMMMMMMMMMMMs的一大块

更新:gamedev聊天室中的@Lokkij为Unity发布了更完整的教程:http://pentahelix.github.io/ASCII-Tutorial-Revisited/


简单的解决方案可能效果很好(+1)。现在,我正在考虑自己实现这种效果。
保罗·曼塔

2
@Sata在谈到凯文的意见,即“[这]是倒不怎么眼睛的工作”,这里有多种方式来转换彩色图像为灰度描述:johndcook.com/blog/2009/08/24/...
保罗蝠ta

1
您可以对此进行扩展,以包括诸如边缘检测之类的其他参数,以根据字符的形状来选择字符(除了密度/亮度之外)。
DMGregory

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.