Công nghệ “Parallax 7” kiểu Don’t Starve và Diablo
(simonschreibt.de)- Ngay cả trong thời kỳ game 2D khi 3D thực sự còn khó thực hiện, các nhà phát triển đã tạo cảm giác chiều sâu bằng parallax scrolling và Mode 7 của SNES; Perspective Mode của Diablo 2 cho thấy dòng kỹ thuật đó trong một ARPG 2D
- Don’t Starve xử lý bụi cây, cây cối và kẻ địch như asset phẳng nhưng vẫn tạo ra cảnh có cảm giác lập thể; Diablo 2, một game 2D năm 2000, tạo ấn tượng tương tự bằng cách kết hợp render mặt sàn và biến dạng sprite
- Perspective Mode của Diablo 2 không chỉ là hiệu ứng đơn giản dịch chuyển sprite, mà tạo ra một biến dạng như thể toàn bộ màn hình nghiêng về phía đường chân trời, làm lộ rõ điểm tụ và phối cảnh
- Blizzard chia sprite DT1 thành các mảnh 32×32px, và tùy theo giá trị orientation mà biến dạng các object như tường, hàng rào theo cách khác nhau để giảm khe hở trong cảnh
- Theo nội dung Gamasutra được công bố sau đó, Perspective Mode cần card đồ họa 3D; nó xoay, scale và stretch nhẹ texture của các mini-tile để tạo cảm giác chiều sâu và hiệu ứng parallax, và việc triển khai mất khoảng 1–2 tuần
Các kỹ thuật ban đầu giúp 2D trông như 3D
- Game thập niên 1990 bắt đầu chuyển từ 2D sang 3D, nhưng ngay cả trước khi có 3D thực sự, các nhà phát triển đã dùng nhiều thủ thuật để tạo màn hình trông như 3D
- Cách tiêu biểu là hiệu ứng parallax
- Tạo cảm giác chiều sâu bằng cách cho một số yếu tố di chuyển nhanh, một số yếu tố di chuyển chậm tùy theo khoảng cách
- Moon Patrol năm 1982 tạo cảm giác lập thể mạnh chỉ bằng việc cho nhiều mặt phẳng di chuyển ở các tốc độ khác nhau
- Mode 7 thời SNES không phải 3D thực sự, nhưng khiến màn hình trông có phối cảnh bằng cách thao tác texture mặt sàn
- Theo phần mô tả về GBA, có thể mô phỏng 3D mà không cần phần cứng 3D thực sự bằng cách thao tác giá trị scale và dịch chuyển theo từng scanline
- Cách này gần với việc thao tác texture để biến chiều cao thành cảm giác chiều sâu
Cách Don’t Starve và Diablo 2 tận dụng asset phẳng
- Ngày nay có thể render mọi asset bằng 3D thực sự, nhưng không phải cảnh nào cũng cần mô hình lập thể
- Bụi cây, cây cối và kẻ địch trong Don’t Starve là asset phẳng, nhưng vẫn cho kết quả thị giác đủ hấp dẫn
- Diablo 2 là một ARPG 2D ra mắt năm 2000, một ví dụ gợi nhớ đồng thời đến parallax kiểu Moon Patrol và cách biểu diễn mặt sàn kiểu Mode 7
- Diablo 2 ở thiết lập mặc định là màn hình 2D thuần túy
- Không có phối cảnh
- Cũng không có hiệu ứng parallax
- Khi bật Perspective Mode, cùng các pixel mặt sàn không còn bị cột liên tục che phủ, mà trông như các asset phẳng đang di chuyển trong một không gian có chiều sâu, giống Don’t Starve
Cách phân tích Diablo 2 Perspective Mode
- Vì Diablo 2 hầu như không có thông tin chính thức, Perspective Mode được xem xét bằng các công cụ trích xuất và phân tích file MPQ và DT1
- MPQ Editor được dùng để trích xuất file DT1 từ MPQ
- DT1 Tools được dùng để trích xuất file PCX từ DT1
- DT1 Tutorial được dùng để hiểu định dạng DT1
- Perspective Mode không phải hiệu ứng đơn giản dịch chuyển sprite từng chút một
- Khi so sánh màn hình bật và tắt chế độ ở cùng vị trí, mọi yếu tố đều cho thấy biến dạng như thể nghiêng về phía đường chân trời
- Nếu đưa họa tiết caro vào texture mặt sàn, biến dạng sẽ lộ rõ hơn
- Vì cảnh được cấu thành từ rất nhiều mảnh sprite, các khe hở ở ranh giới rất dễ xuất hiện trong quá trình biến dạng
- Diablo 2 vừa khớp các mảnh với nhau, vừa duy trì màn hình có phối cảnh
Mảnh 32×32 và giá trị orientation
- Blizzard chia sprite thành các phần 32×32px
- Trông giống một tối ưu hóa để chỉ tải phần hình ảnh cần thiết
- Điều này cũng có vẻ hữu ích khi áp dụng biến dạng trong Perspective Mode
- Nếu vẽ các đường cách nhau 32px lên texture cột để nhìn như wireframe giả, các đường dọc hiện ra như đang hướng về điểm tụ nằm sâu dưới mặt đất
- Ở một số sprite, mép dưới trông bị cong
- Nếu chỉ xét phối cảnh thì độ cong đó không nhất thiết cần thiết
- Biến dạng này thay đổi tùy theo góc nhìn sprite hoặc vị trí người chơi/camera
- Trong định dạng DT1, sprite có thể có giá trị orientation
- Theo tài liệu của Paul Siramy, cách biến dạng sprite có thể khác nhau tùy theo giá trị hướng
- Ví dụ bao gồm các hướng tường như Left Wall, Upper Wall, Lower-Left corner
- Các sprite có hướng khác nhau, như tường hay hàng rào, được biến dạng theo các cách khác nhau
- Trong một số trường hợp, mép trên/dưới không bị cong, còn các đường biên trông như đang hướng về điểm tụ ở bên trái
- Game dường như hơi phóng đại biến dạng để tránh khe hở, và các sprite hàng rào khớp với nhau khá tốt
- Nếu gán cùng một bức tường với giá trị orientation sai, khe hở sẽ xuất hiện giữa các sprite
Thông tin bổ sung được công bố và các trường hợp tương tự
- Perspective Mode trong Diablo 2 chỉ có thể kích hoạt khi chạy D3D toàn màn hình
- Diablo 2 cũng hỗ trợ Glide và Software Rendering
- Đã thử tìm thêm thông tin trong tài liệu DirectX cũ nhưng không có kết quả
- Trong bản cập nhật sau đó, một liên kết liên quan đến biến dạng hình ảnh đã được thêm vào
- image aberration trông rất giống dạng méo thấy trong Perspective Mode của Diablo 2
- Không rõ nhà phát triển Diablo 2 có thực sự dùng nó hay không
- Bài viết Gamasutra do Paul Siramy chia sẻ nêu trực tiếp hơn cách triển khai Perspective Mode
- Để bật Perspective Mode, cần có card đồ họa 3D
- Diablo II cấu thành các tile kim cương lớn từ nhiều tile kim cương nhỏ hơn, dùng một lưới chi tiết hơn
- Texture của từng mini-tile được xoay nhẹ, card đồ họa phủ chúng lên hai polygon, rồi kéo giãn theo chiều dọc/ngang để trông lớn hơn hoặc nhỏ hơn tùy theo vị trí nhân vật
- Cây cối và công trình trông thay đổi kích thước khi lại gần hoặc ra xa, cuộn với tốc độ khác các object tiền cảnh/hậu cảnh, tạo ra hiệu ứng parallax
- Hiện tượng object hơi lấp lánh được giải thích là kết quả của bilinear filtering trên card đồ họa
- Trong Perspective Mode, cả nhân vật, vật phẩm, cũng như các cấu trúc như chòi và tháp ở Act I đều được phóng to/thu nhỏ
- Theo giải thích của Dave, họ đã dùng toán học 3D thực sự để scale và stretch lưới một chút, tạo cảm giác chiều sâu
- Việc triển khai mất khoảng 1–2 tuần, cần xử lý căn chỉnh tường và ánh sáng, còn các họa sĩ phải cắt lại object và render theo cách khác
- Trong bản cập nhật 3, Cultures cũng được bổ sung như một ví dụ sử dụng thủ thuật phối cảnh 2D tương tự
1 bình luận
Ý kiến trên Hacker News
Đây từng là một mục trong danh sách những điều mình tò mò, giờ thì có thể xóa được rồi. Nếu có ai biết bầu trời trong World of Warcraft được tạo ra như thế nào, và ở mức độ ít hơn là địa hình của Warcraft 3 được tạo ra ra sao, thì rất mong được chia sẻ
Mình vẫn nghĩ địa hình Warcraft 3 có vẻ là một cách dùng marching squares rất khéo. Đã tò mò hơn 10 năm rồi; các tính năng như ngày/đêm/mây/trăng/sao thật sự ấn tượng, đẹp và nhẹ, có vẻ chỉ cập nhật cách khung hình mà vẫn rất tự nhiên. Có lẽ không phải render-to-texture, nó mượt đến mức không thấy polygon hay texel, lại chạy được trên máy tính năm 2002, nên đúng là một kỳ quan tech art
https://simonschreibt.de/gat/homeworld-2-backgrounds/
http://simonschreibt.de/gat/homeworld-2-backgrounds-tech/
[1] https://www.hiveworkshop.com/attachments/wc3search-tutorial0...
[2] https://www.hiveworkshop.com/attachments/15-jpg.7734/
Tóm lại là cấu trúc chồng nhiều mesh skybox lên nhau
Nhờ những người vận hành Project Diablo 2[1] mà mình vẫn còn chơi D2. Chế độ phối cảnh ở 144fps thật sự rất đẹp, và khá khó để quay lại client LoD gốc ở 30fps
Đến giờ mình vẫn còn ký ức và hoài niệm về việc đi xuống những bậc thang ngoằn ngoèo ở Pandemonium Fortress, choáng ngợp trước phần đồ họa đẹp — có lẽ nói là rợn người thì hợp hơn
[1] https://www.projectdiablo2.com/
Mình xem Mode 7 về bản chất gần như là một bộ tăng tốc 3D nguyên thủy. Nó render một mặt phẳng texture duy nhất với nhiều phép biến đổi, nên về nguyên lý có thể gọi là “3D thật” chẳng kém GPU hiện đại, chỉ là rất hạn chế và độ chính xác thấp
Các hack 3D thuyết phục hơn đến từ bộ xử lý phụ trong cartridge. Những game như Super Mario Kart dùng chip bổ sung để tính nhanh các tham số Mode 7 mới cho từng scanline; nếu thay đổi phóng to/thu nhỏ và dịch chuyển theo từng dòng nhưng giữ nguyên xoay, thì các dòng phía trên trông nhỏ hơn, các dòng phía dưới trông lớn hơn, tạo cảm giác 3D nghiêng
Cách “thay đổi tỉ lệ phóng theo từng scanline” này rất khác GPU hiện đại và cũng không phải phép biến đổi tùy ý. Chẳng hạn với kỹ thuật này, chỉ có thể xoay mặt phẳng quanh trục ngang, không thể xoay quanh trục dọc
Đồ họa máy tính thời kỳ đầu lúc nào nhìn cũng đáng kinh ngạc. Mình tin chắc nếu không có đóng góp của hoạt hình và đồ họa máy tính sơ khai, cả phần mềm lẫn phần cứng hiện nay sẽ tụt lại vài thế hệ
Nhìn NVIDIA thì thấy, việc cùng một kiến trúc lại hữu ích cho các dạng machine learning và “trí tuệ nhân tạo” sơ khai gần như là may mắn, nhưng bản thân công ty được xây dựng trên nền tảng đồ họa máy tính
Việc mép dưới của sprite bị cong như vậy có lẽ là cần thiết để bắt chước điểm tụ ở “bên dưới” mặt đất đối với các sprite dựng đứng theo chiều dọc. Nếu ba cọc xoay và xòe ra phía ngoài ở phần trên, thì phần dưới cũng phải xoay theo ở mức nào đó; một phép nghiêng đơn giản hẳn sẽ trông rất kỳ
Trong cảnh 3ds Max, nó đặt chính diện trong viewport và lại là texture hình vuông nên phép nghiêng có vẻ ổn, thành ra khác biệt không lộ rõ. Trong ví dụ chuyển động, nếu nhìn gần thực tế hơn thì ba cọc đúng ra phải tách ra theo góc nhìn khi tiến gần hơn, còn bản render 3ds Max không thể hiện tốt điều này
Bài viết này tập trung vào parallax trong game, nhưng hiệu ứng parallax có lịch sử lâu đời trong hoạt hình
Máy quay multiplane của Disney và các tiền thân của nó đã tồn tại gần 100 năm. Ngay cả với ảnh 2D cũng có thể dùng nhiều thủ thuật khác nhau để dựng cảnh có chiều sâu
https://en.wikipedia.org/wiki/Multiplane_camera
Có vẻ các nhà phát triển khá hài lòng với hiệu ứng parallax, nhưng mình không nhớ là đã từng dùng nó. Có lẽ vì đã quen với thiết lập mặc định nên nó chỉ khiến mình thấy lạ
Người ta nói 3D trong các game cũ kiểu này “không phải thật”, nhưng game 3D hiện đại rốt cuộc cũng hiển thị trên màn hình phẳng. Vậy chẳng phải về cơ bản chúng cũng không phải 3D thật theo cùng nghĩa đó sao?
Một khác biệt quan trọng nữa là sprite được render sẵn. Trong các game như Roller Coaster Tycoon hay Diablo, mô hình được tạo trên những máy tính chuyên dụng đắt tiền rồi render thành sprite sheet. Dù object trông như 3D, chúng thường được phân phối dưới dạng asset phẳng. Một số game pixel art hiện đại còn kèm normal map để áp dụng ánh sáng động cho sprite 2D
Hiệu ứng parallax trong game hiện đại có thể được triển khai dễ dàng chỉ bằng cách render object phẳng trong một cảnh 3D, nhưng pipeline đồ họa 20 năm trước rất khác, nên muốn tạo hiệu ứng 3D thì phải thông minh hơn nhiều
Đó chỉ là giới hạn của các tình huống 3D mà hệ thống Mode 7 có thể render, chứ không có nghĩa bản thân thứ được render ra là giả hơn. Rốt cuộc mọi phương thức render 3D đều thao tác trên lưới pixel 2D của màn hình để tạo ảo giác như đang nhìn các vật thể ảo