Làm mờ bóng mờ chỉ là một kỹ thuật để "trì hoãn" hoạt động tạo bóng thực tế cho các giai đoạn sau, điều này có thể rất tuyệt để giảm số lượng đường chuyền cần thiết (ví dụ) để hiển thị 10 đèn cần 10 lần. Quan điểm của tôi là bất kể kỹ thuật kết xuất mà bạn đang sử dụng đều có những tối ưu hóa kết xuất nhất định có thể làm giảm số lượng đối tượng (đỉnh, chuẩn, v.v.) mà đường ống kết xuất của bạn cần xử lý.
Không có tiêu chuẩn thực tế nào để hiển thị tối ưu hóa, mà là một số kỹ thuật có thể được sử dụng thay thế cho nhau hoặc cùng nhau để đạt được các đặc tính hiệu suất nhất định. Sử dụng từng kỹ thuật phụ thuộc nhiều vào tính chất của cảnh được hiển thị.
Kết xuất hoãn lại cố gắng giải quyết vấn đề khi số lượng đèn tăng lên, trong kết xuất phía trước có thể làm cho số lượng đường chuyền phát nổ.
Những kỹ thuật này không trực tiếp tối ưu hóa phần bóng mờ bị trì hoãn, nhưng theo mô tả của bạn, phần bóng mờ bị trì hoãn KHÔNG phải là vấn đề của bạn. Vấn đề của bạn là bạn đang gửi toàn bộ cảnh để kết xuất đường ống. Vì vậy, công cụ của bạn phải xử lý (ví dụ như tất cả 100 triệu đỉnh) trong cảnh của bạn để có thể gửi kết quả đến bộ đệm g, trong khi hầu hết các đỉnh 100 triệu có thể bị loại bỏ một cách tầm thường và không được gửi đến đỉnh tiền xử lý và các mảnh vỡ đi qua.
Trong trường hợp trình kết xuất chuyển tiếp, đỉnh N sẽ được xử lý bởi giai đoạn đỉnh là tổng cộng vertex count*lights count
và bởi giai đoạn phân đoạn, tổng số fragments count*number Lights
bóng mờ bị trì hoãn làm giảm hiệu quả này xuống chỉ vertex count
cho giai đoạn đỉnh và fragments count
cho số lượng phân đoạn, trước khi giải quyết bóng thực tế. Nhưng N vẫn có thể là quá nhiều để xử lý, đặc biệt là khi hầu hết trong số chúng có thể bị loại bỏ một cách tầm thường.
Điều này làm cho việc loại bỏ hiệu quả hơn trong trường hợp kết xuất / chuyển tiếp nhiều lần. Nhưng hãy nhớ rằng hầu hết các động cơ sẽ sử dụng phương pháp kết xuất kép, bởi vì bóng mờ bị trì hoãn không thể giải quyết các vật thể trong suốt, điều này làm cho việc sử dụng những tối ưu hóa đó là điều bắt buộc, tôi không biết về bất kỳ động cơ thương mại nào không làm tất cả chúng.
Frustum Culling
Chỉ các Đối tượng được bao gồm đầy đủ hoặc một phần trong chế độ xem, bao giờ cần phải được gửi đến đường ống kết xuất. Đây là khái niệm cơ bản về loại bỏ bực bội, không may kiểm tra xem lưới có vào / ra khỏi chế độ xem có thể là một thao tác đắt tiền hay không, vì vậy, các nhà thiết kế động cơ sử dụng một thể tích giới hạn gần đúng như hộp giới hạn Trục (AABB) hoặc hình cầu giới hạn , mặc dù điều này có thể không chính xác như sử dụng lưới thực tế, sự khác biệt về độ chính xác không đáng để kiểm tra với lưới thực tế.
Ngay cả với các khối lượng giới hạn, bạn thực sự không cần phải kiểm tra từng cái, thay vào đó, bạn có thể xây dựng một hệ thống phân cấp âm lượng giới hạn để thực hiện loại bỏ trước đó, sử dụng điều này phụ thuộc nhiều vào độ phức tạp của cảnh.
Đây là một kỹ thuật tốt và đơn giản cho động cơ nhỏ hơn và gần như được sử dụng trong mọi động cơ tôi từng sử dụng. Tôi khuyên bạn nên sử dụng kiểm tra Khối lượng / Frustum "bình thường" không có phân cấp nếu công cụ của bạn không yêu cầu hiển thị các cảnh rất phức tạp.
Quay mặt lại
Đây là điều bắt buộc, tại sao lại vẽ những khuôn mặt không thể nhìn thấy? API kết xuất cung cấp một giao diện để bật / tắt loại bỏ mặt sau. Trừ khi bạn có một lý do mạnh mẽ tại sao không bật nó lên, như một số ứng dụng CAD cần vẽ backfaces trong một số trường hợp nhất định, đây là điều cần phải làm.
Giết mổ
Sử dụng bộ đệm Z, bạn có thể giải quyết xác định mức độ hiển thị. Nhưng vấn đề là bộ đệm Z không phải lúc nào cũng tuyệt vời về hiệu năng, vì bộ đệm Z chỉ có thể được giải quyết ở các giai đoạn sau của đường ống, các đối tượng bị chặn nên được rasterized và có thể được ghi vào bộ đệm Z và Bộ đệm màu trước khi thất bại trong bài kiểm tra Z.
Loại bỏ loại trừ giải quyết điều này, bằng cách thực hiện một số thử nghiệm đầu tiên để loại bỏ các đối tượng bị loại bỏ trong phần kết xuất. Một triển khai thực tế của việc loại bỏ tắc nghẽn là sử dụng các truy vấn dựa trên điểm và kiểm tra xem các đối tượng nhất định có thể nhìn thấy được từ một quan điểm cụ thể hay không. Điều này cũng có thể được sử dụng để loại bỏ ánh sáng không đóng góp vào hình ảnh cuối cùng, điều này đặc biệt hữu ích trong trình kết xuất động cơ hoãn lại.
Một ví dụ thực tế tuyệt vời về kỹ thuật như vậy là trong GTA5, nơi các tòa nhà chọc trời được đặt ở vị trí trung tâm của thành phố, không chỉ là đồ trang trí, mà chúng còn hoạt động như một vật cản, ngăn chặn hiệu quả phần còn lại của thành phố và ngăn không cho nó tồn tại rasterized.
Mức độ chi tiết
Mức độ chi tiết là kỹ thuật được sử dụng rộng rãi, ý tưởng là sử dụng một phiên bản lưới đơn giản hơn khi lưới ít đóng góp cho cảnh. Có hai cách thực hiện phổ biến; người ta chỉ đơn giản chuyển lưới bằng một cái đơn giản hơn khi nó không còn đóng góp nhiều nữa, lưới được chọn dựa trên một số yếu tố như khoảng cách và số pixel (diện tích trên màn hình) mà lưới đang chiếm. Phiên bản khác tự động nối lưới, điều này được sử dụng rộng rãi trong kết xuất địa hình.
Điều gì xảy ra nếu tất cả những thứ này không hoạt động?
Vâng, đó là một câu hỏi hay.
Điều đầu tiên bạn cần làm là Hồ sơ ứng dụng của bạn bằng cách sử dụng một trình lược tả đồ họa và xác định nơi tắc nghẽn. Hãy nhớ rằng nút cổ chai có thể thay đổi khi nội dung được hiển thị thay đổi. Nút cổ chai cũng có thể là một phần của mã chạy trên CPU, do đó bạn cũng cần phải đo nó.
Sau đó, bạn cần thực hiện một số tối ưu hóa cho nút cổ chai, hãy nhớ rằng không có câu trả lời đúng cho điều này, và sẽ khác với phần cứng khác.
Một số thủ thuật tối ưu hóa GPU phổ biến:
- Tránh phân nhánh trong shader.
- Hãy thử các cấu trúc đỉnh khác nhau, ví dụ
{VNT}
xen kẽ trong cùng một mảng hoặc {V},{N},{T}
trong các mảng khác nhau.
- Vẽ cảnh trước ra sau.
- Tắt bộ đệm Z tại một số điểm, ví dụ nếu một hình ảnh không cần thử nghiệm Z.
- Sử dụng kết cấu nén.
Một số thủ thuật tối ưu hóa CPU phổ biến:
- Sử dụng các hàm nội tuyến cho các hàm nhỏ.
- Sử dụng SIMD (Hướng dẫn nhiều dữ liệu) khi có thể.
- Tránh bộ nhớ đệm không thân thiện nhảy.
- Sử dụng VBO với lượng dữ liệu "đúng". (tùy thuộc vào phần cứng của bạn) nhưng thường thì các cuộc gọi rút thăm ít hơn sẽ tốt hơn.
Nhưng điều gì sẽ xảy ra nếu nút cổ chai của tôi ở trong bóng mờ bị trì hoãn?
Trong trường hợp này, vì bóng mờ bị trì hoãn quan tâm nhiều hơn đến đèn nên phần rõ ràng nhất là tối ưu hóa các tính toán bóng thực tế. một số điểm cần chú ý:
- Kết xuất ánh sáng thực sự ảnh hưởng đến hình ảnh cuối cùng. Nói cách khác, loại bỏ ánh sáng không đóng góp. Điều này có thể được thực hiện một cách hiệu quả bằng cách sử dụng loại bỏ tắc mà tôi đã đề cập trước đó.
- Liệu ánh sáng này cần đặc điểm hoặc một số thành phần khác? Có thể không.
- Liệu ánh sáng này đổ bóng? Một số đèn không cần chiếu bóng.
- Đóng góp ánh sáng này có thể được tính toán trước? Nếu nó không di chuyển có lẽ một số khía cạnh có thể được tính toán trước.