2 điểm bởi GN⁺ 2025-05-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bản demo Nintendo 64 cho Revision 2025 tạo ra hiệu ứng gần giống normal mapping, ánh sáng bake sẵn và specular thời gian thực bằng cách chỉ cập nhật palette thay vì tính lại toàn bộ texture
  • Khi CPU đọc normal và màu khuếch tán ở mỗi chỉ mục palette rồi tạo palette RGB mới, texture dùng palette sẽ phản ứng như thể đã nhận chiếu sáng theo từng texel
  • Texture khuếch tán và normal map dùng chung cùng một chỉ mục palette, được tạo bằng K-means clustering của scikit-learn như thể đó là một ảnh 6 kênh
  • Ánh sáng trên tòa nhà kết hợp màu ambient trong RGB đỉnh, độ nhìn thấy mặt trời trong alpha đỉnh, irradiance map xám và ánh sáng mặt trời có hướng theo dot(N, sun_dir)
  • Kỹ thuật này hiệu quả với ánh sáng khuếch tán có hướng, nhưng bị hạn chế nhiều với bóng đổ, point light, specular chính xác và các mô hình lớn có texture lặp, nên phải che giấu giới hạn bằng tiền xử lý

Đổ bóng chỉ bằng cách cập nhật palette

  • Bản demo Nintendo 64 được làm cho Revision 2025 và sử dụng các hiệu ứng gần giống ánh sáng bake sẵn, normal mapping và specular shading thời gian thực
  • Trên N64, normal mapping từng được chứng minh là khả thi qua các thử nghiệm homebrew trước đây, và bản demo này chọn cách tính palette kết quả chiếu sáng khi chạy thay vì tính texture
  • Có thể chạy mã đổ bóng tùy ý trên CPU mà không cần hỗ trợ phần cứng chuyên dụng, nhưng tốc độ tính toán chậm
  • Với texture dùng palette, chỉ cần đổi palette thay vì toàn bộ texel, texture vẫn trông như đã được tính chiếu sáng trên toàn bộ bề mặt
    • Palette gốc được thay bằng palette đã đổ bóng
    • Texture dùng palette được áp lên vật thể như texture thông thường
    • Chỉ với ánh sáng khuếch tán đơn giản dot(N,L), kết quả đã trông khá ổn
  • Ví dụ ban đầu từng hoàn tác gamma correction của texture màu để đổ bóng trong không gian tuyến tính, nhưng không áp dụng được trong bản demo cuối vì phải tách riêng thành phần ambient và direct light rồi ghép bằng phần cứng trên khối RDP của N64

Normal mapping trong không gian vật thể

  • Normal mapping thông thường được thực hiện trong không gian tiếp tuyến
    • Có thể dùng texture lặp
    • Có thể hiệu chỉnh normal đỉnh thay đổi mượt bằng normal chi tiết
    • Normal map không gian tiếp tuyến với một màu duy nhất biểu diễn bề mặt trơn nhẵn
  • Normal không gian vật thể giúp tính toán đơn giản hơn nhưng bị ràng buộc nhiều
    • Texel trong normal map biểu diễn normal bề mặt tuyệt đối, không phải độ lệch so với normal đỉnh
    • Tính toán khi chạy đơn giản đến mức chỉ như đọc màu từ texture
    • Mỗi điểm trên bề mặt cần texel riêng như lightmap

Texture khuếch tán và normal map dùng chung palette

  • Vật thể có cả texture khuếch tán basecolor * ao và normal map
  • Hai texture dùng chung cùng chỉ mục palette, chỉ mục này được tạo bằng K-means clustering của scikit-learn
    • Các ảnh được diễn giải như một ảnh 6 kênh duy nhất
    • Chỉ với một chỉ mục có thể lấy ra cả normal lẫn màu khuếch tán bề mặt
  • Khi tải hoặc ở mỗi khung hình, hệ thống duyệt qua các màu trong palette
    • Mã shader trên CPU tạo màu RGB mới cho từng chỉ mục
    • Kết quả của vòng lặp trở thành palette mới đã được chiếu sáng
  • Trên thực tế, cách tiếp cận này phù hợp nhất với chiếu sáng có hướng
  • Chỉ với palette thì khó biểu diễn các hiệu ứng như bóng đổ, nên cần kết hợp với ánh sáng bake sẵn

Ambient có hướng và ánh sáng mặt trời bake sẵn

  • Để đưa ánh sáng chân thực hơn vào các tòa nhà trong demo, ambient và ánh sáng mặt trời trực tiếp được lưu tách riêng trong màu đỉnh
    • RGB đỉnh: màu ambient
    • Alpha đỉnh: độ nhìn thấy mặt trời
  • Thành phần ambient được tách thành cường độ có hướng và màu sắc
    • Cường độ có hướng là irradiance map thang xám
    • Màu sắc là RGB đỉnh đã tăng độ bão hòa
  • Mặt trời là nguồn sáng có hướng, còn độ nhìn thấy được truyền qua alpha đỉnh
  • Công thức đổ bóng như sau
ambient = vertex_rgb      * grey_irradiance_map(N)
direct  = vertex_alpha    * sun_color * dot(N, sun_dir)
color   = diffuse_texture * (ambient + direct)
  • Màu đỉnh biểu diễn độ nhìn thấy mặt trời có thể khá lộn xộn, nhưng được N.L che bớt nên kết quả direct light cuối cùng trông gọn hơn
  • Ambient có hướng giúp kết quả trông cao cấp ngay cả khi ánh sáng bake sẵn còn thô, nhờ chi tiết texture
  • Với environment map mờ, tác giả dùng equirectangular projection vì sự đơn giản của nó
    • HDRI của Polyhaven vốn đã dùng phép chiếu này
    • Vì phần đổ bóng được tính sẵn lúc tải, toán lấy mẫu phức tạp không còn là vấn đề

Xử lý mô hình lớn có texture lặp

  • Thuật toán đổ bóng ban đầu được thiết kế cho một vật thể đơn lẻ, và lúc đầu chỉ được thử với potato_rock.obj
  • Mesh thành lũy trong demo có texture lặp, gây ra vấn đề
  • Cách lách là chia mesh lớn thành nhiều submesh, rồi để mỗi submesh về mặt khái niệm chia sẻ cùng một normal map không gian vật thể
    • Trong Blender, hình học được nhóm thủ công theo vật liệu và hướng bề mặt
    • Tính ma trận world-to-model dựa trên normal polygon của từng nhóm
    • Ma trận này xấp xỉ gần với không gian tiếp tuyến
  • Mỗi nhóm dùng chung palette, nên toàn bộ chiếu sáng chỉ đúng theo nghĩa trung bình
  • Không gian tiếp tuyến không được nội suy khi chạy, nên kết quả trông như chiếu sáng theo từng mặt, đây là một trong những nhược điểm lớn nhất của kỹ thuật

Xấp xỉ specular shading

  • Vì nhiều điểm bề mặt dùng chung cùng một màu đổ bóng, rất khó tính chính xác point light hoặc specular shading
  • Cách tiếp cận trong không gian palette phù hợp với ánh sáng khuếch tán có hướng vốn không cần vector to cameraV
  • Hiệu ứng specular được thử bằng cách xấp xỉ vật thể như một hình cầu
    • Điểm cần đổ bóng p được đặt thành p = radius * normal
    • Vì nhiều điểm bề mặt dùng chung một chỉ mục palette, kết quả tất yếu sẽ bị góc cạnh
  • Highlight specular trong demo trông hơi kỳ, nhưng vẫn đủ để đánh lừa phần lớn người xem

Giới hạn và tài liệu liên quan

  • Trong demo, các giới hạn chính được che bớt bằng tiền xử lý và cách dựng cảnh
    • Đứt gãy ánh sáng và phạm vi biểu diễn

      • Chỉ hỗ trợ texture thang xám
      • Không có point light
      • Kỹ thuật này chỉ thực tế khi có tiền xử lý kỹ lưỡng
      • Kỹ thuật của Spooky Iluha không gặp vấn đề đứt gãy ánh sáng, nhưng chưa rõ liệu có thể giải quyết cùng vấn đề đó mà vẫn giữ cả ambient lẫn direct light hay không
    • ROM và nghiên cứu trước đây

1 bình luận

 
GN⁺ 2025-05-19
Các bình luận trên Hacker News
  • Thật sự ấn tượng khi thấy đồ họa chân thực trên N64, và bản demo này làm tôi nhớ đến "ICO" trên PS2
    Từ lâu tôi đã tự hỏi liệu có thể trừu tượng hóa phần cứng đồ họa của N64 để tạo một SDK cung cấp các primitive hiện đại, ánh sáng, shading, các công cụ bake sẵn ánh sáng như trong demo này, v.v. hay không
    N64 có phần cứng khá độc đáo so với cùng thế hệ, và có thông tin chi tiết trên Copetti.org: https://www.copetti.org/writings/consoles/nintendo-64/

    • N64 do SGI thiết kế, và nếu xét tầm ảnh hưởng của SGI đối với đồ họa 3D, tôi lại nghĩ N64 có lẽ là phần cứng gần với chuẩn nhất trong thế hệ đó
      Nếu không có thư viện OpenGL thì tôi mới thấy hơi ngạc nhiên
      Tuy nhiên có một điểm cần lưu ý lớn: 1) hệ thống này nên được xem như một card đồ họa có CPU gắn kèm, và 2) hệ thống đồ họa được phơi bày trực tiếp
      Kiến trúc chip đồ họa rốt cuộc rất dễ trở thành một mớ hỗn độn bẩn thỉu và không tương thích lẫn nhau, nên các nhà sản xuất accelerator thường thích công bố các API trung gian như OpenGL, DirectX, CUDA, Vulkan hơn là công bố tài liệu tham chiếu
      Làm vậy cho phép họ tiếp tục giữ phần triển khai bên trong ở các kiến trúc không tương thích. Nếu không công bố tài liệu tham chiếu thì cũng không cần duy trì tương thích ngược ở tầng phần cứng; ưu điểm là có thể tạo ra các thiết kế mới, nhưng nhược điểm là hầu như không ai có thể dùng trực tiếp
      Vì vậy khi có quyền truy cập trực tiếp như các console thế hệ đó, phản ứng bản năng là phát hoảng
      Nói thêm, OpenGL xuất phát từ SGI, và Nvidia cũng do các cựu kỹ sư SGI sáng lập
    • Cũng làm tôi nhớ đến Shadow of the Colossus: https://www.youtube.com/watch?v=xMKtYM8AzC8
  • Tôi thích việc một bài viết về các thủ thuật đồ họa N64 lại kết thúc bằng câu hỏi "Is this the future?"

    • Quy mô phát triển indie trên N64 dạo này đã lớn đến mức khó tin, và nền tảng này đang rất sôi động
      Khoảng hơn chục tựa game nổi tiếng đã được decompile thành các file nguồn có thể đọc được [1], khiến việc port sang PC không cần emulator trở nên dễ dàng hơn và cũng mở đường cho vô số bản mod chạy trên phần cứng gốc
      Cũng có nhiều bản remake của fan Zelda [2], cùng những game hoàn chỉnh có dungeon và cốt truyện mới
      Phía Mario 64 thì đặc biệt nóng, Kaze đã tối ưu sâu trò chơi [3] và cũng đang làm engine cùng phần tiếp theo của riêng mình. Nếu thích các phân tích chuyên sâu về công nghệ retro, kênh của anh ấy đúng là một mỏ vàng
      Cả những bản demo phi lý như Portal cũng xuất hiện [4], đáng tiếc là đã thu hút sự chú ý của bộ phận pháp lý Valve
      Những game thất lạc như Dinosaur Planet của Rare sau khi bị rò rỉ cũng đã được tinh chỉnh đến mức gần như có thể phát hành, được decompile và đang có một làn sóng phục hưng indie riêng [5]
      [1] https://wiki.deco.mp/index.php/N64
      [2] https://m.youtube.com/watch?v=bZl8xKDUryI
      [3] https://m.youtube.com/channel/UCuvSqzfO_LV_QzHdmEj84SQ
      Cả kênh đều rất hay, và có hàng chục phân tích chuyên sâu kiểu này: https://m.youtube.com/watch?v=DdXLpoNLywg
      Game và engine của anh ấy cũng rất đẹp: https://youtu.be/Drame-4ufso
      [4] https://m.youtube.com/watch?v=yXzoZ2AfWwg
      [5] https://m.youtube.com/watch?v=s0QSiPRmWaI
  • Mỗi lần thấy các kỹ sư game này thiên tài đến mức nào tôi đều kinh ngạc
    Trong những ràng buộc khổng lồ, họ đã tạo ra các giải pháp giàu trí tưởng tượng và tuyệt vời

    • Ràng buộc đòi hỏi và tạo ra sự sáng tạo phi thường
      Đó chính là bí mật của pico8, Animal Well và vô số game đáng kinh ngạc khác
      Giá mà cuối tuần này tôi đã không nghĩ ra một cấu trúc tốt hơn nhiều cho công cụ làm game pixel art 2D của mình. Giờ có vẻ phải mất thêm một tháng nữa mới phát hành được :(
    • Đây không phải là kỹ thuật được dùng thời hoàng kim của N64, mà là một công trình mới xuất hiện
    • Các kỹ sư thời đó chắc hẳn cũng rất giỏi, nhưng như đã nêu rõ, đây là công trình năm 2025 và gần với demoscene hơn là phát triển game
  • Giờ có các hệ thống nhanh hơn thì thật tuyệt, nhưng ngày xưa có cái thú phải lách qua các giới hạn trong game, và khi làm được đúng thì cảm giác thỏa mãn cực lớn
    Độc giả HN hẳn quen với raster interrupt(https://en.wikipedia.org/wiki/Raster_interrupt) và beam racing. Cá nhân tôi thì luôn liên tưởng nó với Atari 800
    Về nguyên tắc đáng lẽ không thể làm được những thứ như https://youtu.be/GuHqw_3A-vo?t=33, nhưng nhờ Display List Interrupts mà nó trở nên khả thi
    Điều mãi gần đây tôi mới biết là các game Atari 2600 đã dựa vào kiểu điên rồ này nhiều đến mức nào: https://www.youtube.com/watch?v=sJFnWZH5FXc
    Nhìn những thứ như vậy khiến tôi nghĩ rằng ngay cả khi tiến bộ phần cứng dừng lại, chúng ta vẫn có thể tiếp tục tìm ra những điều thú vị hơn trong hàng chục năm nữa

  • Demoscene và những công việc kiểu này rất ấn tượng, nhưng nhìn chung có xu hướng trôi về các cảnh đơn giản hơn và trống trải hơn
    Chúng gần với những thứ có thể đưa vào làm nền game hoặc một phần của cơ chế game. Với phần lớn kỹ thuật, có cảm giác tài nguyên không đủ để tạo nên một trải nghiệm hoàn chỉnh
    Ấn tượng hơn là những việc vắt ra hiệu năng tốt hơn nhiều từ phần cứng cũ, như FastDoom hay nhiều dự án tối ưu hóa Mario 64
    Đôi khi họ còn làm vậy trong khi vẫn thêm nội dung và tính năng. Tôi cũng tò mò liệu có điểm nối nào giữa các nhà phát triển demoscene và những công việc toàn diện hơn kiểu này không

  • Các game shareware thập niên 90 cũng dùng kỹ thuật chiếu sáng dựa trên bảng màu tương tự
    Về cơ bản, khi cấu hình bảng màu VGA 256 màu, họ đưa vào các dải chuyển sắc độ sáng N mức cho từng màu được hỗ trợ
    Như vậy có thể dễ dàng thay đổi độ sáng của mỗi màu chỉ bằng cách cộng hoặc trừ chỉ số màu

  • Tôi nhớ thời kỳ tối ưu hóa của PS1 và PS2
    Phần lớn, khi nâng lên 1080p hoặc 4K trở lên bằng giả lập thì trông thật sự rất đẹp. Cá nhân tôi thấy đồ họa cỡ thời Halo 2 mà xem ở 4K là đủ rồi
    Tất nhiên Halo 2 là game Xbox, nhưng nếu chơi Halo 2 trong Halo MCC với đồ họa cổ điển thì đến giờ vẫn trông đáng kinh ngạc
    Hiệu ứng ảo ảnh nhiệt trong GT3 tóm tắt điều đó rất hay
    "Trong bản demo GT3, họ trình chiếu đường đua Seattle lúc hoàng hôn, và có cảnh hơi nóng bốc lên từ mặt đất làm hình ảnh gợn sóng. Trên PS3 không thể tái hiện hiệu ứng ảo ảnh nhiệt đó, vì read-modify-write không còn nhanh như thời dùng PS2. Có những thứ như vậy đấy."
    https://old.reddit.com/r/ps2/comments/1cktw88/gran_turismos_...
    https://youtu.be/ybi9SdroCTA?t=4103
    Không phải là cố mô phỏng sóng nhiệt thực như các engine mới kiểu UE5, mà xử lý bằng mánh để không phá nát tốc độ khung hình. Thành thật mà nói, nhìn RTX ngốn tốc độ khung hình mạnh như vậy thì tôi thích các mánh rẻ tiền kiểu này hơn
    MIPS 299MHz chạy được những thứ như thế
    Shadow of the Colossus: https://www.youtube.com/watch?v=xMKtYM8AzC8
    GoW2: https://youtu.be/IpKLwIIdvuk?si=TjifKmlYsUuvhk0F&t=970
    FFXII: https://youtu.be/NytHoYOs_4M?si=jE1Fxy40khEvV6Bn&t=51
    GT4: https://www.youtube.com/watch?v=F6lZIxk_h9g (xem màn hình khởi động mà nghẹn ngào)
    Black, Renderware đúng là một engine điên rồ: https://youtu.be/bZBjcwyq7fQ?si=Pev5ifpksJm4X6Oi&t=356
    Valkyrie Profile 2: https://youtu.be/9ScjO4NuUtA?si=Z29cR-hLsT2pnP2I&t=38
    Rouge Galaxy: https://youtu.be/iR1evzyl-7Q?si=fldm3-NnuFxOITMn&t=624
    Burnout 3: https://www.youtube.com/watch?v=_r5r0nE1sA4
    Còn có Jak and Daxter, Ratchet nữa
    Phía GC thì RE4, Metroid, các bản Zelda v.v. hiển nhiên trông cực kỳ đẹp
    Phải quỳ gối luôn

    • Về PS2 thì đúng, nhưng PSX thì khó nói
      Nó có thể so được với Pentium 90, gần như 100, nhưng một MMX Pentium gắn 3DFX thì hẳn đã áp đảo PSX và ngang hoặc hơn N64
      CPU MIPS rất tuyệt, làm được những điều đáng kinh ngạc ngay cả ở xung nhịp thấp. Chỉ cần nhìn PSP hay SGI Irix là thấy
      Ngoài ra "GPU" của PS2 không giống với CPU R4k
      Thêm nữa, bản port Deus Ex trên PS2 rất tệ so với bản PC và không gánh nổi hoàn toàn Unreal engine
      Đúng là PS2 tạo ra những hiệu ứng điên rồ, nhưng trong bản port đó các màn chơi thật sự rất nhỏ. Cũng phải tính đến việc một phần lớn của Deus Ex gần như là open world
    • Tôi vẫn nghĩ Halo 3 trông đẹp hơn nhiều game hiện đại
      Những thứ như blur, bloom, pop-in của cỏ và thảm thực vật thực ra trông không đẹp, thậm chí còn tệ hơn so với tắt hết đi
      Trong một game bắn súng góc nhìn thứ nhất tốc độ nhanh, cũng chẳng có thời gian ngắm mô hình nhiều đa giác, nên tôi không biết điều đó có ý nghĩa gì
      Với mắt tôi, độ phân giải texture của Halo 3 là đủ. Dù texture có lớn gấp 2 hay 4 lần chắc tôi cũng không nhận ra, thứ dễ nhận thấy chỉ là yêu cầu phần cứng thôi
    • Câu "MIPS 299MHz chạy được cái này" chỉ đúng ở một mức nào đó
      Video GoW2 được capture trên PCSX2, và có khả năng đoạn clip đó hưởng lợi từ upscaling cùng các tính năng tiện lợi khác
      Tôi chưa xem hết các video còn lại, nhưng dù sao những gì GoW2 đạt được trên PS2 vẫn rất ấn tượng