Friday, October 26, 2012

[Kiến thức] Nguyên lý khử răng cưa trong đồ họa P1

HÌNH ẢNH HÀNG RÀO TRƯỚC VÀ SAU KHI XỬ LÝ RĂNG CƯA
  • Khử răng cưa là gì?
Khử răng cưa (Anti Aliasing - AA) là công nghệ xử lý đồ họa rất nổi tiếng. Nhưng bạn có bao giờ thắc mắc bản chất khử răng cưa là như thế nào, có bao nhiêu loại và tác dụng của chúng như thế nào không. Bài viết sau sẽ cung cấp cho bạn cái nhìn khái quát về khử răng cưa. Cụm từ khử răng cưa có lẽ đã khá rõ ràng. Khử răng cưa là việc áp dụng các kỹ thuật xử lý hình ảnh để giảm bớt các răng cưa trên bề mặt đó, giúp đem lại hình ảnh mịn màng và đẹp hơn. Trong bài viết này chúng ta chỉ nói đến khử răng cưa đối với 3D (Three Dimensional - đồ họa 3 chiều, không phải Stereoscopic 3D tức hiệu ứng hình ảnh nổi).

Nguyên lý làm việc của khử răng cưa rất đơn giản, nhưng quá trình xử lý thì không đơn giản như vậy. Các phần cứng máy tính ngày nay (cụ thể là card đồ họa) cung cấp nhiều phương pháp xử lý răng cưa, cùng với nhiều kết quả khác nhau. Thiết lập nào là phù hợp, ưu điểm và khuyết điểm của từng loại, bạn nên chọn phương pháp nào phù hợp với sức mạnh của Card đồ họa của bạn? Bài viết này sẽ gồm 4 phần, phần đầu tiên này sẽ giới thiệu về nguyên lý làm việc cơ bản của kỹ thuật khử răng cưa.

  • Nguyên lý cơ bản của khử răng cưa
Khử răng cưa đã tồn tại từ rất lâu, từ những ngày đầu tiên của công nghệ hình ảnh 3D. Chúng ta sẽ không đi vào lịch sử của công nghệ này, mà sẽ nói về cách thức mà AA làm việc.
Như các bạn đã biết, mọi hình ảnh ta nhìn thấy trên màn hình được cấu thành từ các pixel có hình vuông, là đơn vị cơ bản nhất của hình ảnh và có màu sắc cố định. Tập hợp nhiều các pixel sẽ tạo nên hình ảnh lớn. Do đó khi thể hiện các đối tượng đồ họa như đường chéo, hình tròn, ta sẽ gặp hiện tượng “răng cưa”, hình thành bởi cạnh vuông của các pixel cơ bản đó. Ta theo dõi ví dụ sau:


HÌNH ẢNH CHƯA ĐƯỢC VÀ ĐÃ ĐƯỢC XỬ LÝ RĂNG CƯA

Khi ta vẽ một hình nào đó (đường thẳng hoặc hình tròn), card đồ họa sẽ hiểu là một hình vector có tọa độ, nhưng khi hiển thị lên màn hình thì nó sẽ hiển thị ở dạng raster, tức là hình ảnh được cấu tạo từ các pixel độc lập. Và khi phóng to hình ảnh raster đó ta sẽ thấy rất rõ các pixel. Răng cưa ở đây chính là các cạnh vuông của pixel hình thành, có hình dạng như các bậc thang. Việc khử răng cưa về cơ bản, chính là việc làm giảm đi sự khác biệt rõ ràng giữa các pixel trắng và đen, có thể do việc lấy các mẫu pixel có sắc xám đặt bên cạnh, để làm giảm đi cảm giác răng cưa của hình ảnh.

Tương tự như vậy, khi ta chơi một game 3D nào đó, hình ảnh sẽ có dạng như sau:

HÌNH ẢNH SO SÁNH KHI CHƯA KHỬ VÀ ĐÃ KHỬ RĂNG CƯA

Các cạnh của đối tượng đồ họa ở ví dụ này như hàng rào, mỏm đá… nếu không áp dụng khử răng cưa sẽ có hình dạng rất gồ ghề, khó nhìn, nhưng khi đã được áp dụng kỹ thuật khử răng cưa, hình ảnh trở nên mịn màn và đẹp mắt. Rất tuyệt đúng không. Lưu ý rằng hiện tượng răng cưa sẽ càng rõ hơn nếu độ phân giải càng thấp, đơn giản vì ở độ phân giải thấp sẽ có ít pixel để hiển thị đối tượng đồ họa đó hơn ở độ phân giải cao.

Nhưng về mặt kỹ thuật, khử răng cưa sẽ phải làm cụ thể những gì để đem lại hình ảnh mịn màng hơn? Hãy cùng tìm hiểu 2 kỹ thuật khử răng cưa lâu đời nhất: SSAA (Super Sampling AntiAliasing – Khử răng cưa siêu mẫu) và MSAA (Multi Sampling AntiAliasing – Khử răng cưa đa mẫu), cùng với cách người ta áp dụng nó vào đồ họa trong các trò chơi điện tử trên máy tính.


  • Supersampling Anti Aliasing (SSAA, tên khác là FSAA – Full Scene AA)
SSAA là phương pháp khử răng cưa ra đời đầu tiên. SSAA sử dụng sức mạnh phần cứng thuần túy của card đồ họa để xử lý chứ không áp dụng nhiều thuật toán phức tạp như các kỹ thuật về sau. Nguyên tắc rất đơn giản: ví dụ bạn chọn thiết lập 4x SSAA trong game tại độ phân giải 1366 x 768 pixel, máy tính sẽ dựng một khung hình gấp 4 lần độ phân giải gốc của game, là 2732 x 1536, sau đó thu nhỏ khung hình này xuống độ còn phân giải gốc là 1366 x 768. Kết quả đạt được là hình ảnh trở nên mịn màng, trơn tru, bao gồm tất cả các đối tượng trong game như: các cạnh, các vân bề mặt… Rất đơn giản nhưng hiệu quả, tuy nhiên để đạt được chất lượng hình tối ưu như vậy máy tính bạn phải gồng gánh một khối lượng công việc gấp 4 lần bình thường, một cái giá quá đắt để đổi lại kết quả này.

Card đồ họa sẽ xử lý răng cưa ở khung hình lớn gấp 4 lần hình gốc, sau đó resize lại kích thước ban đầu khi trả kết quả.


Thực tế đến tại thời điểm này, SSAA vẫn là phương pháp khử răng cưa cho chất lượng hình ảnh đẹp nhất, nhưng để có chất lượng tốt như vậy, mọi thành phần của máy bạn phải chạy với công suất gấp nhiều lần khối lượng công việc gốc phải làm. Kết quả là khung hình của game sẽ sụt giảm nghiêm trọng tương ứng với số mẫu khử răng cưa SSAA. Do đó, các nhà phát triển đã phát triển nhiều giải pháp hiệu quả hơn nhằm cân bằng chất lượng hình ảnh và hiệu năng.
  • Multisampling (MSAA)
Kỹ thuật khử răng cưa MSAA được phát triển nhằm thay thế cho SSAA vốn không hiệu quả về tốc độ khung hình. MSAA sẽ cố gắng cân bằng giữa hiệu năng và chất lượng hình ảnh, bằng cách chọn lọc những khử răng cưa những chỗ cần thiết và bỏ qua những chỗ không cần thiết, giúp giảm tối đa lượng răng cưa trong khả năng cho phép mà vẫn đảm bảo hiệu năng ổn định.

Nguyên tắc thực hiện là MSAA chỉ tìm các cạnh của vật thể và tiến hành khử răng cưa cho nó. Để làm việc này, card đồ họa sẽ sử dụng một thuật toán riêng gọi là “Z-test” để nhận biết các cạnh của vật thể, tiến hành lấy mẫu về màu sắc của các pixel trên cạnh này và thay thế các pixel bên cạnh bằng các pixel có màu sắc trung gian tùy vào vị trí và số mẫu được lấy của nó.

Sau đây là ví dụ minh họa cách thức làm việc của MSAA. Ở đây ta có 4 pixel cạnh nhau để thể hiện 1 đường chéo. Nếu không áp dụng các thuật toán khử răng cưa, ta có kết quả của hình bên cạnh , vì đơn giản card đồ họa sẽ lấy màu sắc ngay tại trung tâm pixel đó để thể hiện lên màn hình, bất kể tại pixel đó có bao nhiêu đối tượng.


Mỗi pixel sẽ lấy mẫu tại trung tâm của pixel đó, cho ra hình ảnh bên phải

Nếu MSAA được áp dụng (mức 4X) thì card đồ họa sẽ tiến hành lấy 4 mẫu tại mỗi pixel, các mẫu này sẽ được card đồ họa xử lý các giá trị màu sắc trung bình để cho ra pixel có màu trung gian. Theo hình bên dưới ta thấy pixel phía trên bên trái có 2 mẫu có màu xanh dương và 2 mẫu có màu xanh lục, card đồ họa sẽ xử lý pixel này có màu gồm 50% xanh dương và 50% xanh lục. Tương tự, pixel bên phải phía dưới sẽ có 25% màu xanh dương và 75% màu xanh lục. Riêng pixel góc trong cùng thì phép thử “Z-test” xác định không phải là cạnh nên MSAA sẽ không lấy mẫu, giúp giảm tải cho hệ thống.


Mỗi pixel lấy 4 mẫu thử, sau đó màu cho pixel đó sẽ trộn kết quả mà 4 mẫu đem lại

Theo đó ta có thể thấy với số mẫu càng tăng lên thì độ chính xác của việc pha màu sẽ càng cao hơn, làm giảm hiệu ứng răng cưa đi, tuy nhiên card đồ họa cũng phải chịu gánh nặng nhiều hơn và khung hình sẽ giảm nhiều hơn bình thường. Việc áp dụng thuật toán “Z-test” cũng giúp MSAA tránh việc phải lấy mẫu pixel của đối tượng khác nằm bên dưới đối tượng cần lấy mẫu.

MSAA rõ ràng đem lại hiệu quả cao hơn hẳn SSAA, cân bằng được hiệu năng và chất lượng hình ảnh. Tuy nhiên MSAA chỉ phát huy hiệu quả với cạnh biên của các đối tượng, trong khi lớp vân bề mặt (texture) của đối tượng thì không được xử lý, SSAA thì ngược lại sẽ xử lý khử răng cưa với tất cả đối tượng trên màn hình. Do đó với các đối tượng có lớp vân bề mặt trong suốt sẽ vẫn còn nguyên răng cưa nếu sử dụng MSAA.

Ví dụ dưới đây sẽ chỉ ra rõ nhược điểm của MSAA, hãy để ý kỹ các hàng rào lưới. Do lớp hàng rào này nằm trên một lớp vân bề mặt trong suốt (để nhìn thấy các đối tượng phía sau) nên không nằm trong diện xử lý của MSAA, kết quả là răng cưa khắp nơi trên hàng rào, rất xấu xí. Trong khi đó SSAA không cần phân biệt gì đều xử lý hết nên hình ảnh rất mịn màng.


Do MSAA còn những hạn chế như vậy nên cả nVIDIA và AMD đều phát triển các kỹ thuật khử răng cưa riêng của mình. Cả hai hãng đều ra sức quảng bá cho công nghệ riêng của mình và cho rằng nó ưu việt hơn công nghệ của đối thủ. Thực hư của việc này ra sao thì phần 3 của bài viết sẽ trình bày rõ hơn. Nhưng trước hết ta hãy nhìn lại hiệu quả của 2 công nghệ cổ điển này dưới sự xử lý của 2 dòng card nổi tiếng nhất là nVIDIA GeForce và AMD Radeon ra sao nhé.
  • So sánh chất lượng hình ảnh xử lý bởi card đồ họa nVIDIA và AMD
Trước tiên về kỹ thuật SSAA, nVIDIA đã gỡ bỏ tính năng này trong các driver mới do hiệu năng quá kém. Tương tự AMD cũng không hỗ trợ SSAA cho DirectX 10 và 11, chỉ hỗ trợ tập lệnh DirectX 9 mà thôi.

Do đó chúng ta sẽ sử dụng Source Engine của Valve với chế độ DirectX 9 để kiểm tra hiệu quả xử lý mà 2 dòng card này đem lại.



Hình trên phóng to lên 4 lần

Qua hình trên ta thấy hiệu quả xử lý MSAA của cả 2 dòng card đồ họa đều cho kết quả rất giống nhau. Và cũng cho thấy khi tăng số mẫu lên nhiều lần nhưng hiệu quả xử lý hình ảnh thu được lại không tương xứng, có nghĩa tăng từ 2x lên 4x thì hình ảnh rất đẹp, nhưng 4x lên 8x thì không khác nhau nhiều lắm và 8x thì kết quả giống hệt 16x mà thôi.
(còn nữa)
Nguồn: Tomshareware
Dịch: cuLong (tinhte.vn)
(Rất cám ơn bạn cuLong đã thực hiện bài dịch này)