11/02/2016, 22:56 -08:00 •
Phần hạ cánh mượt mà (seamless landing) thì mình đã hoàn tất và không gặp vấn đề gì lớn. Tuy nhiên, về mặt hình ảnh (visual), vẫn còn nhiều điểm chưa lý tưởng. Khi hạ cánh, người chơi phải đi qua một lớp khí quyển dày, và độ cao của nó khiến việc hiển thị chi tiết trên bề mặt đất gặp khó khăn. Trong No Man’s Sky, họ sử dụng một lớp mây để che mắt người chơi, đợi cho đến khi mây tan hết thì chỉ còn khoảng một nghìn đơn vị cách mặt đất. Lúc đó, việc hiển thị lượng lớn thảm thực vật không gây quá tải về hiệu năng. Mình thì chưa áp dụng mẹo này, vì vậy lúc cây cối xuất hiện, chúng “xuất hiện” một cách đột ngột và dễ thấy – không liên quan gì đến LOD. Mình dự định sẽ thêm một lớp mây giả lập để che tầm nhìn, đồng thời kết hợp việc sinh ra cây ở phía xa nhằm cải thiện trải nghiệm.
Hiện tại, mình mới chỉ thêm cây và cỏ vào cảnh, với khoảng bốn đến năm loại khác nhau. Mình đang sưu tập nhiều loại SpeedTree hơn nữa để dùng sau này. Việc sinh ra thảm thực vật vẫn còn khá thô sơ, code viết chưa tốt và còn nhiều chỗ cần tối ưu hóa. Dưới đây là một số vấn đề nổi bật:
-
Cỏ thường được vẽ theo dạng billboard – phương pháp này phù hợp để lấp đầy khung hình khi người chơi đứng dưới mặt đất, đặc biệt là góc nhìn thứ nhất. Tuy nhiên, trong trò chơi bay lượn, khi máy bay hạ thấp từ trên cao xuống, cách render này lại không hiệu quả. Billboard luôn hướng về camera nên góc nhìn của cỏ trông sai lệch. Mình đang cân nhắc giải pháp là cải tiến shader mặt đất, sử dụng hình nền cỏ với độ phân giải cao (khoảng 2K), mô phỏng cỏ thật trên bề mặt. Sau khi hạ cánh, mình sẽ chuyển sang hình nền đất đơn giản và bổ sung thêm cỏ dạng billboard để tăng chất lượng hình ảnh tổng thể.
-
Một vấn đề khác là cỏ không được batch động (dynamic batching), dẫn đến hàng loạt draw call, gây ảnh hưởng nghiêm trọng đến hiệu suất, đặc biệt trên iPad. Mình không thể dùng static batching vì cỏ không phải đối tượng tĩnh game nổ hũ 88 – mỗi khi camera di chuyển, cỏ sẽ bị dịch chuyển để luôn nằm trong tầm nhìn. Do đó, Unity không thể gộp mesh của cỏ lại. (Cập nhật: Mình vừa tìm ra nguyên nhân – mình đã bật WindZone trên tàu để mô phỏng hiệu ứng gió do tốc độ cao, điều này khiến SpeedTree không thể batching được. Tắt WindZone đi, gần như toàn bộ draw call đều giảm đáng kể. Trước đây mình cứ nghĩ rằng gió không ảnh hưởng!)
-
Hiện tại, cây cối chưa được sinh ra dựa trên height map của hành tinh, mà vẫn là ngẫu nhiên. Điều này không khó để thực hiện, nhưng mình vẫn chưa viết phần code này.
-
Về mặt biển, thông thường người ta chỉ cần đặt một mặt phẳng (plane) là xong. Nhưng vì đây là một hành tinh, mặt nước phải uốn cong theo hình cầu. Shader thông thường kết hợp với hình cầu sẽ gây ra lỗi. Giải pháp mình đang nghĩ đến là chia mặt cầu thành một phần tư (hoặc nhỏ hơn nữa) và cập nhật mesh liên tục trong quá trình hạ cánh. Khi chỉ còn một phần tư mặt cầu, mình sẽ dùng shader phản chiếu đơn giản để giữ hiệu suất ổn định. Khi tiếp cận mặt đất, mình sẽ chuyển sang một phần nhỏ hơn với shader có hiệu ứng khúc xạ để tạo cảm giác chân thực hơn cho mặt nước.
-
Thời tiết – mình sẽ xử lý sau. Vấn đề này không quá phức tạp, và s6666 đăng nhập vì đây là game mobile, yêu cầu về độ chính xác không cao. Mình sẽ tập trung vào phong cách hóa (stylization) hơn là mô phỏng siêu thực.
!Hình ảnh minh họa