Cách ẩn đường viền lưới được xử lý sau khi / nơi lưới bị ẩn


10

Tôi đang làm việc để thiết lập một phác thảo hoạt động trong công cụ 3d của mình, một hiệu ứng nổi bật cho các nhân vật hoặc cảnh 3d được chọn trong màn hình. Sau khi làm việc với bộ đệm stpson và nhận được một số kết quả không đạt yêu cầu (các vấn đề với hình dạng lõm, độ dày đường viền do khoảng cách từ máy ảnh và sự không nhất quán giữa máy tính để bàn và máy tính xách tay của tôi), tôi đã chuyển sang phát hiện cạnh và lấy mẫu bộ đệm khung và có một phác thảo khá hài lòng với.

Tuy nhiên, tôi không thể ẩn đường viền khi lưới được chọn nằm sau lưới khác. Điều này hợp lý với quy trình của tôi, vì tôi chỉ đơn giản đưa ra phác thảo shader 2d từ bộ đệm khung sau khi hiển thị phần còn lại của cảnh.

Dưới đây là hai ảnh chụp màn hình kết quả của tôi. Đầu tiên là một phác thảo "tốt", thứ hai là nơi nhìn thấy phác thảo trên một lưới chặn nguồn phác thảo.

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

Quá trình kết xuất chạy như sau: 1) Chỉ vẽ alpha của lưới được tô sáng, chụp một hình bóng màu đen trong bộ đệm khung (framebuffer1).

2) Truyền kết cấu từ framebuffer1 sang shader thứ hai thực hiện phát hiện cạnh. Chụp cạnh trong framebuffer2.

3) Kết xuất toàn bộ cảnh.

4) Kết xuất kết cấu từ framebuffer2 trên đỉnh của cảnh.

Tôi có một vài ý tưởng về cách thực hiện và hy vọng nhận được phản hồi về tính hợp lệ của chúng, hoặc về các phương pháp đơn giản hơn hoặc tốt hơn.

Đầu tiên, tôi đã nghĩ đến việc hiển thị toàn bộ cảnh vào bộ đệm khung và lưu trữ hình bóng có thể nhìn thấy của lưới được tô sáng trong kênh alpha (tất cả lưu màu trắng nơi hiển thị lưới được tô sáng). Sau đó tôi sẽ thực hiện phát hiện cạnh trên kênh alpha, kết xuất bộ đệm khung cảnh và sau đó kết xuất cạnh trên. Kết quả trong một cái gì đó như thế này:

kết quả

Để thực hiện điều này, tôi đã nghĩ đến việc chỉ xác định một định nghĩa trong khi vượt qua kết xuất của đối tượng được tô sáng sẽ vẽ toàn bộ màu đen trong alpha cho bất kỳ pixel hiển thị nào.

Ý tưởng thứ hai của tôi là sử dụng quy trình kết xuất hiện tại được nêu ở trên, nhưng cũng lưu trữ tọa độ X, Y và Z trong các kênh R, G và B của framebuffer1 khi hiển thị hình bóng của lưới đã chọn. Việc phát hiện cạnh sẽ được thực hiện và lưu trữ trong framebuffer2, nhưng tôi sẽ chuyển các giá trị RGB / XYZ từ các cạnh của alpha sang hình bóng. Sau đó, khi kết xuất cảnh, tôi sẽ kiểm tra xem tọa độ có nằm trong cạnh được lưu trong framebuffer2 không. Nếu vậy, sau đó tôi sẽ kiểm tra độ sâu của đoạn hiện tại để xác định xem nó ở phía trước hoặc phía sau tọa độ được trích xuất từ ​​các kênh RGB (được chuyển đổi thành không gian camera). Nếu đoạn nằm ở phía trước tọa độ sâu, đoạn sẽ được hiển thị bình thường. Nếu mảnh vỡ ở phía sau, nó sẽ được hiển thị dưới dạng màu phác thảo rắn.

Tôi đang sử dụng LibGDX cho dự án này và muốn hỗ trợ WebGL và OpenGL ES, vì vậy không có giải pháp nào liên quan đến trình tạo bóng hình học hoặc các chức năng GLSL mới hơn có sẵn cho tôi. Nếu bất cứ ai có thể nhận xét về các phương pháp đề xuất của tôi hoặc đề xuất một cái gì đó tốt hơn tôi thực sự đánh giá cao nó.


Có một cái nhìn vào repo của bạn. Bạn đã bao giờ tìm thấy một cách giải quyết chấp nhận được?
iKlsR

Câu trả lời:


0

Tôi sẽ kết xuất toàn bộ cảnh vào một bộ đệm stpson với đối tượng được phác thảo mong muốn để đặt một bit và cho bất cứ thứ gì khác để loại bỏ / loại bỏ bit.

Sau đó loại bỏ phát hiện cạnh, bạn không cần điều đó, thay vào đó bạn chỉ có thể mở rộng bộ đệm lên một chút. Vì vậy, mỗi đối tượng chỉ tăng trưởng nhẹ.

Từ đó, bộ đệm stpson có thể có các phác thảo bạn cần. Đó là tất cả về việc đảm bảo rằng các đối tượng khác mà bạn kết xuất đang tắt các bit trong bộ đệm stpson của bạn.


2
Cảm ơn vi đa trả lơi. Phương pháp này sẽ không gặp phải các vấn đề tương tự với độ dày phác thảo và hình dạng lõm nếu việc chia tỷ lệ được thực hiện trong 3d? Hoặc các vấn đề dịch chuyển nếu nó được thực hiện trong 2d và đối tượng được phác thảo không nằm trong trung tâm chết của màn hình?
nils

0

1) trong một đối tượng bộ đệm khung, bạn có thể chạy trình đổ bóng laplacian trong GPU để thu được đường viền.

2) bạn phải sử dụng bộ đệm độ sâu cuối cùng khi bạn vẽ đối tượng của mình trong FBO, theo cách đó bạn sẽ chỉ vẽ phần hiển thị của đối tượng trong FBO và laplacian sẽ chỉ viền phần nhìn thấy được.


Hi, cảm ơn bạn đã trả lời. Tôi đã làm điều này để đạt được phác thảo mà tôi có. Tôi không nghĩ rằng bạn xứng đáng với một downvote cho câu trả lời này, vì vậy nâng cao.
Nils 16/2/2016

0

Tôi hy vọng tôi có thể làm rõ điều này, nhưng về cơ bản, bạn cần tạo một khuôn tô của cả hai đối tượng như thể cả hai đều được chọn, sau đó chỉ giữ các khu vực trong hộp giới hạn của mục bạn thực sự muốn làm nổi bật.

Vì vậy, về cơ bản, bạn tạo một bộ đệm stprint của cả hai đối tượng được chọn (hoặc tất cả các đối tượng bao gồm đối tượng, thực sự ... nhưng tôi sẽ không lo lắng về những trường hợp đó trừ khi nó thực sự xuất hiện rất nhiều - nếu đó là những người bị che giấu sẽ không mong đợi rất nhiều sự giúp đỡ này), sau đó và nó với một khuôn tô của hộp giới hạn cho đối tượng của bạn.

Điều đó sẽ nhận được hiệu quả mà bạn đang tìm kiếm.

Ngoài ra, bạn chỉ có thể để lại kết quả 'xấu' và tôi không nghĩ rằng hầu hết mọi người sẽ quan tâm quá nhiều, mặc dù điều này phụ thuộc vào dữ liệu / trò chơi của bạn và đặc biệt là kích thước của các đối tượng.

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.