1 điểm bởi GN⁺ 2024-10-31 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bóng trong game 3D không tự xuất hiện như ngoài đời thực, mà là một hiệu ứng hình ảnh được thiết kế để trông thuyết phục trong giới hạn hiệu năng
  • Các game 3D thời kỳ đầu xử lý bóng bằng những kỹ thuật đơn giản nhưng nhanh như ảnh 2D, blob shadow dưới chân, texture bóng tạo lúc chạy, và hình học chiếu lên mặt phẳng
  • Khi cảnh trở nên phức tạp hơn, người ta dùng projected texture, shadow map, và stencil shadow, nhưng đi kèm là các giới hạn như artifact do độ phân giải, chiếu sai lên bề mặt và chi phí thực thi khó dự đoán
  • Chiếu sáng màn chơi tĩnh lưu các bóng lớn bằng vertex color và lightmap, và game hiện đại vẫn tiếp tục tận dụng các biến thể của kỹ thuật truyền thống như Cascaded Shadow Maps, light probes và capsule shadows
  • Bóng bằng ray tracing là hướng đi tự nhiên hơn, nhưng trong những cảnh phức tạp như Alan Wake 2, nó vẫn phụ thuộc vào lấy mẫu và denoiser nên trade-off vẫn quyết định diện mạo của hình ảnh

Bóng trong game được tạo ra khác với ngoài đời thực

  • Ngoài đời thực, bóng là kết quả của việc ánh sáng bị che khuất, và nếu một nguồn sáng đơn lẻ ở rất xa thì nhiều bóng chồng lên nhau cũng không làm khu vực đó tối hơn
  • Trong game video 3D, bóng không tồn tại một cách tự nhiên nên nhà phát triển phải trực tiếp thiết kế chúng giữa hiệu năngđộ thuyết phục về mặt hình ảnh
  • Như blob shadow trong Metal Gear Solid, trong game cũng có thể biểu diễn theo kiểu bóng càng chồng lên nhau thì càng tối

Vẽ trực tiếp bóng 2D lên màn hình

  • Cách đơn giản nhất là vẽ trước một ảnh bóng 2D lên màn hình trước khi vẽ nhân vật
  • Winter Gold và MDK dùng các ảnh bóng 2D có hoạt ảnh nhưng không scale
  • Trong những cảnh mà nhân vật đứng trước mọi thứ khác, cách đơn giản này vẫn hoạt động tốt

Blob shadow: vòng tròn tối dưới chân

  • Cách tiếp cận đơn giản nhất trong 3D là vẽ một đĩa tối bên dưới nhân vật
  • Super Mario 64 dùng blob shadow cho nhân vật, và dùng tính năng decal của phần cứng Nintendo 64 để về cơ bản clip bóng sao cho nó chỉ hiện trên mặt phẳng sàn
  • Blob shadow có thể được animate theo tình huống
    • Trong Super Mario 64, bóng nhỏ lại khi nhảy
    • Trong Metal Gear Solid, hình dạng bóng thay đổi
  • Vấn đề bóng tràn ra ngoài mép vực cũng có thể được xử lý bằng cách chiếu blob quad như một decal

Bóng phẳng dựa trên render texture

  • Nếu blob chỉ là một texture đơn giản, ta có thể render nhân vật từ trên xuống trong lúc chạy để dùng làm texture bóng
  • Crash Bandicoot: Warped cho kết quả tốt với texture bóng tạo lúc chạy
  • Soldier of Fortune cũng dùng cách này nhưng độ phân giải bóng thấp hơn nên kết quả kém hơn
  • Cách này khác với shadow mapping, vốn tạo depth map từ góc nhìn của ánh sáng
    • Ở đây, một ảnh đen/trắng được dùng làm texture
    • Khái niệm này gần với shadow map 1-bit hơn

Bóng phẳng tạo bằng hình học

  • Một cách trực quan là chiếu dẹt lên mặt phẳng vật thể đổ bóng theo hướng ngược với ánh sáng, rồi render lại cùng vật thể đó thêm một lần nữa với màu đen
  • Loại bóng này thường được giữ ở trạng thái opaque để che đi vấn đề các phần của vật thể bị vẽ chồng lên nhau
  • Trên sàn phẳng thì nó hoạt động tốt, nhưng trên địa hình phức tạp thì độ chính xác giảm đi
  • F-19 Stealth Fighter vẽ bóng máy bay trên đường băng
  • Trong các game dựa trên GLQuake cũng có thể thấy bóng phẳng
    • Kingpin: Life of Crime dùng bóng phẳng màu đen khá ổn
    • Half-Life alpha 0.52 để lộ vấn đề về độ trong suốt

Bóng phẳng trên địa hình

  • Virus của David Braben cho tàu vũ trụ đổ bóng nhìn từ trên xuống lên địa hình
  • Interstate ’76 nghiêng và kéo giãn bóng phẳng để khớp với độ dốc của mặt đất
    • Đôi khi bóng xuyên qua mặt đất
    • Nhưng nhìn chung vẫn khá thuyết phục
    • Ở màn hình render bằng phần mềm có thể thấy bóng hơi trong suốt, còn ở màn hình tăng tốc phần cứng thì bóng hiện thành màu đen hoàn toàn
  • Interstate ’76 cũng thử chiếu bóng của các vật thể lớn như cầu, nhưng kết quả không hoàn toàn thành công

Drop shadow bằng projected texture

  • Cách projected texture sẽ chiếu texture bóng vừa tạo ở trên lên nhiều loại bề mặt chứ không chỉ mặt phẳng
  • Về mặt khái niệm, nó giống như chiếu Bat-Signal từ trên trời xuống
  • Toy Story 3: The Video Game là một ví dụ của cách này, và khi bóng chồng lên bóng khác thì chúng sẽ tối hơn
  • Nó có thể tạo ra bóng rất sắc nét nhưng nhạy cảm với điều kiện bề mặt
    • Trên các bề mặt thẳng đứng, hình ảnh có thể trông kỳ lạ
    • Trong một số trường hợp, nó còn có thể xuất hiện trên trần
    • Có thể thấy các ví dụ như vậy trong video gameplay của Sonic Adventure 2: Battle
  • Vì có thể hiện xuyên qua vật thể, nó phù hợp hơn với các trường hợp đặc biệt
  • Nó cũng có thể hoạt động tốt cho bóng của cây

Shadow map: phương pháp tiêu chuẩn trên thực tế

  • Shadow map là cách game vẽ một ảnh độ sâu từ góc nhìn của ánh sáng, rồi đọc ảnh đó khi render thế giới để xác định bóng
  • Vì có thể tái sử dụng mã render thông thường nên việc triển khai tương đối dễ
  • Độ phân giải hạn chế tạo ra các artifact nổi tiếng như “Peter Panning” và “shadow acne”
  • Nhiều kỹ thuật đã được đề xuất để phân bổ nhiều vùng shadow map hơn cho các bề mặt gần camera
  • Để cho ra kết quả đẹp mắt thường vẫn cần tinh chỉnh

Stencil shadow: sắc nét nhưng tốn kém

  • Stencil shadow có thể vẽ bóng sắc nét trên mọi bề mặt, và tạo ra cảm giác film-noir mà shadow map khó mô phỏng
  • Ví dụ tiêu biểu là Doom 3, nổi tiếng với những căn phòng tối
  • Cách này chia thế giới thành không gian có ánh sáng và không gian bóng bằng shadow volume, một loại hình học vô hình
  • Game chỉ áp dụng ánh sáng lên những pixel không nằm trong shadow volume
  • Cơ chế này cần quá trình vẽ thế giới nhiều lần
    • Trước tiên vẽ toàn bộ thế giới với ambient lighting
    • Với mỗi light, vẽ shadow volume rồi vẽ lại thế giới để chỉ các pixel ngoài vùng bóng bị ảnh hưởng
    • Thiết lập stencil operation khác nhau cho front face và back face
  • Một trong những ví dụ thương mại sớm nhất có thể là Severance: Blade of Darkness, cho thấy bóng rất tốt vào năm 2001
  • Một lý do khiến ngày nay nó ít được dùng là vì chi phí thực thi khó dự đoán
    • Chi phí thay đổi rất lớn tùy shadow volume trông lớn đến mức nào trên màn hình
    • Các thuật toán tối ưu từng bị ràng buộc bởi bằng sáng chế
    • Có các liên kết liên quan cho thấy Id Software dường như đã đi đến một dạng thỏa thuận nào đó về Doom 3

Stencil shadow mềm

  • Stencil shadow không nhất thiết phải sắc cạnh
  • Silent Hill 2 render stencil shadow trên PlayStation 2 rồi làm mờ để tạo bóng mềm
  • Kết quả trên console trông gần như hoàn hảo

Bóng nhân vật đơn giản hóa

  • Có thể để một model đơn giản hơn model hiển thị trên màn hình làm nhiệm vụ đổ bóng
  • Trong Zelda trên Nintendo 64, chỉ đôi chân của Link đổ bóng còn các phần khác thì không
  • Hyperblade dùng một cách độc đáo khi người chơi trên sân hockey tương lai đổ bóng phẳng bằng các hình dạng hoạt ảnh đơn giản

Bóng trong chiếu sáng màn chơi tĩnh

  • Vertex color và lightmap là các kỹ thuật lưu trữ chiếu sáng của màn chơi, và từng là cách duy nhất để nhiều game thể hiện bóng quy mô lớn
  • Vertex color

    • Ico cho thấy ngay cả per-vertex lighting kiểu cũ cũng có thể tạo ra bóng tinh vi
    • Trên các bản đồ low-poly, ngay cả bóng sắc nét cũng có thể được biểu diễn bằng vertex color
    • Tony Hawk Pro Skater 2 cho ra kết quả ấn tượng dù chỉ dùng cách đơn giản này
  • Lightmap

    • Lightmap là cách cổ điển để lưu trữ ánh sáng và bóng của màn chơi
    • Thay vì lưu màu tại mỗi vertex, nó dùng một bộ texture thứ hai chỉ để biểu diễn ánh sáng
    • Có thể thay đổi độ phân giải theo từng khu vực, nhờ đó tạo bóng chính xác hơn ở nơi cần thiết
    • Nó dùng nhiều bộ nhớ hơn vertex color
    • Quake thường được xem là game đã phổ biến hóa lightmap

Các kỹ thuật truyền thống vẫn tiếp tục được dùng trong game hiện đại

  • Game hiện đại vẫn tiếp tục dùng các kỹ thuật đổ bóng truyền thống tùy theo tình huống
  • Cascaded Shadow Maps, một biến thể của shadow mapping, được dùng để bao phủ nhanh những khu vực rộng lớn
  • Lightmap có thể được dùng cùng các kỹ thuật khác như light probes
  • Ý tưởng dùng model nhân vật đơn giản hóa cho bóng cũng tiếp tục tồn tại
    • The Last of Us tạo bóng nhân vật mềm bằng các khối cầu kéo dài
    • Unreal Engine hỗ trợ capsule shadows cho nhân vật
  • Bóng chiếu vẫn còn được dùng
    • Hot Wheels Track Attack render shadow mesh thành texture rồi chiếu nó lên đường đua
    • Có thể xác nhận điều này qua bài viết blog của nhà phát triển và video gameplay

Bóng bằng ray tracing cũng không hoàn hảo

  • Trong các game muốn mô phỏng ánh sáng chính xác theo vật lý, bóng sẽ tự nhiên xuất hiện ở nơi không có ánh sáng
  • Không giống shadow map, cả những chi tiết hình học nhỏ cũng có thể đổ bóng chính xác
  • Các đèn lớn tự nhiên tạo ra bóng mềm, còn ánh sáng gián tiếp có thể làm sáng các góc tối
  • Rất nhiều thời gian và chi phí đã được đầu tư vào thuật toán ray tracing và phần cứng để biến mục tiêu đó thành hiện thực
  • Nhưng các cảnh trong game hiện đại thực tế quá phức tạp nên việc mô phỏng phải được xấp xỉ
    • Trong ray-traced shadows của Alan Wake 2, mỗi pixel chỉ nhận ánh sáng từ một light đơn lẻ được chọn ngẫu nhiên
    • Kết quả sau đó được đưa qua denoiser để làm mượt một cách thông minh hình ảnh đầy nhiễu
  • Bóng bằng ray tracing cũng không hoàn hảo, và chúng có diện mạo riêng tùy theo trade-off đã chọn

Lựa chọn không có bóng

  • Một số game có thể ưu tiên các yếu tố khác hơn bóng
  • Không triển khai bóng cũng có thể là một lựa chọn có chủ đích

1 bình luận

 
GN⁺ 2024-10-31
Ý kiến trên Hacker News
  • Điều tôi thích nhất là việc bóng ngoài trời có màu xanh lam
    Đây không phải ảo giác hay không khí nghệ thuật, mà là vì bầu trời xanh và vào ngày quang đãng, bóng được chiếu bởi ánh sáng phản xạ từ bầu trời nên trông có màu xanh
    Nếu nhìn dưới gầm ô tô, bạn sẽ thấy những vùng còn nhìn thấy bầu trời có bóng xanh rõ rệt, và càng vào chỗ thân xe che cả ánh sáng trời thì màu càng gần đen thật sự
    Nếu trộn bóng mặt trời xanh rõ như vậy với bóng bầu trời AO mềm và đen, bạn có thể tạo ra bóng khá đẹp với chi phí thấp
    • Đúng vậy, và nó quá tinh tế nên nhiều người thậm chí không nhận ra
      Một engine dựng hình đồ họa tốt sẽ làm như vậy. Bóng nên có sắc xanh trời nhẹ
      Vì thế nên một số ảnh chụp màn hình No Man's Sky ngày xưa từng khiến tôi bận tâm. Hình như tôi đã thấy cảnh bầu trời xanh lục nhưng bóng lại màu tím
    • Các họa sĩ thường được dạy tô bóng ngoài trời hơi tím một chút để tối đa hóa độ tương phản với tông vàng của ánh nắng
    • Tôi cũng vừa thấy điều đó trong tranh mùa đông của Monet: https://news.artnet.com/art-world/monet-the-magpie-three-fac...
  • Tôi thích biến thể đang được dùng trong các game platform của Nintendo hiện nay. Họ vẫn dùng shadow map như phần lớn game hiện đại, nhưng bóng của nhân vật người chơi được chỉnh để luôn đổ thẳng xuống ngay bên dưới, bất kể vị trí nguồn sáng thực tế
    Nó vẫn giúp người chơi ước lượng sẽ tiếp đất ở đâu sau khi nhảy như kiểu bóng đổ dạng blob cổ điển, đồng thời giữ được chất lượng hình ảnh của bóng đúng nghĩa
    Nếu tôi nhớ không nhầm, trong môi trường tối họ còn làm bóng sáng hơn cả mặt đất để nó luôn dễ nhìn
  • Tôi từng nghĩ lý do Valorant luôn trông hơi dở là vì người chơi không đổ bóng. Vài ngày trước tôi mới biết là để giảm cheat, máy chủ sẽ không gửi vị trí model của người chơi khác cho client cho tới khi nó xác định là có thể nhìn thấy
    Khi đó, nếu bóng xuất hiện rồi biến mất lúc model người chơi được nạp và gỡ, thì bạn sẽ không thể thấy bóng trừ khi chính cơ thể người chơi cũng đang hiện ra
    • Có lẽ bạn đã đọc bài tôi viết về chuyện đó. Tôi không biết Valorant có tắt bóng người chơi vì hệ thống chống gian lận hay không, nhưng chắc chắn việc chống gian lận sẽ đơn giản hơn
      Valorant cố ý đơn giản hóa việc dựng hình đến mức cực đoan để đạt FPS rất cao ngay cả trên phần cứng phổ thông. Không chỉ không có bóng động, mà còn hoàn toàn không có ánh sáng động, và cũng không có alpha transparency ở bất kỳ đâu
      Ngay cả mấy thứ như khói thường phải vẽ trong suốt cũng được cách điệu để có thể vẽ hoàn toàn đục, vì như vậy nhanh hơn. Dù không liên quan đến cheat thì vì hiệu năng họ cũng rất có thể đã bỏ bóng động rồi
    • Chẳng phải có thể sửa bằng cách để máy chủ cũng kiểm tra độ nhìn thấy của bóng sao? Tôi không rành Valorant, nhưng có vẻ việc không nấp khi nguồn sáng ở sau lưng có thể thật sự trở thành một yếu tố chiến thuật
  • Bài viết hay, có rất nhiều tham chiếu game gợi cảm giác hoài niệm. Tôi vẫn còn nhớ đã từng kinh ngạc khi thấy bóng trong Zelda trên N64 từ rất lâu trước đây
    Khi các kỹ thuật ray tracing được áp dụng, tôi nghĩ nguồn sáng diện tích và bóng mềm sẽ trở thành tiêu chuẩn. Nếu phần cứng đủ sức, hãy thử xem Quake 2 RTX để hình dung tương lai có thể trông như thế nào
    Cuối cùng, tôi đã thêm blog này vào danh sách tài liệu đồ họa của mình: https://github.com/aaron9000/c-game-resources
    • Nếu có thể tạo ra bóng đủ đẹp bằng khói và gương cùng các mẹo thị giác khác, thì vì lý do hiệu năng vẫn nên tiếp tục dùng kỹ thuật đánh lừa thị giác
  • Về đoạn “game sớm nhất phát hành với bóng stencil có lẽ là Severance: Blade of Darkness năm 2001, và bóng rất tuyệt”, thì Revolte cho PowerVR PCX1 đã dùng bóng stencil từ năm 1996
    https://www.youtube.com/watch?v=7BvtML5dIuI
    PowerVR PCX1 hỗ trợ shadow volume bằng phần cứng và triển khai hiệu quả hơn bóng stencil tiêu chuẩn. Thay vì vẽ cảnh nhiều lần, về cơ bản phần cứng thực hiện một pre-pass chỉ sâu lên bộ đệm depth/stencil on-chip để xác định pixel nhìn thấy được, sau đó kiểm tra shadow volume để biết pixel nào nằm trong bóng, rồi mới thực hiện texture sampling và shading
    Độ sáng của ánh sáng được điều chỉnh theo kết quả shadow volume, và vì chỉ shading các pixel nhìn thấy nên overdraw không lãng phí băng thông texture fetch không cần thiết
    Dreamcast, thế hệ kế thừa dựa trên PCX1, cũng có nhiều game dùng shadow volume. Cách triển khai trên Dreamcast linh hoạt hơn, cho phép volume thay đổi không chỉ ánh sáng mà cả texture được dùng, UV mapping, thậm chí cả phương trình blending của polygon trong suốt
    Tôi cũng từng thử làm bóng mềm trên DC (https://imgur.com/a/DyaqzZD phần cuối), nhưng rồi quay lại cách stencil tiêu chuẩn hơn, tức là vẽ lại bóng nhiều lần nên gánh nặng fill rate khá lớn
  • Nếu muốn xem trình độ hiện đại nhất của công nghệ chiếu sáng trong game, hãy xem demo UE 5.5 MegaLights gần đây của Epic: https://youtu.be/p9XgF3ijVRQ?si=GcU0kP33iKQh_5Ge
  • Khi có nhiều hơn một nguồn sáng, bóng chồng lên nhau thực sự sẽ tối hơn
    Nếu hai chiếc đèn chiếu vào ba người thì sẽ có sáu cái bóng. Nơi cả sáu bóng chồng lên nhau sẽ thành “đen”, hoặc chỉ còn nhận ánh sáng môi trường
    Ở những chỗ khác nơi bóng chồng ít hơn sẽ hình thành gradient độ rọi
    • Điều đó không đúng. Với mỗi nguồn sáng là một bóng, tức là ngay khi hai bóng giao nhau thì chỉ còn màu đen hoặc ánh sáng môi trường
      Nếu đang ở trong bóng của nguồn sáng A và đồng thời trong bóng của nguồn sáng B thì còn nhận ánh sáng từ đâu nữa? Chỉ còn ánh sáng môi trường, và nếu không có thì là màu đen
    • Quan sát đó hay đấy, nhưng bài viết không sai
      Nó có kèm điều kiện là “vì chỉ có một nguồn sáng và nó ở khá xa, nên bóng đơn giản chỉ là sự vắng mặt của ánh sáng”
  • Về đoạn “một số trình mô phỏng bay đời đầu vẽ bóng dẹt nhìn từ trên xuống khi đang ở trên đường băng; khi tìm hiểu tôi đã mong thấy ví dụ bóng vẫn hiện lúc đang bay nhưng không tìm được”, thì F-29 RETAL hoặc F29 Retaliator, F29 chính là ví dụ đó
    Cái bóng ấy là một chi tiết nhỏ khác đã mang lại cảm giác tốc độ khủng khiếp cho game này
    https://imgur.com/a/hOgxr7a
    https://www.mobygames.com/game/6233/f29-retaliator/
  • Khoảnh khắc về bóng gây ấn tượng nhất với tôi là khi chơi GTA IV. Tôi có một PC gaming khá mạnh, và bóng thời gian thực do đèn pha của xe người chơi tạo ra nhìn tổng thể rất tuyệt
    Khoảnh khắc tôi còn nhớ là lúc ăn trộm xe trong một con hẻm vào ban đêm. Đúng ngay khi nhân vật người chơi lên xe, cảnh sát vòng qua góc, “nhìn thấy” vụ trộm và rút súng, đồng thời đèn pha bật lên khiến cái bóng khổng lồ của viên cảnh sát đang di chuyển đổ lên bức tường gần đó
  • Bài viết hay và đọc rất thú vị
    Việc chồng bóng trong MGS không hoàn toàn sai. Đó là vì có ánh sáng môi trường, tán xạ và các hiện tượng global illumination khác
    Câu “Mirror’s Edge (2008, PC) về cơ bản là Lightmaps: The Game” vừa buồn cười vừa đúng. Ngay thời đó nó đã rất ấn tượng, và giờ nhìn lại vẫn vậy
    • Nếu muốn game vẫn đẹp sau nhiều năm thì không gì bằng global illumination được bake sẵn. Đây là game đầu tiên tôi thấy có bóng xanh ngoài đời thực vào giữa ban ngày. Tuy vậy, đó là bóng từ level geometry
      Theo tôi, hồi đó game bị đánh giá thấp một cách không công bằng. Có lẽ vì nó ngắn hơn các đối thủ cạnh tranh