ASCIIアートで3Dゲームをレンダリングするにはどうすればよいですか?


19

Unity3Dで3Dゲームのイースターエッグを作成しようとしています。ゲームを一時的にASCIIアートでレンダリングしたい。

私の最初のアイデアは、それを行うためのシェーダーを作成することですが、それが正しい方法かどうかはわかりません。


libAAまたはlibCACA(とリンク1 - リンク2 RESP。)
v.oddou

回答:


20

プラグアンドプレイソリューションについては知りませんが、ここではピクセルシェーダーで機能するアルゴリズムを追加のアセットとしてテクスチャのみで使用します。

必要なアセットは、いくつかのタイルが1列に並んだ小さなテクスチャです。左端が最も暗く、右端が最も明るくなります。

次に何が起こるかです(フレームごと):

  • 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、S

更新:gamedevのチャットルームで@LokkijはUnityのため、より完全なチュートリアルを掲載: http://pentahelix.github.io/ASCII-Tutorial-Revisited/


うまく機能するシンプルなソリューション(+1)。今、私はこの効果を自分で実装することを考えています。
ポールマンタ14年

2
@Sata「[これは]目が機能しない」というケビンのコメントを参照して、色付きの画像をグレースケールに変換する複数の方法について説明します。johndcook.com
Paulマンタ14年

1
これを拡張して、エッジ検出などの追加のパラメーターを追加し、密度/輝度に加えて形状に基づいて文字を選択できます。
DMGregory

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.