1 điểm bởi GN⁺ 2023-12-21 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 scrollingMode 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

 
GN⁺ 2023-12-21
Ý 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

  • 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

    • Không hẳn vậy. Mode 7 chỉ có thể phóng to/thu nhỏ, dịch chuyển và xoay một layer trong 2D. Ví dụ trận đấu Bowser trong Super Mario World là một trường hợp dùng điển hình: Bowser di chuyển và đôi khi xoay, còn giữa các vòng thì phóng to/thu nhỏ để bay qua lại trông như “3D”
      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
    • Đúng là gần với fixed pipeline hơn
  • Đồ 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

    • Không hoàn toàn chính xác. NVIDIA không dự đoán trước AI, nhưng họ đã đầu tư vào tính toán mục đích chung từ rất sớm. Giá trị thị trường hiện tại là kết quả của việc kiên trì theo đuổi tầm nhìn đó trong 20 năm và thực thi tốt
    • Trước đó, các lĩnh vực như xử lý vector và SIMD vốn thuộc về những siêu máy tính kiểu Cray ngày xưa
  • 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ạ

    • Vì không render sprite ở tỉ lệ 1:1 nên chất lượng hình ảnh cũng giảm. Từ góc nhìn hiện đại, khi một chút 3D không còn gây ấn tượng nữa, mình nghĩ nó còn trông tệ hơn
    • Màn hình có cảm giác “gần” hơn nên thấy ít kẻ địch hơn. Với người chơi dùng phép thì đó là vấn đề
    • Thời đó, khi nhân vật di chuyển nhanh và có nhiều vật che như tường hay cây lướt qua, nó thật sự tạo được cảm giác 3D. Mình nhớ một số phần render còn làm hiệu ứng ánh sáng trông tốt hơn
  • 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?

    • Không hẳn. Game 3D hiện đại đặt camera ở vị trí tùy ý, dùng đại số tuyến tính để làm phẳng 3D thành không gian clip 2D rồi rasterize. Những game như D2 chỉ tạo ảo giác 3D bằng sprite và offset, ngay từ đầu đã không có hệ tọa độ 3D. Trong các game như vậy, chuyển động thường cũng bị giới hạn trên hai trục
      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
    • Đúng vậy. Bài viết gọi mặt phẳng 3D phẳng được triển khai bằng Mode 7 là “3D giả”, nhưng kết quả trông gần như y hệt một polygon đơn được map texture. Khác biệt chỉ ở chỗ “camera” cho phép thay đổi yaw và pitch, nhưng không cho roll
      Đó 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