-
Giới thiệu
- Trong đồ họa game, việc vẽ đường viền thường được sử dụng vì lý do thẩm mỹ hoặc để hỗ trợ gameplay. Ví dụ, trong trò chơi Sable, đường viền được dùng để tạo phong cách truyện tranh, còn trong The Last of Us, nó được dùng để làm nổi bật kẻ địch.
-
Hiệu ứng rim
-
Kỹ thuật
- Có thể render đường viền ở mép đối tượng bằng hiệu ứng Fresnel, vì hiệu ứng này mạnh hơn gần ranh giới của đối tượng.
-
Triển khai
- Sử dụng shader tùy chỉnh triển khai hiệu ứng Fresnel để render đường viền trên đối tượng. Kỹ thuật này phù hợp với các vật thể trơn như cầu hoặc capsule, nhưng không phù hợp với vật thể sắc nhọn như khối lập phương.
-
Phóng đỉnh (vertex extrusion)
-
Kỹ thuật
- Tạo đường viền bằng cách dùng bản sao của đối tượng gốc. Mở rộng đỉnh của bản sao để nó lớn hơn đối tượng gốc.
-
Hướng phóng
- Chọn hướng di chuyển đỉnh để điều chỉnh kích thước đối tượng. Di chuyển đỉnh trong không gian đối tượng để tạo đường viền.
-
Không gian phóng
- Có hai cách: di chuyển đỉnh trong không gian đối tượng và di chuyển trong không gian clip. Di chuyển trong không gian clip cho ra đường viền đồng đều.
-
Masking
- Loại bỏ mặt trước của mesh đã sao chép để chỉ hiển thị đường viền.
-
Bộ đệm làm mờ
-
Kỹ thuật
- Render silhouette của đối tượng vào buffer rồi làm mờ để tạo đường viền.
-
Bộ đệm silhouette
- Render đối tượng bằng một màu đơn để tạo bộ đệm silhouette.
-
Pass làm mờ
- Dùng pass blur để mở rộng silhouette buffer. Dùng box blur hoặc Gaussian blur để cải thiện hiệu năng.
-
Pass đường viền
- Kết hợp silhouette đã blur với cảnh gốc để tạo đường viền.
-
Thuật toán Jump Flood
- Sử dụng thuật toán Jump Flood để render đường viền. Có thể render đường viền rộng với chi phí hiệu năng thấp.
-
Phát hiện cạnh
-
Kỹ thuật
- Dùng full-screen pass để phát hiện discontinuity trong cảnh và render đường viền.
-
Phát hiện discontinuity
- Dùng toán tử Roberts cross hoặc Sobel để phát hiện discontinuity.
-
Nguồn gốc discontinuity
- Phát hiện discontinuity từ texture độ sâu, normal và màu để tạo đường viền.
-
Điều chỉnh phát hiện cạnh
- Điều chỉnh ngưỡng được dùng để phát hiện discontinuity để loại bỏ artefact.
-
Nguồn gốc discontinuity tùy chỉnh
- Cung cấp nguồn gốc discontinuity tùy chỉnh để kiểm soát đường viền.
-
Kết luận
- Có năm cách vẽ đường viền, mỗi cách đều mang lại sự đánh đổi giữa hiệu năng, độ chân thực trực quan và mức độ hiệu chỉnh thủ công.
1 bình luận
Ý kiến Hacker News
Tôi thấy bài viết về Jump Flood Algorithm thật thú vị. Thật vui khi được nghĩ về các cách tiếp cận khác nhau ở cấp độ pixel.
Đề xuất phương pháp lấy biên bằng cách render mô hình thành màu phẳng rồi phát hiện biên; cần một pass render bổ sung.
Tôi quan tâm đến dự án R&D về đồ họa 3D phong cách hóa. Còn nhiều câu hỏi vẫn chưa được giải đáp.
Trong game Astral Divide tôi đã phát triển kỹ thuật tương tự blur buffer, sử dụng anti-aliasing để tạo biên; hiệu năng thấp và triển khai rất đơn giản.
Có đam mê kỹ thuật số và chờ đợi Godot cải thiện pipeline compute shader. Cấu hình plugin compositor hiện tại có phần phức tạp.
Tôi tò mò không biết sau tranh cãi về giá của Unity liệu có nhiều nhà phát triển chuyển sang Unreal và Godot không.
Tôi đã chuyển từ phát triển ứng dụng VR sang phát triển web, nhưng vẫn nhớ cảm giác đầy mê hoặc của công việc đồ họa 3D, va chạm, shader.
Kết quả render phát hiện biên rất ấn tượng; trông giống một cảnh trong truyện tranh Franka của Hà Lan.
Tôi đã tìm thấy một ghi chú hay về phương pháp phát hiện biên do nhà phát triển của Mars First Logistics đề xuất.
Đề xuất một kỹ thuật đơn giản để vẽ viền