Tất cả bài viết
Hướng dẫn · 6 min read

Rừng rậm không có vách khung hình: LOD, impostor và instancing

Cách render hàng ngàn cây ở khung hình: chuỗi LOD từ mesh đầy đủ đến billboard, impostor bát diện giữ được từ bất kỳ góc nào, instancing và culling, và các mẹo gió và tô bóng giữ cho một khu rừng đã bake không trông chết.

Spruce forest on a green alpine slope with a handful of wooden cabins below

Tóm lại: một khu rừng rậm thuyết phục là một trận đánh boss về hiệu năng: hàng ngàn cây đa giác cao, độ trong suốt xếp lớp, và các instance kéo dài đến chân trời. Bạn thắng nó bằng một chuỗi LOD có kỷ luật kết thúc ở impostor (billboard hướng camera giả mạo một cây 3D từ bất kỳ góc nào), instancing và culling mạnh mẽ, và vài mẹo tô bóng để các cây xa rẻ không tự phản bội mình. Bài viết này đi qua toàn bộ chuỗi từ mesh đầy đủ đến billboard, mẹo impostor bát diện, và cách giữ một khu rừng được tối ưu nặng không trông chết.

Rìa của một khu rừng, cây cối lùi vào chiều sâu Mỗi cây ở đây ở khoảng cách khác nhau từ camera, nên mỗi cây nên có chi phí khác nhau. Nghệ thuật của một khu rừng rẻ là tiêu polygon chỉ vào những cây gần và giả mạo phần còn lại một cách thuyết phục.

Ý tưởng cốt lõi: trả theo khoảng cách

Một cây cách 5 mét và một cây cách 500 mét không nên có cùng chi phí. Một chuỗi LOD tiêu chi tiết đầy đủ ở gần và các biểu diễn dần rẻ hơn với khoảng cách, kết thúc ở một billboard phẳng, nên tổng chi phí vẫn phẳng khi rừng lớn lên.

Cả trò chơi là từ chối trả giá đầy đủ cho những cây mà camera hầu như không phân giải. Ở gần, một cây là một mesh đầy đủ với các thẻ lá riêng lẻ; ở xa, nó là một nhúm pixel mà một hình ảnh phẳng tái tạo hoàn hảo. Một chuỗi LOD (level-of-detail) chính thức hóa điều đó: nhiều phiên bản của cùng một cây với chi phí giảm dần, hoán đổi theo kích thước màn hình, nên một khu rừng mười ngàn cây tốn khoảng chi phí của những gì có thể thấy chi tiết thay vì tổng của mỗi cây ở chất lượng đầy đủ. Không có nó, mật độ scale thời gian khung hình của bạn tuyến tính xuống đất; với nó, bạn có thể đẩy số lượng cây cao hơn nhiều cho cùng một ngân sách.

Chuỗi LOD, từng bước

LOD0 mesh đầy đủ với thẻ lá (gần); LOD1–2 hình học giảm và lá đơn giản hóa (giữa); LOD3 vài thẻ hoặc một thẻ đơn; LOD cuối cùng một impostor/billboard (xa). Mỗi bước xấp xỉ giảm chi phí một nửa trong khi việc hoán đổi vẫn không nhìn thấy.

Một chuỗi LOD thảm thực vật điển hình chạy khoảng như thế này: LOD0, mesh chi tiết đầy đủ với tất cả các thẻ lá của nó, cho cây ngay bên cạnh người chơi; LOD1–LOD2, hình học thân cây giảm và ít hơn, thẻ lá lớn hơn, cho mặt phẳng giữa; LOD3, một cụm thẻ được đơn giản hóa đáng kể; và một impostor cuối cùng (về cơ bản là một hình ảnh phẳng) cho mọi thứ xa. Nghề thủ công nằm ở khoảng cách chuyển tiếp và blend, để việc hoán đổi không nhảy. Các chuyển tiếp LOD dither hoặc cross-fade ẩn công tắc; một cú nhảy cứng ở khoảng cách sai là dấu hiệu phá vỡ ảo giác. Điều chỉnh khoảng cách với camera thực tế của bạn, không phải mặc định.

Impostor: giả mạo 3D từ bất kỳ góc nào

Một impostor (impostor bát diện) pre-render cây từ hàng chục góc vào một atlas, sau đó hiển thị chế độ xem đã bắt gần nhất như một billboard. Không giống như một billboard phẳng, nó trông chính xác khi camera di chuyển xung quanh: rẻ, nhưng 3D-ish.

Đầu xa của chuỗi là nơi các khoản tiết kiệm lớn nhất sống, và impostor là mẹo khéo léo làm chúng có thể chấp nhận được. Một billboard đơn giản (một hình ảnh phẳng quay để đối mặt camera) trông tốt ở phía trước nhưng làm phẳng và trượt không tự nhiên khi bạn di chuyển. Một impostor bát diện giải quyết điều này bằng cách pre-render cây từ nhiều điểm nhìn sắp xếp quanh một hình cầu, đóng gói chúng vào một atlas texture, và hiển thị bất kỳ góc đã bắt nào gần nhất với hướng camera hiện tại (blend giữa vài cái gần nhất). Kết quả đọc như một cây 3D thật từ bất kỳ góc nào với một phần nhỏ của chi phí, đó là lý do tại sao impostor là xương sống của các khu rừng xa đáng tin. Chúng được bake một lần và tốn hầu như không có gì để vẽ.

Dương xỉ và tầng dưới thấp trải trên sàn rừng Lớp mặt đất nhân số lượng instance nhanh chóng. Tầng dưới cần cùng kỷ luật như cây: instance hóa nó, LOD nó, và cull nó cứng: một cây dương xỉ ở 80 mét không nên vẽ chút nào.

Instancing và culling

Vẽ cây lặp lại như các instance để hàng ngàn cây tốn ít draw call, và cull mạnh mẽ: frustum-cull những gì ngoài màn hình và distance-cull thứ nhỏ. Instancing sửa chi phí CPU; culling ngăn bạn trả tiền cho cái vô hình.

Ngay cả với LOD hoàn hảo, gửi mười ngàn cây như các đối tượng riêng lẻ chôn CPU. Instancing sập tất cả các bản sao của một cây thành một nắm draw call, đó là điều không thể thương lượng cho một khu rừng thật, và đó chính xác là điều bake một scatter thành các instance native của engine cho bạn. Bên cạnh đó, cull không thương xót: frustum culling loại bỏ mọi thứ ngoài tầm nhìn, và distance culling loại bỏ clutter mặt đất và thảm thực vật nhỏ quá nhỏ để nhận thấy vượt qua một phạm vi nhất định. Cỏ và tầng dưới đặc biệt nên có khoảng cách cull cứng và gần, vì chúng nhân số lượng instance nhanh hơn cây. Một quy trình vẽ mật độ rồi bake thành các mesh được instance (như của Numivo) trao cho engine chính xác dạng đã batch và có thể cull mà một khu rừng rậm cần.

Giữ khu rừng rẻ còn sống

Tối ưu nặng có thể làm cho một khu rừng trông tĩnh và chết; chống lại nó bằng gió tinh tế trên các LOD gần, biến thể màu sắc và tỷ lệ giữa các instance, và tô bóng ngăn các impostor xa đọc như bìa các tông phẳng.

Rủi ro của tất cả hiệu quả này là một khu rừng chạy tuyệt vời và cảm thấy vô hồn. Ba lần chạm rẻ mang nó trở lại: gió: hoạt hình vertex trên các LOD gần để thảm thực vật gần di chuyển, ngay cả khi các impostor xa vẫn tĩnh (không ai nhận thấy một cây tĩnh ở 300 mét). Biến thể: ngẫu nhiên hóa tỷ lệ, xoay, và một tint trên mỗi instance để mắt không bắt được sự lặp lại; các cây giống hệt nhau là dấu hiệu sao chép-dán. Và sự chăm sóc tô bóng trên các impostor: bake ánh sáng của chúng để chúng không phẳng thành bìa các tông rõ ràng khi góc mặt trời thay đổi. Tiêu thời gian khung hình bạn đã tiết kiệm cho các chi tiết này ở gần, nơi người chơi thực sự nhìn, và khu rừng được tối ưu cảm thấy sống động như một khu rừng không được tối ưu, trong khi chạy nhanh hơn vài lần.

Những con số thực địa đáng đánh cắp

  • Nguyên tắc chi phí: trả theo khoảng cách, một cây xa không được tốn như một cây gần
  • Chuỗi LOD: mesh đầy đủ → giảm → cụm thẻ → impostor, mỗi cái ~cắt chi phí một nửa
  • Impostor = các góc pre-render trong một atlas → billboard 3D-ish từ bất kỳ tầm nhìn nào
  • Instance các sự lặp lại (ít draw call) + cull-cứng thảm thực vật nhỏ xa
  • Giữ nó sống: gió trên LOD gần + biến thể trên mỗi instance + tô bóng impostor đã bake

Hỏi-Đáp nhanh

Billboard vs impostor: khác biệt là gì? Một billboard là một hình ảnh phẳng đối mặt camera và phẳng khi bạn di chuyển xung quanh. Một impostor lưu trữ nhiều góc và hiển thị góc đúng, nên nó giữ trong 3D. Với bất cứ điều gì người chơi quỹ đạo hoặc đi qua, sử dụng impostor; các billboard đơn giản chỉ tốt cho các phông nền thực sự xa, tĩnh.

Một cây cần bao nhiêu cấp LOD? Thông thường ba đến bốn cộng một impostor. Nhiều hơn không tự động tốt hơn: mỗi cấp là chi phí sáng tạo và bộ nhớ. Đủ để làm cho mỗi lần hoán đổi một bước nhỏ, không nhận thấy là mục tiêu, không phải một mức tối đa.

Nanite có làm điều này lỗi thời không? Nó thay đổi phía hình học (Nanite xử lý chi tiết mesh dày mà không cần các LOD truyền thống), nhưng độ trong suốt (thẻ lá), kỷ luật instancing và culling vẫn quan trọng, và impostor vẫn hữu ích cho khoảng cách xa. Các nguyên tắc sống sót; công cụ dịch chuyển.

Điều gì giết hiệu năng rừng thường xuyên nhất? Overdraw từ các thẻ lá trong suốt chồng lên nhau, và thảm thực vật mặt đất không được cull. Siết chặt các thẻ lá, cull tầng dưới gần, và instance mọi thứ: bộ ba đó lấy lại phần lớn ngân sách trước khi bạn thậm chí chạm vào các mesh cây.

Một khu rừng rậm là một trong những thứ trừng phạt nhất để render và một trong những thứ đáng công nhất để làm đúng. Xây dựng chuỗi LOD, để các impostor mang khoảng cách, instance và cull không thương xót, và tiêu tiết kiệm của bạn cho gió và biến thể ở gần, và bạn sẽ có một khu rừng kéo dài đến chân trời giữ khung hình của nó.