Toon / cel shading với độ rộng dòng thay đổi?


15

Tôi thấy một vài cách tiếp cận rộng rãi để thực hiện cel shading:

  1. Sao chép và mở rộng mô hình với các quy tắc lật (không phải là một tùy chọn cho tôi)
  2. Sobel bộ lọc / shader mảnh tiếp cận để phát hiện cạnh
  3. Cách tiếp cận bộ đệm stear để phát hiện cạnh
  4. Các cách tiếp cận shader hình học (hoặc đỉnh) tính toán các mặt chuẩn và cạnh

Tôi có đúng không khi giả sử cách tiếp cận tập trung vào hình học mang lại khả năng kiểm soát lớn nhất đối với ánh sáng và độ dày đường, ví dụ như. cho địa hình nơi bạn có thể thấy đường bóng của một ngọn đồi hòa nhập dần dần vào một đồng bằng?

Điều gì xảy ra nếu tôi không cần ánh sáng pixel trên bề mặt địa hình của mình? (Và có lẽ tôi sẽ không dự định sử dụng ánh sáng / bóng dựa trên đỉnh hoặc nền văn bản dựa trên tế bào.) Sau đó, tôi sẽ tốt hơn khi gắn bó với cách tiếp cận kiểu hình học, hoặc thay vào đó là cách tiếp cận không gian / phân đoạn màn hình để giữ cho mọi thứ đơn giản hơn? Nếu vậy, làm thế nào tôi có được "mực" của các ngọn đồi trong hình bóng lưới, thay vì chỉ đường viền của toàn bộ lưới (không có chi tiết "mực" bên trong đường viền đó? ( Đường viền gợi ý của AKA , nếp gấp ).

Cuối cùng, có thể mô phỏng một cách rẻ tiền cách tiếp cận quy tắc lật, sử dụng một shader hình học? Mối quan tâm của tôi với điều này là tôi chắc chắn có thể sao chép từng đỉnh đơn lẻ và chia tỷ lệ cho các đỉnh này cho phù hợp, nhưng làm thế nào tôi có thể tiếp cận các quy tắc lật và tô màu khác biệt trong shader mảnh?

Những gì tôi muốn - độ dày đường khác nhau với các đường xâm nhập bên trong hình bóng ...

nhập mô tả hình ảnh ở đây

Những gì tôi không muốn ...

nhập mô tả hình ảnh ở đây


EDIT: Nghiên cứu sâu hơn đã đưa ra ...

Vì tôi có số lượng đỉnh lớn trên địa hình, thậm chí xem xét LoD dựa trên khoảng cách, không phải phương pháp lật thông thường cũng như cách tiếp cận dựa trên shader hình học (ngay cả với việc loại bỏ bực bội) sẽ là một lựa chọn hợp lý do sự phức tạp tính toán tuyệt đối liên quan đến sao chép và nhân rộng tất cả đỉnh tải lên.

Xem xét rằng tôi không cần chiếu sáng theo pixel dưới dạng bóng mờ trên các bề mặt địa hình, nó cũng trở nên ít thận trọng hơn khi xem xét bất kỳ phương pháp tiếp cận dựa trên khuôn mặt thông thường nào - nếu không là yêu cầu về chiếu sáng bề mặt chính xác - vì những điều này Tự nhiên khá đắt để tính toán. Tuy nhiên, đúng là họ cho mức độ kiểm soát tốt nhất; ví dụ: khả năng tô bóng các cạnh bằng cách sử dụng các nét "nghệ thuật": Đẹp, nhưng một lần nữa, không thực sự khả thi đối với môi trường trò chơi phức tạp ồ ạt.

Bộ đệm stear là thứ tôi muốn tránh vì tôi thích làm tất cả các công việc trong shader. (Ví dụ trên với đường viền màu đỏ đã được thực hiện với bộ đệm stpson - trường học cũ.)

Điều này để lại các shader mảnh không gian hình ảnh tiếp cận. Độ phức tạp tính toán được giảm xuống theo số lượng mảnh thay vì số đỉnh (trong trường hợp của tôi, đây là hoạt động ít hơn 10 - 100 lần so với tôi phải làm trong trình tạo bóng hình học). Điều này đòi hỏi nhiều hơn một lần kết xuất để tạo bộ đệm g (bao gồm bộ đệm thông thường và tùy chọn bộ đệm độ sâu) mà chúng ta có thể áp dụng các bộ lọc gián đoạn (ví dụ: toán tử Sobel). Sự gián đoạn sâu là những gì cho phép đường viền gợi ý và nếp gấp. Điều khó hiểu duy nhất của tôi với cách tiếp cận này là không có khả năng cung cấp khả năng kiểm soát tốt hơn đối với độ rộng cạnh được in mực, mặc dù với thuật toán phù hợp trong trình tạo bóng mảnh, tôi chắc chắn điều này sẽ khả thi.

Vì vậy, câu hỏi bây giờ trở nên cụ thể hơn: Làm thế nào chính xác tôi sẽ đi về việc có được độ rộng cạnh thay đổi, đặc biệt là ở hình bóng bên ngoài, trong một shader mảnh?


Độ dày đường thay đổi là một tính năng của phương pháp hình học. Không thể có hiệu quả bằng bất kỳ cách nào khác. Vì bạn muốn điều đó, tôi không thấy các pixel shader là "phương pháp hiệu quả hơn": số pixel được tìm kiếm = (line_thickness * 2 + 1) ^ 2 - 1. Về cơ bản điều đó có nghĩa là trình đổ bóng sau quá trình của bạn sẽ chậm hơn rất nhiều (guesstimate: 10x) nếu max. chiều rộng dòng bằng 2. Chỉ cần bỏ đánh giá trước và thử phương pháp đổ bóng hình học.
rắn5

@ Snake5 Bạn thành thật đề nghị rằng tôi chạy qua 150 triệu đỉnh trên mỗi lần cập nhật kết xuất (khoảng 25 triệu lượt xem bị loại bỏ), trong GS? Tôi không thực sự mua nó, nhưng cảm ơn cho đầu vào. Tham khảo lại những gì tôi đã nêu ở trên về số lượng đỉnh và độ phức tạp. Ngay cả với con số gấp 10 lần của bạn, shader mảnh ít nhất sẽ vẽ đều, và có lẽ sẽ làm tốt hơn rất nhiều.
Kỹ sư

25 triệu đỉnh (đọc / ghi tuyến tính) so với 23 triệu mẫu kết cấu (bộ nhớ được lưu trong bộ nhớ cache khá kém + giải nén dữ liệu đích kết xuất) @ 1280x720. Nhân tiện, việc giới hạn / giảm số đỉnh dễ dàng hơn rất nhiều. Đặc biệt là những ngày này, khi các màn hình lớn (1920x1080 +) và thiết lập đa người dùng đang trở nên rất phổ biến.
rắn5

Điều gì về việc sử dụng cùng một thuật toán với một thuật toán tạo ra các đường viền màu đỏ, và sau đó làm mỏng / tăng các đường dựa trên độ sâu của chúng?
Ali1S 232

@Gajoo, như tôi đã nói trong câu hỏi, nó không chỉ là về hình bóng. Lưu ý các đường xâm nhập phía sau vai của cô gái trong hình ảnh đầu tiên. Đó là một chức năng của phương pháp tiếp cận lật thông thường, và hoạt động như các đường viền / nếp gấp gợi ý. Tôi cần như vậy.
Kỹ sư

Câu trả lời:


4

Tôi đã quyết định thực hiện một cách tiếp cận shader mảnh thông qua bộ lọc gián đoạn của bộ đệm độ sâu. Lý do cho điều này là:

  1. Số lượng đỉnh thế giới là rất, rất cao do khoảng cách xem rất lớn, ngay cả với lưới LoD;
  2. Tôi đang thực hiện một số thao tác đổ bóng mảnh khác, chẳng hạn như làm mờ DoF có thể có lợi bằng các cấu trúc tương tự (lấy mẫu / lọc mẫu hoặc gaussian) trong cùng một lượt.

Đã thử nghiệm nó, tôi sẽ nói rằng trong các dự án trong tương lai tôi sẽ đi theo cách tiếp cận dựa trên hình học, vì những lý do phức tạp. Lý do là (như những người khác đã đề xuất trong các bình luận), cách tiếp cận shader mảnh để phát hiện cạnh có thể được tính toán mạnh mẽ, đặc biệt là với các triển khai DoF trong đó vòng tròn bán kính nhầm lẫn, và do đó số lượng mẫu trên mỗi mảnh, có thể khá cao. Điều này may mắn là ít quan tâm đến các shader phác thảo.


Tôi nghĩ rằng việc không liên tục theo quy tắc sẽ cho bạn kết quả tốt hơn trong trường hợp bạn có quy tắc căn hộ. Bạn có thể thay đổi độ rộng đường bằng cách lấy các mẫu cách xa nhau.
Grieverlove

@Grieverlove Đây là câu trả lời được chấp nhận, bởi vì phương pháp tôi đang sử dụng hoạt động tốt. Cảm ơn.
Kỹ sư

0

Thực sự có một giải pháp chung rất dễ dàng nếu bạn có thể sử dụng hiệu ứng sau. Điều tuyệt vời là, không quan trọng số lượng poly của bạn cao như thế nào. Kết xuất bản đồ Độ sâu dưới dạng thang độ xám, sau đó tạo một chấm theo màu đường bạn muốn, khi độ tương phản giữa hai pixel liền kề cao hơn giá trị ngưỡng. Bạn có thể làm cho chấm lớn hơn theo độ tương phản và mức độ sáng của hình ảnh bạn hiển thị.

Tôi đã phát minh ra thuật toán toonShader vào năm 2000/2001, ngay cả trước khi anh chàng người Pháp đó, người đã tạo ra giải pháp này. Của tôi được dựa trên hình học vật liệu thực tế. Về cơ bản, có hai cách để thực hiện: 1. nhìn vào các quy tắc, nếu các mặt phẳng thông thường hai mặt phẳng được nối với nhau và hướng về phía máy ảnh, kết xuất đường thẳng đó, thì bạn có thể sử dụng độ sâu, ánh sáng, v.v. như tín hiệu cho các đường kẻ. 2. Nhìn vào geomety được kết xuất (vì vậy sau khi chuyển đổi phối cảnh) Lấy từng đường thẳng, nếu các đỉnh của các mặt phẳng kết nối nằm cùng phía của đường thẳng này, bạn kết xuất đường thẳng .. Sau đó, bạn có thể làm tương tự cho độ dày đường thẳng như trong phương pháp 1. 3. Bạn có thể thực hiện kết hợp ba kỹ thuật này, nhưng tôi đã đề cập đến phương pháp đầu tiên, bởi vì bạn đã chỉ ra một số lượng lớn.

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.