Bên trong Sonic 06: Những hiệu ứng đồ họa bị cắt bỏ vì áp lực thời gian
Một phân tích kỹ thuật sâu về Sonic 06 cho thấy phần lớn hiệu ứng hình ảnh bị cho là "mất tích" thực chất vẫn còn trong mã game nhưng bị vô hiệu hóa để đảm bảo hiệu năng. Câu chuyện là bài học về cái giá của việc ép tiến độ phát hành và những hạn chế của shader, ánh sáng động và bóng đổ trong thời kỳ đầu của PS3/Xbox 360.

Sonic 06 vẫn luôn là cái tên gắn liền với sự thất vọng, nhưng ít ai biết rằng phía sau tựa game này là một kho tàng nội dung bị cắt bỏ khổng lồ. Một bài phân tích kỹ thuật mới đây của lập trình viên Isaac Marovitz, thực hiện trong quá trình phát triển dự án Marathon Recompiled, đã hé lộ chi tiết cách Sonic Team phải hy sinh đồ họa để kịp ngày phát hành.
Bài viết đào sâu vào hệ thống render của game và phát hiện ra một sự thật trớ trêu: phần lớn hiệu ứng bị coi là "biến mất" thực chất vẫn nằm nguyên trong đĩa game, chỉ đơn giản là không được bật lên.
Đồ họa đẹp và xấu nằm chung một đĩa game
Chất lượng hình ảnh trong Sonic 06 không đồng đều một cách khó hiểu. Crisis City có phản chiếu, hiệu ứng hạt và ánh sáng kịch tính, trong khi Castle Town lại phẳng lì và ảm đạm đến khó tin.
Câu trả lời nằm ở hệ thống shader. Hầu hết mọi thứ trong game được render bằng shader Terrain hoặc Billboard, mỗi loại có nhiều biến thể với các mức tính năng từ 00 đến 07. Theo quy luật chung, con số càng cao thì bộ tính năng càng đầy đủ.
Shader được dùng nhiều nhất trong toàn bộ game là Billboard02 – không phải bản tệ nhất, nhưng chắc chắn thuộc nhóm tệ nhất.
Biến thể này chỉ hỗ trợ chiếu sáng theo đỉnh (per-vertex), không có bóng đổ CSM và không có đèn điểm. Đó là lý do vì sao phần lớn cảnh trong game trông nhạt nhòa: hầu hết mọi thứ chỉ được render bằng texture albedo cơ bản và ánh sáng môi trường.
So sánh cảnh quan trong Sonic 06 với các mức shader khác nhau
Bóng đổ và ánh sáng: những hy sinh lặng lẽ
Hệ thống bóng đổ của game được thiết kế cho tối đa 4 tầng cascade, mỗi tầng phủ một vùng trong tầm nhìn camera để giữ mật độ điểm ảnh ổn định. Tuy nhiên, ở các màn như twn_a (Castle Town) và một số màn test, số tầng bị hạ xuống còn 3 cho địa hình và chỉ 2 cho vật thể, khiến khoảng cách đổ bóng ngắn hẳn đi. Chế độ nhiều người chơi còn bị giảm ở mọi màn.
Ngay cả khi bóng đổ hoạt động đúng, chúng vẫn thường xuyên gặp hiện tượng shadow acne – lỗi hình ảnh quen thuộc khi dùng kỹ thuật này. Cách khắc phục thông thường là thêm một giá trị epsilon nhỏ vào mẫu shadow map, nhưng Sonic Team đã không làm vậy.
Đáng tiếc hơn là hệ thống đèn điểm. Sonic 06 trên lý thuyết có hệ thống chiếu sáng khá linh hoạt, nhưng số đèn điểm trên mỗi vật thể bị giới hạn ở 2. Một số màn như Kingdom Valley tuân thủ giới hạn này khá tốt, trong khi Flame Core và Dusty Desert lại cố render tới hơn 8 đèn mỗi vật thể. Kết quả là renderer rối loạn và các đèn "tranh nhau" độ ưu tiên, khiến chúng xuất hiện hoặc biến mất gần như ngẫu nhiên.
Cảnh quan trong game với ánh sáng động bị quá tải
Đội ngũ phát triển từng cố gắng tối ưu bằng cách phân bổ đèn điểm cho các vật thể gần nhau, nhưng logic kiểm tra này bị lỗi – có thể do giới hạn bị hạ xuống gấp trong giai đoạn cuối và việc chuyển nhiều vật thể từ chiếu sáng per-pixel sang per-vertex. Hệ quả là đèn điểm hiếm khi hoạt động trong bản gốc.
Phản chiếu thời gian thực và cú lừa ở chế độ nhiều người chơi
Sonic 06 thực sự có phản chiếu phẳng theo thời gian thực (planar reflection), dù độ phân giải bị giới hạn ở 1/4 framebuffer. Ở chế độ nhiều người chơi, để tránh phải render phản chiếu hai lần cho màn hình chia đôi, Sonic Team đã loại bỏ hoàn toàn và thay bằng cubemap tĩnh.
Thay đổi này khiến Kingdom Valley từ một cảnh quan ấn tượng biến thành một đầm lầy ảm đạm. Vấn đề nằm ở chỗ render graph của game được dựng bằng Lua script, và hai chế độ chơi dùng hai script khác nhau. Hàm RenderReflection() quan trọng hoàn toàn vắng mặt trong render_gamemode_multi.lua, và ngay cả khi thêm vào, nó cũng không tương thích với kiến trúc hai framebuffer của màn hình chia đôi.
Sonic 06 còn rất nhiều thứ để trao đi, và thật đáng buồn khi Sonic Team không được trao đủ thời gian để hoàn thiện nó.
Bài học cho ngành phát triển game
Câu chuyện của Sonic 06 không chỉ là chuyện của riêng một tựa game. Nó phản ánh áp lực crunch – làm việc quá giờ kéo dài – và việc ép tiến độ phát hành mà nhiều studio vẫn đang phải đối mặt. Các tính năng đồ họa thường là thứ đầu tiên bị cắt bỏ khi tiến độ trở nên cấp bách.
Với cộng đồng người hâm mộ và các dự án như Marathon Recompiled, những hiểu biết về backend của game mở ra hy vọng khôi phục dần dần các hiệu ứng trong bản beta. Nhưng việc sửa shader vẫn là một bài toán khó, bởi mỗi biến thể có bố cục đầu vào/đầu ra khác nhau và mã chiếu sáng đèn điểm đã bị "unroll" thẳng vào bytecode.
Hình ảnh từ nội dung beta của Sonic 06
Dù vậy, mỗi phát hiện mới đều đóng góp trực tiếp vào các bản vá trong tương lai. Và nhân dịp kỷ niệm 20 năm ra mắt, có lẽ đây là cách phù hợp nhất để nhìn lại một tựa game từng bị xem là thảm họa – nhưng thực ra chất chứa nhiều tiềm năng chưa được khai phá.