2 điểm bởi GN⁺ 2025-05-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bài viết này giải thích kỹ thuật chiếu sáng dựa trên bảng màu và normal mapping được áp dụng trong quá trình phát triển demo cho Nintendo 64
  • Thay vì phản ánh lighting trực tiếp lên texture theo thời gian thực, bài viết giới thiệu cách chỉ thay đổi bảng màu để tạo hiệu ứng chiếu sáng cho toàn bộ texture
  • Nhiều kỹ thuật tối ưu hóa khác nhau được sử dụng như nén bảng màu diffuse/normal và normal mapping trong không gian đối tượng
  • Cách này chỉ hiệu quả với ánh sáng có hướng, và có các nhược điểm như sự gián đoạn trong shading
  • Trong demo, nhiều yếu tố như ánh sáng phản xạ/ánh sáng trực tiếp/ánh sáng môi trường được kết hợp sáng tạo để tạo nên hình ảnh ấn tượng trong giới hạn của N64

Giới thiệu và mục tiêu

  • Bài viết này là phần tiếp nối của thread bắt đầu trên Bluesky, chia sẻ kỹ thuật lighting tiên tiến được dùng trong một demo cho Nintendo 64 (Revision 2025)
  • Demo có nhiều hiệu ứng như normal mapping với ánh sáng phản xạ, chiếu sáng phản xạ thời gian thực, và phần nhạc do noby sáng tác, Moloko chơi guitar

Khả năng normal mapping trên Nintendo 64

  • Tác giả kiểm chứng khả năng triển khai normal mapping trên N64 bằng cách tham khảo các thử nghiệm của những nhà phát triển homebrew như WadeTyhon và Spooky Iluha
  • Cách cơ bản là tính toán ánh sáng trực tiếp lên texture trên CPU khi chạy
  • Có thể chạy mã shading tùy biến trên CPU mà không cần hỗ trợ phần cứng, nhưng vấn đề lớn là tốc độ bị giảm đáng kể

Shading dựa trên bảng màu

  • Thay vì áp dụng shading trực tiếp trong không gian texture, chỉ cần cập nhật dữ liệu bảng màu của texture dùng bảng màu là toàn bộ texture có thể phản ánh thay đổi độ sáng theo thời gian thực
  • Trên N64, việc dùng texture bảng màu là rất phổ biến nên cách này có thể tận dụng rộng rãi
  • Chỉ cần cập nhật bảng màu cũng đủ để hiệu ứng như thể ánh sáng thực sự được áp dụng cho từng texel xuất hiện ngay lập tức
  • Bảng màu gốc được thay bằng bảng màu đã áp dụng shading, còn texture bảng màu hiện có được ánh xạ lên đối tượng như texture thông thường
  • Chỉ áp dụng lighting khuếch tán diffuse (dot(N,L)) thôi cũng cho kết quả rất ấn tượng

Normal mapping trong không gian đối tượng

  • Thông thường, normal mapping được thực hiện trong không gian tiếp tuyến, phù hợp để hỗ trợ texture lặp và hiệu chỉnh bề mặt tự nhiên
  • Normal map trong không gian đối tượng cho phép mỗi texel mang thông tin pháp tuyến bề mặt chính xác, nên việc tính toán đơn giản hơn, nhưng khó tận dụng texture lặp
  • Ngay cả khi nén normal map độ phân giải cao xuống bảng màu 32 màu, vẫn có thể giữ được các đặc tính tương tự bản gốc

Thiết kế bảng màu chia sẻ giữa diffuse và normal

  • Đối tượng có diffuse texture (basecolor * ao) và normal map
  • Cả hai texture được cấu hình để cùng chia sẻ các chỉ số bảng màu giống nhau được tạo bởi thuật toán phân cụm K-means
  • Quá trình phân cụm được thực hiện bằng cách xem ảnh như một ảnh 6 kênh
  • Trong ví dụ, diffuse RGB + normal map được nén vào bảng màu 16 màu, nên dữ liệu ảnh chỉ cần ghi ở mức 4bpp
  • Khi shading, thông tin normal và màu bề mặt của từng màu trong bảng màu được tra cứu theo chỉ số để tạo ra màu RGB mới
  • Cách này chỉ thực sự hỗ trợ tốt ánh sáng có hướng, và rất khó triển khai bóng đổ chỉ bằng bảng màu

Ánh sáng môi trường/ánh sáng mặt trời có hướng được bake sẵn

  • Để tạo lighting chân thực cho các tòa nhà, RGB và kênh alpha của vertex color lần lượt được dùng cho ánh sáng môi trường và ánh sáng mặt trời

  • Ánh sáng môi trường (ambient) được tách thành cường độ có hướng (environment map thang xám) và màu sắc (RGB, tăng độ bão hòa)

  • Ánh sáng mặt trời (direct) được truyền qua alpha của vertex

  • Công thức lighting cơ bản như sau

    ambient = vertex_rgb      * grey_irradiance_map(N) 
    direct  = vertex_alpha    * sun_color * dot(N, sun_dir)
    color   = diffuse_texture * (ambient + direct)
    
  • Mỗi hạng tử được cộng lại để tạo màu cuối cùng

  • Ánh sáng môi trường có hướng tạo ra hiệu ứng ánh sáng tự nhiên rất đầy đặn, và dù dựa trên bảng màu vẫn thể hiện được chất cảm có chất lượng cao

  • Để đơn giản hóa, environment map sử dụng phép chiếu equirectangular projection

Shading cho mô hình lớn dùng texture lặp

  • Thuật toán ban đầu dành cho một đối tượng đơn lẻ, nên gặp vấn đề với mesh lâu đài lớn do sử dụng texture lặp
  • Để giải quyết, tác giả dùng Blender để tách mesh thành các submesh theo hướng bề mặt/vật liệu
  • Máy tính dùng pháp tuyến polygon của từng nhóm để tính ma trận world-to-model (một dạng không gian tiếp tuyến gần đúng)
  • Mỗi nhóm chia sẻ một bảng màu, nhờ đó chất lượng lighting trung bình trên toàn bộ mô hình được đảm bảo
  • Do không gian tiếp tuyến không được nội suy ở thời gian chạy, nên có nhược điểm là xuất hiện lighting kiểu mặt phẳng bị vát

Shading specular (ánh sáng phản xạ)

  • Vì nhiều điểm bề mặt cùng chia sẻ một màu trong bảng màu, nên không thể thực hiện shading ánh sáng điểm/ánh sáng phản xạ chính xác
  • Kỹ thuật trong không gian bảng màu chỉ hiệu quả với lighting khuếch tán có hướng
  • Dù vậy, bằng cách giả định vật thể có dạng cầu, tác giả cưỡng ép tạo hiệu ứng phản xạ specular bằng cách xấp xỉ mỗi điểm là p = radius * normal
  • Kết quả có phần gián đoạn, nhưng khi chơi thực tế vẫn có thể mang lại cảm giác khá tự nhiên

Giới hạn và tương lai

  • Trong demo, tác giả cố gắng che giấu tối đa các hạn chế như gián đoạn shading, chỉ hỗ trợ texture đen trắng, không hỗ trợ point light

  • Tiền xử lý phức tạp là điều bắt buộc

  • Cách hỗ trợ cả ánh sáng ambient/direct mà không có gián đoạn shading vẫn là một thách thức

  • Tác giả nhấn mạnh sự thú vị của những khả năng và ý tưởng mới rút ra từ quá trình thử nghiệm

  • File PAL-compatible N64 ROM cũng được công bố. Tuy nhiên, bản này không ổn định và thường xuyên bị crash

Khác

  • Tác giả cũng đang cân nhắc viết sách, và nếu quan tâm có thể nhận tin tại đây

1 bình luận

 
GN⁺ 2025-05-19
Ý kiến Hacker News
  • Chia sẻ cảm nhận rằng việc nhìn thấy đồ họa “chân thực” trên N64 là một trải nghiệm thực sự ấn tượng, và demo này gợi nhớ đến "ICO" trên PS2. Đồng thời bày tỏ sự tò mò về khả năng tạo ra một SDK có thể trừu tượng hóa phần cứng đồ họa của N64 và cung cấp các công cụ hiện đại về primitive, lighting, shading, baked lighting. Cũng nhắc đến việc phần cứng N64 có cấu trúc rất đặc trưng của riêng thế hệ đó, kèm liên kết tới thông tin phần cứng chi tiết

    • Nhắc đến việc N64 được SGI thiết kế, và SGI đã ảnh hưởng lớn đến đồ họa 3D như thế nào. Cho rằng N64 có lẽ lại là phần cứng tiêu chuẩn nhất trong thế hệ đó. Thậm chí sẽ rất đáng ngạc nhiên nếu nó không có thư viện OpenGL. Điểm hạn chế là phải xem chiếc console này như một card đồ họa được gắn thêm CPU, và hệ thống đồ họa bị lộ ra trực tiếp. Kiến trúc chip đồ họa không tương thích lẫn nhau, các hãng thường tránh công khai cấu trúc nội bộ này và chỉ cung cấp API như OpenGL, DirectX để cho phép thiết kế sáng tạo, còn việc truy cập trực tiếp phần cứng thì rất khó. Bổ sung thêm rằng OpenGL có nguồn gốc từ SGI, và nvidia cũng được thành lập bởi những người xuất thân từ SGI

    • Nhắc đến "Shadow of the Colossus..." và chia sẻ một liên kết YouTube liên quan

  • Bày tỏ sự thích thú với việc bài viết về các mẹo đồ họa N64 kết thúc bằng câu hỏi "Đây có phải là tương lai không?"

    • Giải thích rằng phong trào phát triển indie cho N64 hiện nay đang cực kỳ sôi động. Hàng chục game nổi tiếng đã được decompile và công khai mã nguồn, khiến việc port sang PC trở nên dễ dàng hơn, đồng thời cũng có nhiều bản mod chạy trên phần cứng thật. Nhấn mạnh các ví dụ như fan remake Zelda, những game hoàn chỉnh mới với dungeon và cốt truyện mới, cộng đồng Mario 64 hoạt động rất mạnh về tối ưu kỹ thuật, nhân vật tên Kaze phát triển engine riêng và tạo cả phần tiếp theo, cùng khuyến nghị các video phân tích kỹ thuật chuyên sâu. Cũng giới thiệu sinh động các trường hợp demo kỳ lạ như Portal, câu chuyện từng bị Valve để ý về mặt pháp lý, và hiện tượng Dinosaur Planet — tác phẩm chưa phát hành của Rare — bị rò rỉ rồi được decompile, phục hồi và sống lại trong giới indie, kèm nhiều liên kết chi tiết
  • Thể hiện sự thán phục trước thiên tài của các kỹ sư game đã tìm ra những lời giải sáng tạo trên phần cứng bị giới hạn

    • Chia sẻ nguyên tắc rằng chính khi có ràng buộc thì sự sáng tạo ở mức cao nhất mới xuất hiện. Đó cũng là bí quyết của pico8, Animal Well và nhiều game ấn tượng khác. Đồng thời than thở rằng cuối tuần này lại nảy ra ý tưởng cải tiến lớn cho kiến trúc của 2d-pixel-art-game-maker-maker do mình tạo ra, nên có lẽ ngày phát hành sẽ lại bị lùi thêm một tháng

    • Cho biết nội dung được giới thiệu lần này không phải là từ thời kỳ đỉnh cao của N64, mà là một tác phẩm mới được thực hiện gần đây

    • Làm rõ rằng đây không phải kỹ thuật từ các nhà phát triển N64 thời đó, mà là công nghệ mới gắn với demoscene tính đến năm 2025

  • Hồi tưởng rằng ngày nay hệ thống nhanh hơn thì tốt hơn, nhưng niềm vui khi vượt qua giới hạn trong các game cũ và cảm giác thỏa mãn khi thực sự làm được điều đó là rất đặc biệt. Giải thích rằng người dùng Hacker News hẳn sẽ quen với các khái niệm 'raster interrupts' và 'racing the beam', rồi kể một giai thoại về việc trên Atari 800 người ta đã dùng những kỹ thuật đó để làm điều vốn là bất khả thi. Cũng nói rằng chỉ gần đây mới biết các game Atari 2600 chịu ảnh hưởng rất mạnh từ những cách làm điên rồ như vậy, kèm tài liệu YouTube. Và giữ niềm tin 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 khám phá những mẹo mới thú vị trong nhiều thập kỷ tới

  • Hồi tưởng kinh nghiệm từng dùng kỹ thuật lighting dựa trên palette trong game shareware của nhóm vào thập niên 90. Khi đó palette VGA 256 màu được sắp xếp để mỗi màu có nhiều mức sáng tối chuyển dần, nhờ vậy chỉ cần cộng hoặc trừ chỉ số màu là có thể dễ dàng tạo hiệu ứng độ sáng

  • Quan sát rằng demoscene và những công việc như thế này quả thật rất đáng kinh ngạc, nhưng thường có xu hướng thiên về các cảnh đơn giản và trống trải. Phân tích rằng những kỹ thuật này phần lớn chỉ phù hợp cho background hoặc một số chức năng game hạn chế. Cho rằng các nỗ lực như FastDoom hay dự án tối ưu Mario-64 — nơi người ta tăng hiệu năng đáng kể trên phần cứng cũ mà còn bổ sung thêm nội dung và tính năng — mới thực sự ấn tượng hơn. Đồng thời suy nghĩ rằng có lẽ vẫn tồn tại mối liên hệ giữa demoscene và những dự án hoàn thiện hơn kiểu này

  • Bày tỏ nỗi nhớ các kỹ thuật tối ưu thời PS1 và PS2. Cảm nhận rằng phần lớn game vẫn trông rất đẹp ngay cả khi được upscale qua giả lập lên 1080p hay hơn 4k. Nêu ý kiến rằng đồ họa Halo 2 ở 4k là đã đủ, và lấy ví dụ demo hiệu ứng "heat haze" thực sự được tạo ra trong GT3, trích lời nhà phát triển rằng trên PS3 không thể làm nhanh như trên PS2. Cho rằng thay vì kiểu heat haze chân thực của UE5 ngày nay, những mẹo tạo hiệu ứng ít tốn hiệu năng như trước đây lại tốt hơn. Nói thẳng rằng thà dùng các mẹo cũ còn hơn bật RTX rồi bị tụt khung hình. Nhắc tới việc một CPU MIPS 299MHz từng chạy được những game khổng lồ như Shadow of the Colossus, GoW2, FFXII, GT4, Black, Valkyrie Profile 2, Rouge Galaxy, Burnout 3, Jak and Daxter, Ratchet..., cùng với RE4, Metroid, Zelda trên GameCube. Kết lại bằng sự khâm phục và tôn trọng dành cho tay nghề của các nhà phát triển game truyền thống

    • Chỉ ra rằng đoạn video GoW2 được quay từ trình giả lập PCSX2 và có lẽ đã dùng upscale cùng nhiều hiệu ứng tăng cường khác. Dù sao thì GoW2 trên PS2 vẫn là một thành tựu phi thường

    • Đồng ý về PS2 nhưng cho rằng PS1 thì hiệu năng chỉ ở mức bình thường. Nhận xét PSX có hiệu năng cỡ Pentium 90~100, nhưng nếu dùng Pentium MMX với 3DFX thì có thể tương đương hoặc vượt N64. Đưa ra PSP, SGI Irix và PS2 như ví dụ cho việc CPU MIPS đạt hiệu năng tốt ở xung nhịp thấp. Giải thích rằng GPU của PS2 tách biệt với CPU R4k, đồng thời chia sẻ trải nghiệm thực tế rằng bản port Deus Ex trên PS2 kém hơn bản PC và không thể gánh trọn Unreal Engine. Nói thêm rằng PS2 thể hiện được các hiệu ứng đặc biệt rất ấn tượng, nhưng trong những bản port như Deus Ex thì kích thước bản đồ lại rất nhỏ

    • Giữ quan điểm rằng đồ họa Halo 3 trông đẹp hơn nhiều game hiện đại. Cho rằng các hiệu ứng được thêm ngày nay như blur, bloom, hay cỏ lá bị hất tung chỉ mang lại trải nghiệm thị giác tệ hơn. Với thể loại FPS tốc độ cao, cảm thấy số lượng polygon chi li không có nhiều ý nghĩa, còn độ phân giải texture thì chỉ cần đủ là được. Theo trải nghiệm cá nhân, thứ thực sự cảm nhận được chỉ là yêu cầu phần cứng ngày càng nặng nề