Làm cách nào để kết xuất trò chơi 3D của tôi trong nghệ thuật ASCII?


19

Tôi đang cố gắng tạo một quả trứng Phục sinh cho một trò chơi 3D trong Unity3D. Tôi muốn kết xuất trò chơi của mình trong giây lát theo nghệ thuật ASCII.

Ý tưởng đầu tiên của tôi là tạo ra một shader để làm điều đó, nhưng tôi không chắc liệu đó có phải là cách đúng đắn hay không.


với libAA hoặc libCACA ( link1 - link2 resp.)
v.oddou

Câu trả lời:


20

Tôi không biết về bất kỳ giải pháp plug and play nào cho nó, nhưng đây là một thuật toán hoạt động trong trình đổ bóng pixel với chỉ một kết cấu là tài sản bổ sung .

Tài sản cần có là một kết cấu nhỏ với một hàng duy nhất của một số số gạch, trong đó phần bên trái là phần tối nhất và phần bên phải nhẹ nhất.

Điều gì xảy ra sau đó là (trên mỗi khung):

  • Lấy bộ đệm mà bạn muốn tạo phiên bản ASCII và thu nhỏ nó theo kích thước ô (vì vậy nếu bạn có các ô xếp hình 8 x 8, hình ảnh sẽ được thu nhỏ lại 8 ở cả hai chiều).
  • Tạo một mục tiêu kết xuất mới của bộ đệm có kích thước đầy đủ ban đầu.
  • Sử dụng trình đổ bóng pixel với các mục sau:
    • Một đầu vào lấy mẫu cho bộ đệm (với lấy mẫu được đặt thành hàng xóm gần nhất) và đầu vào lấy mẫu cho các ô.
    • Đồng phục cho kích thước gạch, số lượng gạch và độ phân giải đầu ra cuối cùng
  • Sau đó, pixel shader sẽ:
    • Nhận giá trị thang màu xám từ bộ đệm thu nhỏ ( (col.r+col.g+col.b) / 3.0có lẽ là đủ, mặc dù đó không phải là cách mắt hoạt động)
    • Sử dụng thông tin này để lấy ô bạn muốn hiển thị từ ( floor(grayscale * TILE_COUNT))
    • Tính toán tọa độ pixel X / Y của đầu ra và lấy các mô-đun đó kích thước ô (gạchX / gạchY).
    • Trả về màu như giá trị được lấy mẫu từ bộ đệm gạch tại vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

Các trang liên kết có một số hình ảnh ví dụ, có một điều tôi muốn cân nhắc việc thêm sẽ là một chút nhẹ của tiếng ồn với giá trị màu xám tính do đó, nó không phải là một khối lớn của MMMMMMMMMMMMMMMMs

Đã cập nhật: @Lokkij trong phòng chat gamedev đã đăng một hướng dẫn đầy đủ hơn cho Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/


Giải pháp đơn giản có thể hoạt động khá tốt (+1). Bây giờ tôi đang suy nghĩ về việc thực hiện hiệu ứng này bản thân mình.
Paul Manta

2
@Sata Liên quan đến nhận xét của Kevin rằng "[điều này] hoàn toàn không phải là đôi mắt hoạt động như thế nào", đây là một mô tả về nhiều cách để chuyển đổi một hình ảnh màu thành màu xám: johndcook.com/blog/2009/08/24/ Khăn
Paul Manta

1
Bạn có thể mở rộng điều này để bao gồm các tham số bổ sung như phát hiện cạnh, để chọn các ký tự dựa trên hình dạng của chúng ngoài mật độ / độ sáng.
DMGregory

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.