ASCII 아트로 3D 게임을 렌더링하려면 어떻게합니까?


19

Unity3D에서 3D 게임용 이스터 에그를 만들려고합니다. ASCII 아트로 게임을 잠깐 렌더링하고 싶습니다.

첫 번째 아이디어는이를 수행 할 셰이더를 만드는 것이지만 그것이 올바른 방법인지 확실하지 않습니다.


libAA 또는 libCACA 사용 ( link1 - link2 resp.)
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

업데이트 : gamedev chatroom의 @Lokkij는 Unity에 대한 더 완벽한 자습서를 게시했습니다. http://pentahelix.github.io/ASCII-Tutorial-Revisited/


잘 작동 할 수있는 간단한 솔루션 (+1). 이제이 효과를 직접 구현할 생각입니다.
Paul Manta

2
@Sata "[이것은 눈이 잘 작동하지 않습니다"라는 Kevin의 의견을 참조하여, 컬러 이미지를 그레이 스케일로 변환하는 여러 가지 방법에 대한 설명이 있습니다. johndcook.com/blog/2009/08/24/…
Paul Manta

1
이 기능을 확장하여 가장자리 감지와 같은 추가 매개 변수를 포함하여 밀도 / 밝기 외에도 모양에 따라 문자를 선택할 수 있습니다.
DMGregory

또한 XNA에서 비슷한 작업을 수행 하는 기사 가있었습니다 .
XNargaHuntress
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.