Làm thế nào để làm cho vòng tròn lựa chọn đơn vị hợp nhất?


16

Tôi muốn biết làm thế nào để thực hiện hiệu ứng này của lựa chọn vòng tròn hợp nhất. Dưới đây là hình ảnh để minh họa:

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

Về cơ bản tôi đang tìm kiếm hiệu ứng này:

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

Làm thế nào hiệu quả hợp nhất của các vòng tròn có thể đạt được? Tôi không tìm thấy bất kỳ lời giải thích liên quan đến hiệu ứng này. Tôi biết rằng để chiếu các kết cấu đó, tôi có thể phát triển một hệ thống decal nhưng tôi không biết cách tạo hiệu ứng hợp nhất.

Nếu có thể, tôi đang tìm kiếm giải pháp shader hoàn toàn.


Bạn có thể giải thích những gì bạn có nghĩa là "hiệu ứng hợp nhất"?
wonderra

Tất nhiên, nếu bạn nhìn vào các ký tự trên cùng bên phải của ảnh chụp màn hình, các đề can không giao nhau mà hai bên trái vượt qua vòng tròn màu xanh của chúng và được hợp nhất. Tôi đã thêm một ảnh chụp màn hình mới để hiển thị hiệu ứng.
MaT

Bạn có nhấn mạnh vào giải pháp shader? Nếu không, bạn chỉ cần giải quyết nó trong hình ảnh cuối cùng của bạn.
wonderra

Ảnh chụp màn hình cuối cùng chỉ hiển thị hiệu ứng tôi đang nhắm mục tiêu. Kết quả cuối cùng sẽ trông giống như các ảnh chụp màn hình trước đó.
MaT

1
Đúng, tôi đồng ý, tôi nghĩ rằng họ xây dựng linh hoạt một vòng tròn lưới với kết cấu và sau đó cắt lưới để hợp nhất chúng. Đó cũng là một giải pháp tốt nhưng tôi nghĩ nó hạn chế hơn về mặt hiệu quả mà bạn có thể làm.
MaT

Câu trả lời:


8

Có một vài thủ thuật bạn có thể làm:

Bộ đệm Z

Sau khi bạn đã kết xuất tất cả các đối tượng khác, cho mỗi đơn vị hiển thị một vòng tròn trong suốt có kích thước nhỏ hơn với giá trị Z tối đa. Sau đó kết xuất lựa chọn vòng tròn đề can trên mặt đất. Vì chúng ở dưới thứ tự Z, chúng sẽ bị loại bỏ khi ở dưới đơn vị.

Là phương tiện đầy đủ trong suốt vòng tròn được ghi chỉ đến Z-đệm (giá trị Z max). Bây giờ khi bạn kết xuất đề can, chúng được kiểm tra theo các giá trị bộ đệm Z và nếu chúng vượt qua kiểm tra, chúng sẽ được kết xuất (chỉ xảy ra bên ngoài vòng tròn)

Stt

Tương tự như cách tiếp cận trước, nhưng lần này sử dụng bộ đệm stpson. Kết xuất các vòng tròn nhỏ hơn cho các đơn vị với một số giá trị stprint, sau đó kết xuất đề can lựa chọn. Thiết lập stprint để loại bỏ bất kỳ yếu tố nào với giá trị stpson của bạn.


Kỹ thuật Z-Buffer rất thú vị nhưng tôi không hiểu làm thế nào vòng tròn trong suốt đầu tiên có thể cắt đề can mặt đất.
MaT

0

Ví dụ, bạn có thể kiểm tra trình tạo bóng pixel kết xuất decal nếu có giao điểm với bất kỳ đề can nào khác và giết pixel nếu có. Nó khá hiệu quả để làm cho loại đề can tròn này.


1
Tôi giả sử bạn đã bỏ qua phần từ câu trả lời của bạn - để chuyển tất cả các vị trí và bán kính vòng tròn cho shader.
Kromster nói hỗ trợ Monica

@Krom Nếu OP bày tỏ sự quan tâm đến giải pháp, tôi rất vui lòng cung cấp thêm chi tiết.
JarkkoL

0

Bạn có nghĩa là những vòng tròn màu xanh trên mặt đất?

Có thể có một cách thông minh hơn để làm điều này nhưng hãy xem giải pháp của tôi là một ví dụ về cách thực hiện điều này. Kết xuất các vòng tròn của bạn thành một kết cấu trống riêng biệt về kích thước của màn hình. Tại thời điểm này, bạn có thể trộn chúng lại với nhau, tuy nhiên bạn muốn. Tùy thuộc vào nhu cầu của bạn, bạn có thể viết đầy đủ màu sắc hoặc chỉ thông tin mà một vòng tròn hiện diện ở pixel đã cho. Tuy nhiên, bạn chắc chắn sẽ cần một thông tin chuyên sâu cho từng pixel mà bạn viết nếu bạn muốn có hiệu ứng Z-test.

Khi bạn kết xuất địa hình sau bước trước đó, bạn có thể lấy mẫu kết cấu đã tạo trước đó, sử dụng tọa độ màn hình trong pixel shader, dưới dạng UV. Bây giờ bạn đã biết, vòng tròn nên hoặc không nên được chiếu ở pixel đã cho của địa hình. Tuy nhiên, cách này sẽ hoạt động như thể kiểm tra Z bị vô hiệu hóa, do đó địa hình không thể ẩn bất kỳ vòng tròn nào. Nếu bạn muốn một địa hình để ẩn các vòng tròn phía sau nó, hãy thực hiện kiểm tra độ sâu trước khi trộn một vòng tròn với kết cấu địa hình. Bạn có thể sử dụng một thiên vị nhỏ để cho phép hiển thị các vòng tròn chỉ một chút dưới địa hình nhưng bạn vẫn muốn chúng hiển thị.


Chỉnh sửa: Bây giờ để có được hiệu ứng của các vòng tròn được hợp nhất, điều bạn cần làm là: Khi kết xuất thành kết cấu riêng biệt, bạn cần kiểm tra xem đã có một vòng tròn được hiển thị ở nơi bạn đang cố gắng kết xuất một vòng tròn mới chưa. (Kiểm tra xem kết cấu có giá trị ở đó không) nếu vậy, hãy xóa pixel này. Điều này sẽ cho hiệu ứng "phác thảo" khi hai hoặc nhiều vòng tròn trùng nhau. Để điều này hoạt động chính xác, tuy nhiên bạn sẽ chỉ cần thực hiện kiểm tra này cho bên trong vòng tròn, không phải đường viền. Vì vậy, khi kết xuất các vòng tròn, hãy viết một số giá trị cụ thể vào kết cấu đầu ra, cho biết đó là một vòng tròn bên trong. Sau đó, bạn chỉ cần không hiển thị bất cứ điều gì trên vòng tròn bên trong và bạn nên được tốt.

Edit2: Ví dụ đơn giản về màu đỏ / xanh lục của bạn: Trước khi bạn kết xuất bất kỳ pixel nào, hãy kiểm tra xem pixel này chưa có màu xanh chưa. Nếu có, đừng kết xuất. Điều này sẽ làm các mẹo. Trong thực tế, trong khi viết vào kết cấu, bạn thậm chí có thể sử dụng màu đỏ / xanh lục cho bên ngoài / bên trong vòng tròn, và sau đó trong khi hiển thị địa hình đọc các giá trị đó và chuyển đổi chúng thành màu mong muốn.

Nếu câu trả lời của tôi quá trừu tượng bởi bất kỳ cơ hội nào, hãy cho tôi biết.


Tôi hiểu ý tưởng chung nhưng như bạn nói, đó là một chút trừu tượng đối với tôi liên quan đến các vòng tròn đã hợp nhất :)
MaT

0

Có một vài lựa chọn. Là một phương pháp chung, bộ đệm stpson thường rất tiện dụng trong đó bản vẽ nhất định cần được che đi, giống như phác thảo nơi các vòng tròn chồng lên nhau trong ví dụ của bạn.

Trong trường hợp này, tôi nghĩ rằng điều này có thể được thực hiện dễ dàng mà không cần bộ đệm stpson. Bạn có thể sử dụng bộ đệm độ sâu để loại bỏ các phác thảo nơi các vòng tròn chồng lên nhau. Ý tưởng là bạn vẽ phần bên trong của các vòng tròn thành bộ đệm có chiều sâu (vì chúng ta không muốn nhìn thấy phần bên trong), và sau đó vẽ phác thảo. Bằng cách này, một phần của phác thảo chồng lấp với một vòng tròn khác sẽ được loại bỏ bằng thử nghiệm độ sâu.

Nhắc nhở duy nhất là bạn phải cẩn thận về chiến đấu chuyên sâu. Bạn có thể sử dụng một phần bù nhỏ để đảm bảo rằng các đường viền trên thực tế nằm phía sau phần bên trong và được loại bỏ bằng bài kiểm tra độ sâu. Một thay thế sẽ được sử dụng glPolygonOffset().

Giả sử bạn có hai vòng tròn song song với mặt phẳng xy, với các tâm tại (x1, y1, z) và (x2, y2, z). Và bạn có các hàm vẽ này:

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

Trình tự vẽ sau đó trông như thế này, với deltamột phần bù nhỏ:

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

Ngoài đỉnh đầu của tôi, nếu những đề can này được vẽ dưới dạng đĩa, tôi sẽ kiểm tra từng vòng tròn để tìm giao điểm với nhau và đặt các điểm giao nhau thành một mảng. Sau đó vẽ các cung không nằm trong giao lộ. Đây không phải là một giải pháp shader, mặc dù.


Vâng tôi cũng nghĩ về điều đó :) nhưng như bạn đã nói đó không phải là một giải pháp đổ bóng và nó không phải là một giải pháp rất chung chung. Nhưng cảm ơn !
MaT

Đó là mô tả khá mơ hồ
Kromster nói hỗ trợ Monica

0

Bạn muốn stenciling ở đây. Pass đầu tiên của bạn làm cho các vòng tròn vào bộ đệm stpson. Pass thứ hai biểu hiện đường viền có thể nhìn thấy , bất cứ nơi nào bộ đệm stpson không thay đổi. Pass thứ hai phải sử dụng hình học lớn hơn pass thứ nhất, trong trường hợp này, một vô hướng tuyến tính đơn giản là đủ.

Mặc dù giải pháp tôi có để vẽ phác thảo ở đây là nhiều hơn bạn cần (vì trình đổ bóng đó biến mọi cạnh lưới thành một hình vuông đầy đủ), nhưng nó thực hiện theo cách tiếp cận này: vẽ mô hình ban đầu vào bộ đệm stpson, sau đó hiển thị một phiên bản lớn hơn trong đó bộ đệm stpson vẫn là 0.


Cảm ơn! Vì vậy, thay vì trước tiên vẽ các phần có thể nhìn thấy, tôi nên bắt đầu với việc hiển thị các vòng tròn trong suốt vào khuôn tô. Nhưng làm thế nào để tôi kết xuất vòng tròn trong suốt? Tôi không thể giới hạn các phần của hình ảnh được hiển thị trong khuôn tô. Khi tôi kết xuất với khuôn tô, mọi thứ ở đó, phải không?
Doodlemeat

Vâng, đó là lý do tại sao đường chuyền thứ hai (phần có thể nhìn thấy) được chia tỷ lệ lớn hơn: vì vậy giới hạn của nó lớn hơn bộ đệm stpson. Bạn chỉ cần áp dụng một vô hướng đỉnh trong đường chuyền thứ hai (nhìn xung quanh để tìm các shader phác thảo, hầu hết chúng sử dụng vô hướng đơn giản hơn mà tôi đang đề cập). Bạn cũng không thể thay đổi bộ đệm stpson nếu màu trong suốt. Bạn có thể sẽ cần một mặt nạ kết cấu thứ hai trong trường hợp này hoặc bạn có thể thực hiện một số phép toán khoảng cách để xác định vòng tròn thay thế. Tôi cần một vài giờ và truy cập vào Unity để cung cấp bất kỳ mã nào.
Draco18 không còn tin tưởng SE

Hmm, những gì về việc có một hình ảnh đen / trắng chỉ để ghi vào bộ đệm stpson trong lần đầu tiên để màu đen trở thành 0 và màu trắng trở thành 1 trong khuôn tô. Điều đó thậm chí có thể?
Doodlemeat

Đó là những gì tôi muốn nói bởi mặt nạ kết cấu thứ hai. Tôi khá chắc chắn rằng nó sẽ hoạt động, tôi thực sự không thể xác minh mà không có Unity trước mặt, điều mà tôi sẽ không có trong hơn 24 giờ.
Draco18 không còn tin tưởng SE
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.