2 điểm bởi GN⁺ 2025-01-05 | 1 bình luận | Chia sẻ qua WhatsApp
  • Các cách phổ biến để vẽ outline quanh object trong Unity gồm hiệu ứng rim, mở rộng vertex, blur buffer, thuật toán Jump Flood và phát hiện biên; mỗi cách có sự khác biệt về chất lượng, hiệu năng và chi phí thiết lập
  • Hiệu ứng rim xấp xỉ Fresnel bằng tích vô hướng giữa normal và hướng nhìn để nhấn mạnh phần rìa phía trong, nhưng kết quả khác biệt lớn giữa model tròn và model sắc cạnh
  • Mở rộng vertex tạo đường viền ngoài bằng cách phóng to mesh sao chép từ phía sau; nếu xử lý trong clip space thì có thể giữ độ dày trên màn hình ổn định hơn
  • Blur bufferthuật toán Jump Flood là cách tiếp cận vẽ silhouette vào buffer rồi mở rộng nó; mỗi cách lần lượt có thế mạnh với đường viền mềm hoặc outline rất rộng
  • Phát hiện biên tạo đường bằng cách tìm các điểm gián đoạn trong depth, normal và color buffer trên toàn màn hình, nhưng để giảm các đường không mong muốn thì cần tinh chỉnh kỹ ngưỡng và phép điều biến

Vì sao dùng render outline

  • Outline được dùng trong game để tạo phong cách hình ảnh hoặc hỗ trợ gameplay như nhấn mạnh hay chọn object
    • Sable dùng outline để tạo phong cách giống truyện tranh
    • The Last of Us dùng outline để làm nổi bật kẻ địch khi người chơi vào chế độ ẩn nấp
  • Năm kỹ thuật này có những đánh đổi khác nhau giữa hiệu năng, chất lượng hình ảnh và lượng thiết lập thủ công

Hiệu ứng rim: nhấn mạnh rìa bên trong bằng xấp xỉ Fresnel

  • Hiệu ứng rim xấp xỉ hiệu ứng Fresnel để render đường lên vành/rìa của object
  • Phép tính dựa trên tích vô hướng của vector normal đã chuẩn hóa N và hướng nhìn đã chuẩn hóa V
    • Nâng giá trị 1.0 - saturate(dot(N, V)) lên lũy thừa P để tạo cường độ hiệu ứng
    • Đây gần với một phép xấp xỉ phục vụ outline hơn là Fresnel chính xác về mặt vật lý
  • Trong Unity, shader tùy chỉnh điều khiển độ rộng, power, độ mềm và màu của outline
    • Ví dụ triển khai dùng smoothstep, lerp, _OutlineWidth, _OutlineSoftness, _OutlinePower, _OutlineColor
  • Cách này luôn xuất hiện như đường bên trong và không thấy ở viền phía ngoài object
  • Nó phù hợp với object tròn và mượt, nhưng với cube hay model phức tạp thì độ dày đường có thể không đều hoặc không giống outline

Mở rộng vertex: phóng to mesh sao chép để tạo đường bên ngoài

  • Mở rộng vertex render lại bản sao của object hoặc mesh gốc, mở rộng các đỉnh phía sau object gốc để tạo hình lớn hơn rồi render bằng màu đơn
  • Chọn hướng mở rộng

    • Chất lượng outline thay đổi đáng kể tùy vào hướng bạn di chuyển đỉnh
    • Di chuyển theo hướng vị trí vertex sẽ làm mesh như bị phồng ra
    • Trong local space, vị trí vertex có thể dùng như vector từ tâm object tới vertex
    • Nếu không chuẩn hóa, các vertex xa tâm hơn sẽ di chuyển nhiều hơn
    • Dùng normalize(positionOS) * width sẽ cho phép di chuyển đồng đều hơn trong object space
    • Di chuyển theo hướng vector normal cho kết quả tốt trên các object có cạnh mượt như sphere hay capsule
    • Với object có cạnh sắc như cube, outline có thể xuất hiện khe hở
    • Cũng có thể dùng vertex color làm hướng mở rộng
    • Đây là cách tạo custom normal rồi lưu vào kênh vertex color của mesh
    • Nếu bake normal mượt hình cầu vào vertex color cho cube thì có thể có outline tốt hơn
    • Nhược điểm là phải tạo custom normal thủ công cho từng mesh, dù có thể tự động hóa bằng script
  • Chọn không gian mở rộng

    • Trong giai đoạn vertex của shader, tọa độ đỉnh bắt đầu từ object space rồi được biến đổi qua ma trận MVP sang clip space
    • Luồng là object/model/local space → world space → camera/view space → clip space → screen space → viewport/window space
    • Nếu mở rộng trong object space, do biến đổi MVP chưa được áp dụng nên outline có thể bị méo
    • Có thể phát sinh vấn đề scaling khi áp dụng model matrix
    • Khi đi từ clip space sang screen space, phép chia phối cảnh gây ra thu nhỏ theo phối cảnh
    • Một phần chuyển động trong không gian 3D sẽ đi theo hướng camera nên không đóng góp vào độ dày outline trên màn hình
    • Nếu mở rộng trong clip space, có thể tạo outline gọn gàng với độ rộng gần như đồng nhất trên màn hình
    • Sau khi biến đổi vị trí đỉnh và normal sang clip space, chỉ sửa tọa độ x, y
    • Chia theo kích thước ngang/dọc màn hình để bù tỉ lệ khung hình
    • Nhân với w của clip space để phép chia phối cảnh sau đó không tạo hiệu ứng ròng lên độ rộng outline
    • Nhân width * 2 để đơn vị độ rộng 1 tương ứng với 1 pixel trên màn hình
    • Cách clip space cũng phụ thuộc vào normal của mesh
    • Nếu không dùng custom normal, có thể xuất hiện khe hở ở cạnh sắc
    • Nếu normal được thiết lập sai và hướng ngược lại, các đỉnh outline cũng sẽ dịch ngược và tạo khe hở
    • Có thể xem thêm trong creating an outline in clip space
  • Masking

    • Với mesh sao chép, chỉ phần outline nhô ra mới nên được hiển thị
    • Cách phổ biến là cull front-facing geometry của mesh sao chép và tạo outline bằng backface
    • Depth test dùng less than or equal to để backface chỉ hiện ở vị trí outline
    • Cách khác là dùng stencil mask để mesh sao chép không hiện phía trước mesh gốc
    • Trong trường hợp này không cần culling
    • Sẽ không tạo ra đường bên trong object
    • Khi hai object chồng lên nhau, outline chỉ hiện quanh mỗi object

Blur buffer: mở rộng silhouette bằng làm mờ

  • Cách blur buffer render silhouette của object vào một buffer, sau đó mở rộng bằng blur và dùng kết quả đó để render outline
  • Silhouette buffer

    • Bước đầu tiên là tạo silhouette buffer
    • Render từng object vào texture bằng shader xuất màu đơn
    • Nếu render mọi silhouette bằng màu trắng, ở bước cuối có thể nhân với màu outline mong muốn để tạo một màu duy nhất
    • Nếu cần màu outline khác nhau cho từng object, có thể render mỗi silhouette bằng một màu cụ thể
  • Blur pass

    • Blur pass được dùng để mở rộng silhouette buffer
    • Thường dùng box blur hoặc Gaussian blur
    • Để cải thiện hiệu năng, có thể giảm kích thước silhouette buffer trước khi blur
    • Blur pass tốn kém vì phải tính trung bình hoặc trung bình có trọng số của nhiều pixel quanh mỗi pixel
    • Nên thực hiện blur theo 2 pass
    • Với các bộ lọc tách được như box blur và Gaussian blur, có thể giảm độ phức tạp thuật toán từ O(N²) xuống O(2N)
    • Trước tiên blur theo chiều dọc, rồi blur kết quả đó theo chiều ngang để tạo kết quả cuối cùng
    • Độ rộng outline được điều khiển bằng tham số _KernelSize của blur shader
  • Outline pass và masking

    • Sau blur pass, silhouette đã làm mờ được compositing với scene gốc để tạo outline
    • Blur buffer phù hợp với outline mềm hoặc phát sáng
    • Nếu áp dụng step lên kết quả blur thì cũng có thể render outline cứng
    • Giống cách mở rộng vertex, có thể dùng stencil mask để outline chỉ render phía sau geometry
    • Nó có thể gây tác động hiệu năng lớn hơn các cách khác

Thuật toán Jump Flood: xử lý outline rất rộng

  • Cách thứ tư render outline bằng thuật toán Jump Flood
  • Ưu điểm là có thể render outline rất rộng với chi phí hiệu năng hợp lý
  • Phần giải thích chi tiết dẫn tới The Quest for Very Wide Outlines của Ben Golus

Phát hiện biên: tìm điểm gián đoạn trên toàn màn hình

  • Cách phát hiện biên vẽ đường bằng cách tìm điểm gián đoạn của scene trong một pass toàn màn hình
  • Điểm gián đoạn có thể được phát hiện từ giá trị depth buffer, vector normal, màu albedo hoặc dữ liệu khác có sẵn trong quá trình render
  • Roberts cross

    • Roberts cross operator là toán tử vi phân tính tổng bình phương khác biệt của các pixel theo đường chéo
    • Trong triển khai thực tế, nó phát hiện biên bằng cách tích chập kernel lên ảnh gốc
    • Dùng 2 kernel cho hướng x và hướng y
    • Kích thước kernel là 2 x 2
    • Chỉ cần 4 mẫu quanh một pixel
    • Đây là toán tử đơn giản nhưng vẫn có thể cho kết quả tốt
  • Sobel operator

    • Sobel operator cũng dùng 2 kernel cho hướng x và hướng y
    • Kernel Sobel có kích thước 3 x 3 và dùng 9 mẫu quanh một pixel
    • Có thể xem thêm cách Sobel filter hoạt động trong blog post on Sobel filters
  • Nguồn điểm gián đoạn

    • Cách phổ biến là tìm điểm gián đoạn trong depth texture, normal texture, color texture do render pipeline tạo cho scene
    • Pass phát hiện biên sẽ sample các texture này và dùng những toán tử đã nhắc ở trên để phát hiện điểm gián đoạn
    • Các cạnh được tạo ra theo cách này có thể xuất hiện do điểm gián đoạn được tìm thấy trong một trong ba buffer
    • Cách này có khả năng kiểm soát theo từng object thấp hơn, vì outline được áp dụng cho mọi object ghi vào các buffer đó
    • Cho phép nhiều nguồn điểm gián đoạn sẽ tạo ra hệ thống outline mạnh hơn
    • Một số cạnh được phát hiện từ cả ba nguồn
    • Nhiều cạnh chỉ được phát hiện nhờ đóng góp từ một nguồn cụ thể
    • Có thể gán trọng số và ngưỡng khác nhau cho từng nguồn để kiểm soát kết quả hình ảnh của outline
  • Điều biến phát hiện biên

    • Chỉ áp dụng toán tử phát hiện biên lên buffer gián đoạn có thể khó cho ra kết quả không có artifact
    • Depth buffer trong nhiều render pipeline được triển khai theo kiểu phi tuyến
    • Chênh lệch depth khi hai object gần camera cách nhau 1m sẽ lớn hơn khi hai object ở xa cách nhau 1m
    • Để bù điều này, có thể điều biến ngưỡng phát hiện gián đoạn theo chính depth buffer
    • Geometry ở gần cần độ gián đoạn giá trị depth lớn hơn trước khi bị phát hiện là biên
    • Các cạnh không mong muốn cũng có thể xuất hiện ở grazing angle nhỏ
    • Có thể điều biến bằng Fresnel mask tạo từ tích vô hướng giữa vector normal N và hướng nhìn V
    • Mask này cùng loại với thứ đã dùng trong cách hiệu ứng rim
    • Cũng có thể dùng các kỹ thuật điều biến khác, nhưng việc chọn phụ thuộc vào hiệu ứng hình ảnh mong muốn
  • Nguồn gián đoạn tùy chỉnh

    • Cũng có thể cung cấp nguồn gián đoạn tùy chỉnh cho outline shader
    • Đây là một render texture được tạo trực tiếp trong quá trình render và chứa dữ liệu tùy chỉnh dùng để sinh outline
    • Vì bạn có thể trực tiếp kiểm soát object nào ghi vào custom buffer, nên cũng kiểm soát được object nào sẽ nhận outline
    • Ví dụ, có thể render vertex color của mesh vào texture để tạo nguồn gián đoạn
    • Một cách khác là tô màu các mặt theo vị trí world, hoặc tạo custom buffer kết hợp thông tin depth buffer và normal buffer
    • Thông tin bổ sung có trong Linework section map

1 bình luận

 
GN⁺ 2025-01-05
Ý kiến trên Hacker News
  • Bài viết được liên kết về Jump Flood Algorithm thực sự rất hay: https://bgolus.medium.com/the-quest-for-very-wide-outlines-b...
    Thật thú vị khi nghĩ về nhiều cách tiếp cận có thể dùng ở mức pixel/texel, và ở đây signed distance field (SDF) cũng được dùng theo một cách thông minh để gánh rất nhiều việc
    Kết quả là có thể tạo đường viền với độ dày mong muốn trong thời gian tuyến tính, điều này thật ấn tượng nếu so với cách tính brute-force ở độ dày lớn
    Dù là kiểu dựa trên vector, dựa trên hàm như các công trình của Inigo Quilez, hay kiểu raster dựa trên texel/voxel như trong bài viết, tôi đều rất khuyến nghị SDF
    Houdini cũng hỗ trợ raster SDF rất tốt và có bộ công cụ SDF đã khá hoàn thiện, nên ngay cả bản miễn phí cũng đáng để thử

  • Tôi muốn một ngày nào đó đào sâu đồ họa 3D cách điệu như một dự án R&D
    Gần đây đã có khá nhiều tiến triển, nhưng có vẻ vẫn còn nhiều “trái thấp dễ hái”
    Tôi tò mò làm sao để giảm bớt chi tiết của mô hình 3D toon rendering khi camera lùi xa, và làm sao để chuyển đổi tự nhiên giữa diện mạo cách điệu hơn và ít cách điệu hơn
    Cũng là câu hỏi liệu có thể render một cách thuyết phục nền màu nước của hoạt hình 2D vẽ tay thành cảnh 3D hay không, và làm sao để animate mềm mại các nét cọ và chất liệu giấy trong screen space
    Việc thể hiện các yếu tố như khói, lửa, cây, cỏ, bùn, mưa, lông, nước trong game 3D cách điệu cũng vẫn còn là một bài toán mở
    Tôi cũng tự hỏi liệu có thể tự động hóa việc tinh chỉnh mô hình một cách tinh tế để nó trông đẹp hơn ở góc camera hiện tại, giống như hoạt hình vẽ tay, trong một game có camera tự do hay không
    Một mesh editor và background editor lý tưởng cho renderer cách điệu sẽ trông như thế nào, và liệu có thực sự cần bề mặt 3D cùng rig chính xác về mặt vật lý hay có thể định nghĩa chúng theo cách trừu tượng hơn, đó cũng là câu hỏi lớn
    Cũng thú vị khi nghĩ xem liệu có thể tạo game 2D sinh thủ tục bằng cách render pixel art retro từ các mô hình 3D đơn giản hay không, và có lẽ cũng có thể dùng phong cách hóa để làm cho chỗ giao cắt giữa hai mesh khi vô tình xuyên nhau bớt lộ hơn
    Chỉ riêng số câu hỏi này cũng đủ lấp đầy sự nghiệp của mười người, nhưng có lẽ đó lại là điều tốt

    • Với nền màu nước thì có nhiều kỹ thuật, và cá nhân tôi thấy nổi bật nhất là các công việc phía Blender dùng Blender Geometry Nodes: https://www.youtube.com/watch?v=ljjUoup2uTw
      Bộ lọc Kuwahara cũng đủ thuyết phục với đa số mọi người
      Công cụ biên tập cho renderer cách điệu thì Blender + Rigify + shape key + một chút phép màu với driver đã là quá đủ cho nhu cầu của tôi
      Texture trong Blender khá phiền, nhưng ở mức sở thích thì vẫn chịu được, và nếu cần kiểm soát non-photorealistic rendering nhiều hơn thì bản fork của DillonGoo Studio có thể tốt hơn: https://www.dillongoostudios.com/gooengine
      Tôi đã thử tạo pixel art từ mô hình 3D bằng cách render animation/mô hình ở độ phân giải thấp, kết quả ổn nhưng cần thử sai khá nhiều
      Tôi nhớ là cũng từng có các ví dụ tinh chỉnh hậu kỳ kỹ hơn để loại bỏ những thứ như hiện tượng pixel nhấp nháy
    • Không phải 3D, nhưng Stamen, một studio chuyên trực quan hóa dữ liệu và lập bản đồ, đã làm ra một renderer bản đồ màu nước rất đẹp: https://maps.stamen.com/watercolor/#14/52.3718/4.8958
    • Khó mà gọi đó là pixel art retro một cách dứt khoát, nhưng từ sau Commandos 2, họ đã làm mô hình 3D cho nhân vật, phương tiện v.v. rồi render chúng thành sprite 2D lúc chạy, sau đó trộn với sprite 2D và nền đã render sẵn
    • Khi làm một game pixel art 3D, tôi đã phải thay đổi kích thước pixel khi camera zoom out
      Độ phân giải thấp: https://x.com/Navy_Green/status/1525564342975995904
      Ổn định hóa: https://x.com/Navy_Green/status/1693820282245431540
    • Có thể xem Dead Cells như một ví dụ về việc tạo pixel art từ mô hình 3D: https://www.gamedeveloper.com/production/art-design-deep-div...
  • Tôi bắt đầu sự nghiệp với ứng dụng VR, rồi nhanh chóng chuyển sang phát triển web vì thị trường tốt hơn
    Đọc những bài như thế này lại khiến tôi nhớ lĩnh vực đó
    Công việc liên quan đến đồ họa 3D, va chạm, shader có một cảm giác kỳ diệu rất khó tìm ở lĩnh vực khác
    Về cơ bản là đang tạo ra thế giới và tái hiện vật lý, còn toán học thì thực dụng hơn nhiều và cũng xuất hiện thường xuyên hơn hẳn so với các mảng lập trình khác

    • Tôi đi theo hướng ngược lại, từ web development sang game, và đúng là nó vui và hấp dẫn như người ta vẫn nói
      Mức độ thỏa mãn trong công việc cao hơn nhiều, và độ sâu cũng như trần của chủ đề đều lớn hơn
      Tôi làm 4 năm rồi mà chưa từng đụng phải bức tường chán nản như thời làm web
      Không gì bằng việc đi làm vào thứ Hai, mở engine editor lên, nhìn thế giới nhỏ mình đang làm được render ra, rồi nghĩ xem tiếp theo nên thêm tính năng ngầu nào
    • Trong web development, người ta có thể hút toàn bộ code vào cho neural network ăn để giảm bớt phần nhàm chán, phiền phức và giữ lại những phần thú vị hơn
      Ngược lại, trong mảng technical art, nếu hút kết quả đầu ra vào cho neural network ăn thì phần thú vị và đáng làm nhất sẽ biến mất, còn lại cho công việc chuyên môn chỉ là những việc cũ vốn đã nhàm chán, thậm chí còn nhiều hơn
      Giá trị của toàn bộ bộ kỹ năng cũng giảm xuống, còn người trong ngành tech thì cư xử như thể họ hiểu công việc đó hơn chính những người làm nó, rồi chê trách rằng những người này không vui mừng khi các công ty Silicon Valley phá nát thị trường bằng cách lấy dữ liệu do người khác tạo ra mà không trả thù lao, để cho ra sản phẩm chất lượng C- với mức giá F
      Cân nhắc ưu nhược điểm thì tôi nghĩ chuyển sang web development là lựa chọn đúng
  • Trong game Astral Divide của tôi, tôi đã tạo ra một kỹ thuật không có trong bài viết
    Nó giống với Blurred Buffer, nhưng không cần blur pass mà tận dụng đường biên do anti-aliasing tạo ra
    Tôi vẽ vật thể bằng màu trắng đục trên nền đen trong suốt, rồi trong fragment shader lọc ra chỉ những pixel có kênh alpha không hoàn toàn đục hoặc không hoàn toàn trong suốt bằng một ngưỡng hardcode
    Kết quả đủ tốt, chi phí hiệu năng thấp và cách triển khai cũng cực kỳ đơn giản

    • Những mẹo kiểu đó thật sự rất đã
      Trước đây khi triển khai công cụ cắt trong phần mềm biên tập video, tôi cần tạm thời làm mờ vùng bên ngoài phần bị cắt trong lúc chỉnh sửa
      Tôi cũng không muốn thêm một blur pass đắt đỏ, nên chỉ đổi mipmap bias để texture độ phân giải thấp được render, và texture filtering đã làm hết phần việc đó gần như miễn phí
      So với hiệu ứng crop blur tương tự của PowerPoint thì gần như y hệt, thậm chí PowerPoint còn có một chút color banding mà phần triển khai của tôi thì không
      Tương tự, trong một tình huống không có anti-aliasing toàn độ phân giải, do phần lớn canvas là các hình chữ nhật 2D có thể xoay nên hiện tượng răng cưa ở cạnh khá dễ thấy
      Thay vì bật anti-aliasing toàn màn hình, tôi phóng mọi hình chữ nhật ra một chút và thu nhỏ tọa độ UV theo tỷ lệ, để mép hiển thị nằm vào bên trong hình chữ nhật 3D thật, và một lần nữa texture filtering đã giải quyết miễn phí
    • Nếu đặt các pixel đó thành màu đơn sắc thì có bị răng cưa không?
      Hay là vẫn giữ alpha và chỉ đặt màu để đường viền bị nhạt đi nhưng không bị răng cưa?
  • Ghi chú rất tuyệt
    Gần đây khi tìm các cách tiếp cận phát hiện cạnh, tôi thấy một phương pháp hay do nhà phát triển Mars First Logistics làm: https://www.reddit.com/r/Unity3D/comments/taq2ou/improving_e...

  • Bài viết cũng tuyệt vời và kết quả trông rất đẹp: https://ameye.dev/notes/rendering-outlines/edge-detection/co...
    Trông giống một khung hình trong truyện tranh Hà Lan Franka

    • Đây là bản tái hiện một khung hình trong Tintin The Black Island
  • Bài viết thực sự xuất sắc và trải nghiệm đọc cũng rất tuyệt
    Những khái niệm khó được giải thích bằng ngôn ngữ ai cũng hiểu, sơ đồ và ví dụ đều tốt, còn khoảng cách và typography khiến độ dễ đọc đạt mức rất cao
    Tôi tò mò không biết điều gì đã dẫn tới việc tạo ra theme hiện tại, và cũng tò mò liệu bạn có từng nghĩ đến việc làm một nền tảng xuất bản tập trung vào kỹ sư hay không

  • Technical art trong phần mềm rõ ràng là mối tình đầu của tôi
    Tôi mong Godot sẽ giúp pipeline compute shader cho hiệu ứng hậu xử lý trở nên dễ dùng hơn
    Cấu hình plugin compositor hiện tại có khá nhiều phần boilerplate
    Repo này là một ví dụ hay về hậu xử lý trong Godot: https://github.com/sphynx-owner/JFA_driven_motion_blur_demo

  • Tôi nhớ lần đầu thấy hiệu ứng này là trong Wacky Races trên Dreamcast
    Khi đó có rất nhiều lời quảng bá kiểu như đây là game đầu tiên đưa hiệu ứng này vào và các nhà phát triển về cơ bản đã phát minh ra nó
    Tôi không biết đó có thật hay chỉ là nói quá để quảng bá, nhưng với tư cách game thủ thì chắc chắn đó là lần đầu tôi trải nghiệm nó

    • Có lẽ vào cùng thời điểm đó rất nhiều người đã tự mình phát minh ra hiệu ứng này
      Thành thật mà nói, Dreamcast là phần cứng đầu tiên có thể xử lý hiệu ứng này theo thời gian thực với chất lượng cao
      Tôi đã phát triển hiệu ứng cel shading cho game Dreamcast Looney Tunes: Space Race, và đã làm ra nó ngay trong tuần đầu tiên sau khi nhận bộ dev kit Dreamcast
      Infogrames Sheffield, đơn vị làm Wacky Racers, đã xem phiên bản đầu của cách triển khai của chúng tôi và thêm một hiệu ứng tương tự vào game của họ
      Nó nhìn đẹp, nhưng vì được thêm vào ở giai đoạn cuối nên không được tối ưu xoay quanh hiệu ứng đó như game của chúng tôi
      Đội ngũ Jet Grind Radio cũng tự phát triển cùng một hiệu ứng và phát hành trước chúng tôi
      Thuật toán thì chính xác là như nhau, nhưng cách sử dụng thì khác: họ chủ động chấp nhận các đường viền rộng, không đều và lởm chởm, còn Sheffield và chúng tôi thì cố chống lại đặc điểm đó để hướng tới phong cách mỹ thuật đồng đều và truyền thống hơn
      Khoảng một năm sau, trong Dragons Lair 3D trên Xbox, dường như đã có người tìm ra cách chạy cel shading dựa trên phát hiện cạnh theo thời gian thực
      Chúng tôi đã thử dựng một bản thử nghiệm của cách tiếp cận đó trên Dreamcast, nhưng hiệu năng hoàn toàn không đủ để áp dụng đồng thời cho nhiều nhân vật trong khi game đang chạy
      Tôi không biết là vì Xbox mạnh hơn hay vì thuật toán thông minh hơn, nhưng kết quả thì không thể phủ nhận
      Nếu muốn làm một game trông như hoạt hình vẽ tay thật sự, cá nhân tôi vẫn thấy đó là phương pháp có chất lượng tốt nhất
      Tôi rất muốn có dịp để triển khai lại nó vào một ngày nào đó, và giờ thì hiệu năng có lẽ sẽ không còn là vấn đề nữa
    • Có vẻ nó ra mắt cùng thời điểm với Jet Set Radio, game đó cũng trên Dreamcast và cũng có hiệu ứng tương tự
      Đúng là một sự trùng hợp khá ấn tượng
  • Tôi nhất định phải bắt đầu học lập trình shader và render 3D
    Những bài viết như thế này thật sự rất hay, và tôi rất muốn có thể tự dùng shader

    • Tôi đã học bằng Shadron khoảng 8 năm trước