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.
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:
Để 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ó.